diff --git a/.eslintrc.js b/.eslintrc.js index 5dbe0044b..73c32ff1e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,6 +8,7 @@ module.exports = { 'extends': 'google', 'rules': { + "linebreak-style": 0, 'require-jsdoc': [OFF, { 'require': { 'FunctionDeclaration': true, @@ -19,6 +20,8 @@ module.exports = { 'no-invalid-this': OFF, 'no-multi-str': OFF, 'semi': [ERROR, 'never'], + 'space-before-function-paren': OFF, + 'object-curly-spacing': ['error', 'always'], }, 'parserOptions': { diff --git a/.gitignore b/.gitignore index d0a646cb7..af6ef330c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ node_modules .vscode *.sqlite .nyc_output +/.idea +/src/config/tracking-uuid +*.sqlite-shm +*.sqlite-wal +*.pid diff --git a/.snyk b/.snyk new file mode 100644 index 000000000..29509a00b --- /dev/null +++ b/.snyk @@ -0,0 +1,4 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.13.5 +ignore: {} +patch: {} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b127b8313..000000000 --- a/.travis.yml +++ /dev/null @@ -1,80 +0,0 @@ -sudo: true -language: node_js -node_js: "9" -notifications: - email: false - slack: - rooms: - - secure: amP0nLt6NoTtatbxzq1DXpkyVWCmwasGVrzwtyeTEkz/A4H8rA6nAOHdBIIiIVBySaTBVpR2uar9MFWTVy7kWuzRDnBLlkjuXia0Paykv9ENf8CysW0bddhRZNz0zp3SKjjCUCPXe5bmEszQjGKCBOj2XJrkpdnYQdk0L+AqNMGcI2xhu8/RSlww6Ld7OsnkvDyVvOnriclXinZu3V3f6mY7GuXcRva/qowIE8RMGmH70DPBOkCbo7D8g6WtGXcT7sgJVsTOiqPknmQRHJcHi9d55J1fr2cRNRxOCi3pz6B8jwx9BLxKbSttEAO9r9634/Yx6GByE8JaidgVkIm6OTvi6fkCHZZWJGgyxRke/EOOjhdMHSuhVQtBX6RQ4ADRs4Ja4+g9EplXsPaxY4KI7E5jV0HuBn5M7m8RrZ2npP36kqc5/T87tDrocQVKTw5TxYiHUh2GHVw90eA5XFS5eYxT/Ts39n+Jk0CznBQsV47xcUi78OdajP8dAHu/6uC8+xTuN3A00KodH+8H0rQIq6GemMF9FbqRZDjb5ouGu5sI2aiTamKomn1XkBQkDkkrRXLbFg1xfG2XwQHuT7+rBrLqc9QSS+55hz3YDoHvs2EGoYjHLbs/5N25V24LbFJfbg1dF5PxVQ4L58NR5A23zNduElWgzsME8UDtgT9/lac= - on_success: always - on_failure: always - template: - - "Build <%{build_url}|#%{build_number}> (<%{compare_url}|%{commit}>) of %{repository_slug}@%{branch} in PR <%{pull_request_url}|#%{pull_request_number}> by %{author} %{result} in %{duration}" -stages: -- name: test - if: branch =~ /^release-.*$/ OR branch IN (develop, master) -- name: dev_deploy - if: branch = develop AND type = push -- name: pre_release_deploy - if: branch =~ /^release-.*$/ AND type = push -- name: release_deploy - if: branch = master and type = push - -jobs: - include: - - script: "npm test" - - script: "npm run postman_test" - - stage: dev_deploy - before_install: - - sudo apt-get install sshpass - script: skip - before_deploy: - - npm pack - #- export VERSION=`npm view iofogcontroller version` - deploy: - skip_cleanup: true - provider: script - script: - - sshpass -p $EDGEWORX_PASSWORD scp -o StrictHostKeyChecking=no iofogcontroller-*.tgz - $EDGEWORX_USERNAME@$EDGEWORX_IP:/var/www/vhosts/edgeworx.io/downloads/builds/iofogcontroller.tgz - on: - branch: develop - after_deploy: - - sshpass -p $DEV_MACHINE_PASSWORD ssh -o StrictHostKeyChecking=no $DEV_MACHINE_USERNAME@$DEV_MACHINE_IP - "iofog-controller stop; rm -f /iofogcontroller/*" - - sshpass -p $DEV_MACHINE_PASSWORD scp -o StrictHostKeyChecking=no iofogcontroller-*.tgz - $DEV_MACHINE_USERNAME@$DEV_MACHINE_IP:/iofogcontroller - - sshpass -p $DEV_MACHINE_PASSWORD ssh -o StrictHostKeyChecking=no $DEV_MACHINE_USERNAME@$DEV_MACHINE_IP - "npm i --unsafe-perm -g /iofogcontroller/iofogcontroller-*.tgz; iofog-controller start" - - stage: pre_release_deploy - before_install: - - sudo apt-get install sshpass - script: skip - #- npm version prerelease --preid=prerelease -m "upgrade to %s for prerelease package" - deploy: - skip_cleanup: true - provider: npm - email: "${NPM_EMAIL_ADDRESS}" - api_key: "${NPM_AUTH_TOKEN}" - tag: dev - on: - all_branches: true - after_deploy: - - sshpass -p $PREPROD_MACHINE_PASSWORD ssh -o StrictHostKeyChecking=no $PREPROD_MACHINE_USERNAME@$PREPROD_MACHINE_IP - "iofog-controller stop; npm i --unsafe-perm -g iofogcontroller@dev; iofog-controller start" - - stage: release_deploy - before_install: - - sudo apt-get install sshpass - script: skip - #- npm version patch -m "upgrade to %s for release" - deploy: - skip_cleanup: true - provider: npm - email: "${NPM_EMAIL_ADDRESS}" - api_key: "${NPM_AUTH_TOKEN}" - tag: latest - on: - branch: master - after_deploy: - - sshpass -p $PROD_MACHINE_PASSWORD ssh -o StrictHostKeyChecking=no $PROD_MACHINE_USERNAME@$PROD_MACHINE_IP - "iofog-controller stop; npm update --unsafe-perm -g iofogcontroller; iofog-controller start" diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 000000000..d88df7ef7 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,13 @@ +FROM iofog/node-alpine-x86:8.16.0 + +ARG FILENAME +ENV NODE_ENV=development + +COPY ${FILENAME} /tmp + +RUN npm i --unsafe-perm -g /tmp/${FILENAME} && \ + rm -rf /tmp/${FILENAME} && \ + iofog-controller config dev-mode --on && \ + echo "iofog-controller start && tail -f /dev/null" >> /start.sh + +CMD [ "sh", "/start.sh" ] diff --git a/Dockerfile.rel b/Dockerfile.rel new file mode 100644 index 000000000..6d35e464b --- /dev/null +++ b/Dockerfile.rel @@ -0,0 +1,11 @@ +FROM iofog/node-alpine-x86:8.16.0 + +ARG FILENAME + +COPY ${FILENAME} /tmp + +RUN npm i --unsafe-perm -g /tmp/${FILENAME} && \ + rm -rf /tmp/${FILENAME} && \ + echo "iofog-controller start && tail -f /dev/null" >> /start.sh + +CMD [ "sh", "/start.sh" ] diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..7b6f48670 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,170 @@ +trigger: + tags: + include: + - v.* + branches: + include: + - develop + - release* + paths: + exclude: + - README.md + +pr: + - master + - develop + +variables: + group: 'pipelines' + repository: 'focal-freedom-236620/controller' + primaryTag: $(Build.SourceBranchName) + releaseCandidate: 'rc1' + +jobs: + - job: Controller + pool: + vmImage: 'Ubuntu-16.04' + + steps: + - task: NodeTool@0 + inputs: + versionSpec: '8.x' + displayName: 'Install Node.js' + + - script: | + npm install + displayName: 'npm install and build' + + # When we are ready to enforce standardjs, remove redirection and remove '|| true' from the standard script in package.json + - script: | + npm run standard 2>&1 | tee standardjs.out + displayName: 'Standardjs report' + + - script: | + npm run snyk -- --project-name=ControllerCI + displayName: 'Snyk monitor' + env: + SNYK_TOKEN: $(snykToken) + + - script: | + npm test + displayName: 'unit tests' + + - script: | + echo "npm test" + displayName: 'integration tests' + + - script: | + echo "##vso[task.setvariable variable=agent.jobstatus;]canceled" + echo "##vso[task.complete result=Canceled;]DONE" + condition: eq(variables['Build.Reason'], 'PullRequest') + + - script: | + npm pack + ls iofogcontroller-*.tgz + displayName: 'npm pack for release artefact' + + - task: CopyFiles@2 + inputs: + SourceFolder: $(System.DefaultWorkingDirectory) + TargetFolder: $(Build.ArtifactStagingDirectory) + Contents: | + standardjs.out + *.tgz + Dockerfile.dev + OverWrite: true + displayName: 'artefacts to publish' + + - script: | + rm -fr iofogcontroller-*.tgz + git checkout package-lock.json + git config --global user.email "info@edgeworx.io" + git config --global user.name "Azure DevOps" + + PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g' | tr -d '[[:space:]]') + if [[ $(Build.SourceBranch) == refs/heads/release* ]]; then + npm --no-git-tag-version version $PACKAGE_VERSION-$(releaseCandidate)-b$(Build.BuildId) + else + npm --no-git-tag-version version $PACKAGE_VERSION-b$(Build.BuildId) + fi + displayName: 'npm version' + + - script: | + npm pack + displayName: 'npm pack with version containing build number' + + - bash: | + echo 'checking pack file exists..' + tar=$(ls iofogcontroller-*.tgz) + echo $tar + echo "##vso[task.setvariable variable=controller_tar]$tar" + + echo 'setting secondary tag' + echo "##vso[task.setvariable variable=secondaryTag]b-$(Build.BuildId)" + + if [[ $(Build.SourceBranch) == refs/heads/release* ]]; then + echo "##vso[task.setvariable variable=primaryTag]rc-$(Build.SourceBranchName)" + #If branch starts with ref/tags, apply latest and version tag + elif [[ $(Build.SourceBranch) == refs/tags* ]]; then + primaryTag= echo $(primaryTag) | awk '{print substr($1,2);}' + echo $primaryTag + echo "##vso[task.setvariable variable=primaryTag]$primaryTag" + echo "##vso[task.setvariable variable=secondaryTag]latest" + fi + displayName: 'setting vars' + name: setvarStep + + - task: Docker@2 + displayName: 'build docker' + inputs: + containerRegistry: 'Edgeworx GCP' + repository: $(repository) + command: 'build' + Dockerfile: "Dockerfile.dev" + arguments: --build-arg FILENAME=$(controller_tar) + tags: | + $(secondaryTag) + $(primaryTag) + + - task: Docker@2 + displayName: 'push docker' + inputs: + containerRegistry: 'Edgeworx GCP' + repository: $(repository) + command: 'push' + Dockerfile: "Dockerfile.dev" + tags: | + $(secondaryTag) + $(primaryTag) + + - script: | + echo "npm test" + displayName: 'api tests' + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'controller' + + - task: DownloadSecureFile@1 + inputs: + secureFile: 'package_cloud' + displayName: 'download package cloud token file' + + - task: UseRubyVersion@0 + inputs: + versionSpec: '>= 2.5' + addToPath: true + displayName: 'install rubygem to be used to install package_cloud cli' + + - script: | + gem install package_cloud + package_cloud -h + echo "config file..." + echo $DOWNLOADSECUREFILE_SECUREFILEPATH + displayName: 'install package_cloud cli' + + - script: | + echo $(controller_tar) + package_cloud push iofog/iofog-controller-snapshots/node/1 $(controller_tar) --config=$DOWNLOADSECUREFILE_SECUREFILEPATH + displayName: 'push to package cloud' diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..66e6ce83d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10117 @@ +{ + "name": "iofogcontroller", + "version": "1.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + }, + "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 + } + } + }, + "@octokit/rest": { + "version": "15.2.7", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.2.7.tgz", + "integrity": "sha512-uAON7+eNEs1Mfxin3ELgZ6FbJ+VR6o3mRZLrSCUl1dLEbsqnL6CcWI7uRB5cmGwaOMG3dMDneTHnRONcrEDADA==", + "dev": true, + "requires": { + "before-after-hook": "^1.1.0", + "btoa-lite": "^1.0.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lodash": "^4.17.4", + "node-fetch": "^2.1.1", + "url-template": "^2.0.8" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "@postman/tunnel-agent": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.2.tgz", + "integrity": "sha512-M4I6/yIEhLfetQxGdU8CEMeioTT/8XUKetsMRkoHjF+JtWfZ9YiHSSS7kvi9mzMeYWcNDkrC0wbLjs50C8ivDA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "@sentry/core": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.5.3.tgz", + "integrity": "sha512-off7XkyyiPXJTQ1XYPzxsY3zLHztMdK1kuIeHzyoIzu4kvs8H75eqou+fADo04JmfaMNy+OZSoW+5Aq2SZR2Ng==", + "requires": { + "@sentry/hub": "4.5.3", + "@sentry/minimal": "4.5.3", + "@sentry/types": "4.5.3", + "@sentry/utils": "4.5.3", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.5.3.tgz", + "integrity": "sha512-4b8oPVAGw/hf11CQN9J7hAk2wzD2HIZsQBl/PcB/p5r1UyHw8cibpVobJulkHJMBJMiZ/twIBGZ1G1qK3LJdhw==", + "requires": { + "@sentry/types": "4.5.3", + "@sentry/utils": "4.5.3", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.5.3.tgz", + "integrity": "sha512-W9+eEZosoDKTAJkab/bxsSRim7I4lqeWHLhmCchDimKcdmpBzC+gOCT0PywwOWRLW08LhTHfmnNSAJv6PaZiCA==", + "requires": { + "@sentry/hub": "4.5.3", + "@sentry/types": "4.5.3", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-4.5.3.tgz", + "integrity": "sha512-glBIGsoYDcUEjZWDjbkDWt87cmuO/lcxpfz4zfTq9JfIfzI3WunJqABhFDc8tQSqUdHOlWb2QKvoNPvz+0EDfg==", + "requires": { + "@sentry/core": "4.5.3", + "@sentry/hub": "4.5.3", + "@sentry/types": "4.5.3", + "@sentry/utils": "4.5.3", + "@types/stack-trace": "0.0.29", + "cookie": "0.3.1", + "https-proxy-agent": "2.2.1", + "lru_map": "0.3.3", + "lsmod": "1.0.0", + "stack-trace": "0.0.10", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.5.3.tgz", + "integrity": "sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag==" + }, + "@sentry/utils": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.5.3.tgz", + "integrity": "sha512-yIYqnuq9cd9nAUJ2MPmq++Mgy81qB2fglsDB8TiBfk2eaba79qFcKp8xg3w3EMDHZMlfmlx4fkTmZJ/+V02oWQ==", + "requires": { + "@sentry/types": "4.5.3", + "tslib": "^1.9.3" + } + }, + "@sinonjs/commons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", + "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", + "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", + "dev": true, + "requires": { + "@sinonjs/samsam": "^2 || ^3" + } + }, + "@sinonjs/samsam": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.1.1.tgz", + "integrity": "sha512-ILlwvQUwAiaVBzr3qz8oT1moM7AIUHqUc2UmEjQcH9lLe+E+BZPwUMuc9FFojMswRK4r96x5zDTTrowMLw/vuA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "array-from": "^2.1.1", + "lodash": "^4.17.11" + } + }, + "@snyk/dep-graph": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.4.1.tgz", + "integrity": "sha512-7L096NNuNggcSjyOlITaU17n0dz0J4K4WpIHvatP4K0kIbhxolil1QbJF/+xKMRpW6OuaXILiP0hp7szhkEIzQ==", + "dev": true, + "requires": { + "graphlib": "^2.1.5", + "lodash": "^4", + "source-map-support": "^0.5.9", + "tslib": "^1.9.3" + } + }, + "@snyk/gemfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", + "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==", + "dev": true + }, + "@types/chai": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", + "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", + "dev": true + }, + "@types/cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", + "dev": true + }, + "@types/geojson": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.6.tgz", + "integrity": "sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==" + }, + "@types/node": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.3.tgz", + "integrity": "sha512-DMiqG51GwES/c4ScBY0u5bDlH44+oY8AeYHjY1SGCWidD7h08o1dfHue/TGK7REmif2KiJzaUskO+Q0eaeZ2fQ==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/stack-trace": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", + "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==" + }, + "@types/superagent": { + "version": "3.8.6", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.6.tgz", + "integrity": "sha512-YQjdsk27MLb6uyXjjywGyYeuqavwV3CirHt6btBz00HkKJyowdB8gjjB1zIZxrOybDRqO8FLjTZeEtmtC2hqxA==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv-tools": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz", + "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==", + "requires": { + "array-back": "^2.0.0", + "find-replace": "^2.0.1" + } + }, + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "requires": { + "typical": "^2.6.1" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "ast-types": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.1.tgz", + "integrity": "sha512-b+EeK0WlzrSmpMw5jktWvQGxblpWnvMrV+vOp69RLjzGiHwWV0vgq75DPKtUjppKni3yWwSW8WLGV3Ch/XIWcQ==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-listener": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", + "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", + "requires": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "automatic-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/automatic-release/-/automatic-release-1.1.1.tgz", + "integrity": "sha512-1v6aujcq4HhCsx3/NmFr2bi9kyFnVON6cxb3KI1D0RtklboLJ2pAugyuszhjKmWYb/IZkUEo+tU42Qc0BusEIg==", + "dev": true, + "requires": { + "@octokit/rest": "15.2.x", + "chalk": "2.3.x", + "conventional-changelog": "1.1.x", + "conventional-github-releaser": "2.0.x", + "conventional-recommended-bump": "2.0.x", + "github-remove-all-releases": "1.0.x", + "parse-github-url": "1.0.x", + "semver": "5.5.x", + "simple-git": "1.92.x" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bdd-lazy-var": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.5.2.tgz", + "integrity": "sha512-EBFk8uOTALu8crLChd+KfhHwv+frhxqE235jcy6NY1G1weB0Gyr5H7u0zvUnr1yduzX6M1I/ERaVGdY1cd+6ZQ==", + "dev": true + }, + "before-after-hook": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.1.tgz", + "integrity": "sha512-BIjg60OP/sQvG7Q2L9Xkc77gyyFw1B4T73LIfZVQtXbutJinC1+t2HRl4qeR3EWAmY+tA6z9vpRi02q6ZXyluQ==", + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + }, + "dependencies": { + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + } + } + }, + "callsites": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-http": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.2.1.tgz", + "integrity": "sha512-S2Ezy5uSVuOYleeXppfUKtTU/xbHCZyKkwjheNJ/76SGFTUPDpDkkpVdPNgC3sAO1Ap5J5LJ+/rXdLG8EGhCDA==", + "dev": true, + "requires": { + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha1-sffn/HPSXn/R1FWtyU4UODAYK1o=" + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", + "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", + "requires": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.5" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-progress": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-2.1.1.tgz", + "integrity": "sha512-TSJw3LY9ZRSis7yYzQ7flIdtQMbacd9oYoiFphJhI4SzgmqF0zErO+uNv0lbUjk1L4AGfHQJ4OVYYzW+JV66KA==", + "requires": { + "colors": "^1.1.2", + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone-deep": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", + "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.1", + "kind-of": "^3.2.2", + "shallow-clone": "^0.1.2" + } + }, + "cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "requires": { + "is-bluebird": "^1.0.2", + "shimmer": "^1.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" + }, + "colorspace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", + "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-line-args": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz", + "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==", + "requires": { + "argv-tools": "^0.1.1", + "array-back": "^2.0.0", + "find-replace": "^2.0.1", + "lodash.camelcase": "^4.3.0", + "typical": "^2.6.1" + } + }, + "command-line-usage": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", + "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", + "requires": { + "array-back": "^2.0.0", + "chalk": "^2.4.1", + "table-layout": "^0.4.3", + "typical": "^2.6.1" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-security-policy-builder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz", + "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "conventional-changelog": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", + "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^1.6.6", + "conventional-changelog-atom": "^0.2.8", + "conventional-changelog-codemirror": "^0.3.8", + "conventional-changelog-core": "^2.0.11", + "conventional-changelog-ember": "^0.3.12", + "conventional-changelog-eslint": "^1.0.9", + "conventional-changelog-express": "^0.3.6", + "conventional-changelog-jquery": "^0.1.0", + "conventional-changelog-jscs": "^0.1.0", + "conventional-changelog-jshint": "^0.3.8", + "conventional-changelog-preset-loader": "^1.1.8" + } + }, + "conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", + "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", + "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", + "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "dev": true, + "requires": { + "conventional-changelog-writer": "^3.0.9", + "conventional-commits-parser": "^2.1.7", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.3.6", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.3.6", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "conventional-changelog-ember": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", + "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", + "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", + "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "^1.4.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "^1.4.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", + "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.6", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + } + }, + "conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "dev": true, + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "conventional-github-releaser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-github-releaser/-/conventional-github-releaser-2.0.2.tgz", + "integrity": "sha512-31dt3fbsl1nS8oODerFbUu+vY0rp99l3U+WscK4+FD5Gl9VzHuplOz1L5dFpvM3ffchxmOIaPxmrtViQbhGU+w==", + "dev": true, + "requires": { + "conventional-changelog": "^1.1.0", + "dateformat": "^3.0.0", + "gh-got": "^6.0.0", + "git-semver-tags": "^1.0.0", + "lodash.merge": "^4.0.2", + "meow": "^4.0.0", + "object-assign": "^4.0.1", + "q": "^1.4.1", + "semver": "^5.0.1", + "semver-regex": "^1.0.0", + "through2": "^2.0.0" + } + }, + "conventional-recommended-bump": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-2.0.9.tgz", + "integrity": "sha512-YE6/o+648qkX3fTNvfBsvPW3tSnbZ6ec3gF0aBahCPgyoVHU2Mw0nUAZ1h1UN65GazpORngrgRC8QCltNYHPpQ==", + "dev": true, + "requires": { + "concat-stream": "^1.6.0", + "conventional-changelog-preset-loader": "^1.1.8", + "conventional-commits-filter": "^1.1.6", + "conventional-commits-parser": "^2.1.7", + "git-raw-commits": "^1.3.6", + "git-semver-tags": "^1.3.6", + "meow": "^4.0.0", + "q": "^1.5.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-js": { + "version": "3.1.9-1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", + "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "csv-parse": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.0.1.tgz", + "integrity": "sha512-ehkwejEj05wwO7Q9JD+YSI6dNMIauHIroNU1RALrmRrqPoZIwRnfBtgq5GkU6i2RxZOJqjo3dtI1NrVSXvaimA==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "^0.10.9" + } + }, + "daemonize2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/daemonize2/-/daemonize2-0.4.2.tgz", + "integrity": "sha1-xuR0B4vs+n16gUACUUxHEvZP4G8=" + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "data-uri-to-buffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.1.tgz", + "integrity": "sha512-OkVVLrerfAKZlW2ZZ3Ve2y65jgiWqBKsTfUIAFbn8nVbPcCZg6l6gikKlEYv0kXcmzqGm6mFq/Jf2vriuEkv8A==", + "dev": true, + "requires": { + "@types/node": "^8.0.7" + }, + "dependencies": { + "@types/node": { + "version": "8.10.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.48.tgz", + "integrity": "sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw==", + "dev": true + } + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "dbug": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/dbug/-/dbug-0.4.2.tgz", + "integrity": "sha1-MrSzEF6IYQQ6b5rHVdgOVC02WzE=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dns-prefetch-control": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", + "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" + }, + "dockerfile-ast": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz", + "integrity": "sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw==", + "dev": true, + "requires": { + "vscode-languageserver-types": "^3.5.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dont-sniff-mimetype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", + "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dottie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", + "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editorconfig": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.2.tgz", + "integrity": "sha512-GWjSI19PVJAM9IZRGOS+YKI8LN+/sjkSjNyvxL5ucqP9/IqtYNXBaQ/6c/hkPNYQHyOHra2KoXZI/JVpuqwmcQ==", + "requires": { + "@types/node": "^10.11.7", + "@types/semver": "^5.5.0", + "commander": "^2.19.0", + "lru-cache": "^4.1.3", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "@types/node": { + "version": "10.12.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.26.tgz", + "integrity": "sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" + }, + "email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "dev": true + }, + "emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "requires": { + "shimmer": "^1.2.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "env-variable": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", + "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.47", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", + "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "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", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "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, + "optional": true + } + } + }, + "eslint": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.1.tgz", + "integrity": "sha512-CyUMbmsjxedx8B0mr79mNOqetvkbij/zrXnFeK2zc3pGRn3/tibjiNAv/3UxFEyfMDjh+ZqTrJrEGBFiGfD5Og==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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 + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "eslint-config-google": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.12.0.tgz", + "integrity": "sha512-SHDM3nIRCJBACjf8c/H6FvCwRmKbphESNl3gJFBNbw4KYDLCONB3ABYLXDGF+iaVP9XSTND/Q5/PuGoFkp4xbg==", + "dev": true + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + } + }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "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==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "expect-ct": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz", + "integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg==" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, + "feature-policy": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.2.0.tgz", + "integrity": "sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw==" + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "filesize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.1.2.tgz", + "integrity": "sha512-iSWteWtfNcrWQTkQw8ble2bnonSl7YJImsn9OZKpE2E4IHhXI78eASpDYUljXZZdYj36QsEKjOs/CsiDqmKMJw==" + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "find-replace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz", + "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==", + "requires": { + "array-back": "^2.0.0", + "test-value": "^3.0.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "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" + } + } + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "frameguard": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", + "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "generic-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.6.1.tgz", + "integrity": "sha512-iMmD/pY4q0+V+f8o4twE9JPeqfNuX+gJAaIPB3B0W1lFkBOtTxBo6B0HxHPgGhzQA8jego7EWopcYq/UDJO2KA==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-uri": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.3.tgz", + "integrity": "sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==", + "dev": true, + "requires": { + "data-uri-to-buffer": "2", + "debug": "4", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "dev": true, + "requires": { + "meow": "^4.0.0", + "semver": "^5.5.0" + } + }, + "git-up": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "git-url-parse": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "dev": true, + "requires": { + "git-up": "^4.0.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "github": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz", + "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=", + "dev": true, + "requires": { + "mime": "^1.2.11" + } + }, + "github-remove-all-releases": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/github-remove-all-releases/-/github-remove-all-releases-1.0.1.tgz", + "integrity": "sha1-JkBgX4lu1bPQP7+gMLt/5TBh9eM=", + "dev": true, + "requires": { + "github": "^0.2.4", + "meow": "^3.3.0", + "q": "^1.4.1" + }, + "dependencies": { + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", + "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "dev": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graphlib": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz", + "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "helmet": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.15.0.tgz", + "integrity": "sha512-j9JjtAnWJj09lqe/PEICrhuDaX30TeokXJ9tW6ZPhVH0+LMoihDeJ58CdWeTGzM66p6EiIODmgAaWfdeIWI4Gg==", + "requires": { + "dns-prefetch-control": "0.1.0", + "dont-sniff-mimetype": "1.0.0", + "expect-ct": "0.1.1", + "feature-policy": "0.2.0", + "frameguard": "3.0.0", + "helmet-crossdomain": "0.3.0", + "helmet-csp": "2.7.1", + "hide-powered-by": "1.0.0", + "hpkp": "2.0.0", + "hsts": "2.1.0", + "ienoopen": "1.0.0", + "nocache": "2.0.0", + "referrer-policy": "1.1.0", + "x-xss-protection": "1.1.0" + } + }, + "helmet-crossdomain": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz", + "integrity": "sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg==" + }, + "helmet-csp": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.1.tgz", + "integrity": "sha512-sCHwywg4daQ2mY0YYwXSZRsgcCeerUwxMwNixGA7aMLkVmPTYBl7gJoZDHOZyXkqPrtuDT3s2B1A+RLI7WxSdQ==", + "requires": { + "camelize": "1.0.0", + "content-security-policy-builder": "2.0.0", + "dasherize": "2.0.0", + "platform": "1.3.5" + } + }, + "hide-powered-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", + "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", + "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha1-qVPKZwB4Zp3eFCzomUAbnW6F07Q=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + }, + "dependencies": { + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + } + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=" + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "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==" + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ienoopen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", + "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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" + }, + "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 + } + } + } + } + }, + "intel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", + "integrity": "sha1-EdEUfraz9Fgr31M3s31UFYTp5B4=", + "requires": { + "chalk": "^1.1.0", + "dbug": "~0.4.2", + "stack-trace": "~0.0.9", + "strftime": "~0.10.0", + "symbol": "~0.3.1", + "utcstring": "~0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "dev": true, + "requires": { + "ip-regex": "^2.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-ssh": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", + "dev": true, + "requires": { + "protocols": "^1.1.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "js-beautify": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.8.9.tgz", + "integrity": "sha512-MwPmLywK9RSX0SPsUJjN7i+RQY9w/yC17Lbrq9ViEefpLRgqAR2BgrMN2AbifkUuhDV8tRauLhLda/9+bE0YQA==", + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.2", + "glob": "^7.1.3", + "mkdirp": "~0.5.0", + "nopt": "~4.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonschema": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", + "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", + "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "jszip": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", + "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "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" + } + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha1-kVWhgTbYprJhXl8W+aJEira1Duo=" + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0" + } + }, + "logform": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", + "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "lolex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", + "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, + "lsmod": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", + "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" + }, + "macos-release": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", + "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", + "dev": true + }, + "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" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "marked": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + }, + "mime-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.0.tgz", + "integrity": "sha1-4p+IkeKE14JwJG8AUNaDS9u+EzI=", + "requires": { + "charset": "^1.0.0" + } + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "requires": { + "mime-db": "~1.36.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", + "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nconf": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", + "requires": { + "async": "^1.4.0", + "ini": "^1.3.0", + "secure-keys": "^1.0.0", + "yargs": "^3.19.0" + } + }, + "needle": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "negotiator": { + "version": "0.6.1", + "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 + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true + }, + "newman": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/newman/-/newman-4.5.0.tgz", + "integrity": "sha512-JXuxK9zHXFyufnI/BjA8uvI6/hkMbg6QnoSVo7J7lNcEsrJg74n/9ropV2lse+Tg2vYxwqEYUfkkEhdxkcrqgQ==", + "requires": { + "async": "2.6.2", + "chardet": "0.7.0", + "cli-progress": "2.1.1", + "cli-table3": "0.5.1", + "colors": "1.3.3", + "commander": "2.20.0", + "csv-parse": "4.0.1", + "eventemitter3": "3.1.2", + "filesize": "4.1.2", + "lodash": "4.17.11", + "mkdirp": "0.5.1", + "postman-collection": "3.4.8", + "postman-collection-transformer": "3.1.0", + "postman-request": "2.88.1-postman.10", + "postman-runtime": "7.14.0", + "pretty-ms": "5.0.0", + "semver": "6.0.0", + "serialised-error": "1.1.3", + "word-wrap": "1.2.3", + "xmlbuilder": "13.0.1" + }, + "dependencies": { + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" + } + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "nise": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", + "integrity": "sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.1.0", + "just-extend": "^4.0.2", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "nocache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", + "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, + "node-oauth1": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.2.2.tgz", + "integrity": "sha512-f2XC7Y68wJq6+s+LJn/yUq5Gqg9Y9zwIz2zY6vUyS8xzawnSWhXKOMJepLwvptjPl8IjVxtWh7iI9dbdKGSw4g==", + "requires": { + "crypto-js": "3.1.9-1" + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nodemailer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-5.1.1.tgz", + "integrity": "sha512-hKGCoeNdFL2W7S76J/Oucbw0/qRlfG815tENdhzcqTpSjKgAN91mFOqU2lQUflRRxFM7iZvCyaFcAR9noc/CqQ==" + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-smtp-transport": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.4.tgz", + "integrity": "sha1-DYmvAZoUSkgP2OzJmZfZ+DjxNoU=", + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=" + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + }, + "npm-packlist": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.3.0.tgz", + "integrity": "sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nyc": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", + "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^3.0.1", + "convert-source-map": "^1.6.0", + "find-cache-dir": "^2.0.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.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.1", + "make-dir": "^1.3.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.1.0", + "uuid": "^3.3.2", + "yargs": "^12.0.5", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caching-transform": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^1.3.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "camelcase": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "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" + } + }, + "graceful-fs": { + "version": "4.1.15", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "hasha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "semver": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", + "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "supports-color": "^6.0.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "^4.1.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "bundled": true, + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, + "uglify-js": { + "version": "3.4.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "12.0.5", + "bundled": true, + "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" + } + }, + "yargs-parser": { + "version": "11.1.1", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", + "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "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==" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pac-proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz", + "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==", + "dev": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parent-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" + }, + "parse-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "parse-url": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "normalize-url": "^3.3.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==" + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "requires": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "^4.17.10" + } + } + } + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postman-collection": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-3.4.8.tgz", + "integrity": "sha512-QOR6hTnBkQam8x1Y1UELJXZCXRzuctFbk5Yd6WDJvdy3xfPHipad10hJQXZTQB4hZsS/sjNSRKPdLtI6FBZ1rg==", + "requires": { + "escape-html": "1.0.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.4.24", + "liquid-json": "0.3.1", + "lodash": "4.17.11", + "marked": "0.6.2", + "mime-format": "2.0.0", + "mime-types": "2.1.24", + "postman-url-encoder": "1.0.2", + "sanitize-html": "1.20.1", + "semver": "6.0.0", + "uuid": "3.3.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" + } + } + }, + "postman-collection-transformer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-3.1.0.tgz", + "integrity": "sha512-VIKteElep2OhEmG4sbN9jAJFEXTxh/1biX2a1AGKi8TBnCBuZLjHbBO+DwHIlHKmeygj/SKEv+QJdoE4eZmh9A==", + "requires": { + "commander": "2.20.0", + "inherits": "2.0.3", + "intel": "1.2.0", + "lodash": "4.17.11", + "semver": "6.0.0", + "strip-json-comments": "3.0.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + } + } + }, + "postman-request": { + "version": "2.88.1-postman.10", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.10.tgz", + "integrity": "sha512-bIKdai9VqM6HGKPGJYqRCEnEPM4IZ4WyX1febqAw/124++kFRT+gjRZFG0QTtTs8CulQbU7jwictFNMoxkZavw==", + "requires": { + "@postman/tunnel-agent": "^0.6.2", + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "postman-url-encoder": "1.0.1", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "tough-cookie": "~2.5.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "postman-url-encoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-1.0.1.tgz", + "integrity": "sha1-oJSkLpQV/wu/3ODqqOYBHUSe6Dw=" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "postman-runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.14.0.tgz", + "integrity": "sha512-XYl9C7ERp2TwC7JFFuzda5ZjbHMtor5yYau8r6HympZo7FXNEXM6fl/h5g3axk+/jWUVuEU7uhVTlffqzh1WQQ==", + "requires": { + "async": "2.6.2", + "aws4": "1.8.0", + "btoa": "1.2.1", + "crypto-js": "3.1.9-1", + "eventemitter3": "3.1.2", + "http-reasons": "0.1.0", + "httpntlm": "1.7.6", + "inherits": "2.0.3", + "lodash": "4.17.11", + "node-oauth1": "1.2.2", + "performance-now": "2.1.0", + "postman-collection": "3.4.8", + "postman-request": "2.88.1-postman.10", + "postman-sandbox": "3.2.7", + "postman-url-encoder": "1.0.2", + "resolve-from": "5.0.0", + "serialised-error": "1.1.3", + "tough-cookie": "3.0.1", + "uuid": "3.3.2" + }, + "dependencies": { + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "httpntlm": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.6.tgz", + "integrity": "sha1-aZHoNSg2AH1nEBuD247Q+RX5BtA=", + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + } + } + }, + "postman-sandbox": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-3.2.7.tgz", + "integrity": "sha512-S9lpV9ImK8OmaUYcn4HEaxkE7MynoPaXwQTi4GEIX2NooE38na7j5a+POAOPMBZKwHTF2vEXpD/N4Pwn3EHBhA==", + "requires": { + "inherits": "2.0.3", + "lodash": "4.17.11", + "tough-cookie": "3.0.1", + "uuid": "3.3.2", + "uvm": "1.7.5" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "postman-url-encoder": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-1.0.2.tgz", + "integrity": "sha512-PBGPIJnm9dqyUST/oX9mxTxT5seqWS4AdzAhGt4judiOh7xT4leTv2CLoGtHXUCHFuLLp9h9wDGAMN7Cm0Znyw==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-ms": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.0.0.tgz", + "integrity": "sha512-94VRYjL9k33RzfKiGokPBPpsmloBYSf5Ri+Pq19zlsEcUKFob+admeXr5eFDRuPjFmEOcjJvPGdillYOJyvZ7Q==", + "requires": { + "parse-ms": "^2.1.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "protocols": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "proxy-agent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.0.tgz", + "integrity": "sha512-IkbZL4ClW3wwBL/ABFD2zJ8iP84CY0uKMvBPk/OceQe/cEjrxzN1pMHsLwhbzUoRhG9QbSxYC+Z7LBkTiBNvrA==", + "dev": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "pac-proxy-agent": "^3.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", + "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "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", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=" + }, + "referrer-policy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", + "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "request-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz", + "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "requires": { + "lodash": "^4.17.11" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "retry-as-promised": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.1.0.tgz", + "integrity": "sha512-g6T9rr5G4AfRVJZcnCbbmpcTDw8NJSnmVrvrJ9Pm9OWAzigocIcFp4+ItwHGJIr0wx0YzwlCJOvvEKQrZhzPOw==", + "requires": { + "any-promise": "^1.3.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-html": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.1.tgz", + "integrity": "sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA==", + "requires": { + "chalk": "^2.4.1", + "htmlparser2": "^3.10.0", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.mergewith": "^4.6.1", + "postcss": "^7.0.5", + "srcset": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "sequelize": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-4.42.0.tgz", + "integrity": "sha512-qxAYnX4rcv7PbNtEidb56REpxNJCdbN0qyk1jb3+e6sE7OrmS0nYMU+MFVbNTJtZfSpOEEL1TX0TkMw+wzZBxg==", + "requires": { + "bluebird": "^3.5.0", + "cls-bluebird": "^2.1.0", + "debug": "^3.1.0", + "depd": "^1.1.0", + "dottie": "^2.0.0", + "generic-pool": "^3.4.0", + "inflection": "1.12.0", + "lodash": "^4.17.1", + "moment": "^2.20.0", + "moment-timezone": "^0.5.14", + "retry-as-promised": "^2.3.2", + "semver": "^5.5.0", + "terraformer-wkt-parser": "^1.1.2", + "toposort-class": "^1.0.1", + "uuid": "^3.2.1", + "validator": "^10.4.0", + "wkx": "^0.4.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "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==" + }, + "retry-as-promised": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.3.2.tgz", + "integrity": "sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c=", + "requires": { + "bluebird": "^3.4.6", + "debug": "^2.6.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + } + } + }, + "sequelize-cli": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.4.0.tgz", + "integrity": "sha512-4Gvl0yH0T3hhSdiiOci3+IKIfVG9x2os0hGWsbfa8QuyGgk9mZOqgTBnSCRtuxsdAyzUix9kfcTnfNolVNtprg==", + "requires": { + "bluebird": "^3.5.3", + "cli-color": "^1.4.0", + "fs-extra": "^7.0.1", + "js-beautify": "^1.8.8", + "lodash": "^4.17.5", + "resolve": "^1.5.0", + "umzug": "^2.1.0", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "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" + } + } + } + }, + "serialised-error": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", + "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", + "requires": { + "object-hash": "^1.1.2", + "stack-trace": "0.0.9", + "uuid": "^3.0.0" + }, + "dependencies": { + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "^1.0.2" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-git": { + "version": "1.92.0", + "resolved": "http://registry.npmjs.org/simple-git/-/simple-git-1.92.0.tgz", + "integrity": "sha1-YGFGjrfRnwFBB4/HQuYkV+kQ9Uc=", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sinon": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.3.tgz", + "integrity": "sha512-i6j7sqcLEqTYqUcMV327waI745VASvYuSuQMCjbAwlpAeuCgKZ3LtrjDxAbu+GjNQR0FEDpywtwGCIh8GicNyg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "@sinonjs/formatio": "^3.1.0", + "@sinonjs/samsam": "^3.0.2", + "diff": "^3.5.0", + "lolex": "^3.0.0", + "nise": "^1.4.8", + "supports-color": "^5.5.0" + } + }, + "sinon-chai": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.3.0.tgz", + "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "dev": true + }, + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } + }, + "snyk": { + "version": "1.167.2", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.167.2.tgz", + "integrity": "sha512-mWH5cBtTjOomsOLQV6ohCogqPi2XJL2ZxwHoRlUSBaLUdNuK9p5bz3bz+3zfxmrWdgnMi0EHEX3hm0yXdcR2fQ==", + "dev": true, + "requires": { + "@snyk/dep-graph": "1.4.1", + "@snyk/gemfile": "1.2.0", + "abbrev": "^1.1.1", + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.2", + "configstore": "^3.1.2", + "debug": "^3.1.0", + "diff": "^4.0.1", + "git-url-parse": "11.1.2", + "glob": "^7.1.3", + "inquirer": "^6.2.2", + "lodash": "^4.17.11", + "needle": "^2.2.4", + "opn": "^5.5.0", + "os-name": "^3.0.0", + "proxy-agent": "^3.1.0", + "proxy-from-env": "^1.0.0", + "semver": "^6.0.0", + "snyk-config": "^2.2.1", + "snyk-docker-plugin": "1.24.2", + "snyk-go-plugin": "1.7.2", + "snyk-gradle-plugin": "2.10.4", + "snyk-module": "1.9.1", + "snyk-mvn-plugin": "2.3.0", + "snyk-nodejs-lockfile-parser": "1.13.0", + "snyk-nuget-plugin": "1.10.0", + "snyk-php-plugin": "1.5.3", + "snyk-policy": "1.13.5", + "snyk-python-plugin": "1.10.1", + "snyk-resolve": "1.0.1", + "snyk-resolve-deps": "4.0.3", + "snyk-sbt-plugin": "2.2.0", + "snyk-tree": "^1.0.0", + "snyk-try-require": "1.3.1", + "source-map-support": "^0.5.11", + "tempfile": "^2.0.0", + "then-fs": "^2.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.1.0.tgz", + "integrity": "sha512-2VY/iCUZTDLD/qxptS3Zn3c6k2MeIbYqjRXqM8T5oC7N2mMjh3xIU3oYru6cHGbldFa9h5i8N0fP65UaUqrMWA==", + "dev": true, + "requires": { + "type-fest": "^0.3.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" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "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 + }, + "semver": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", + "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "dev": true + } + } + }, + "snyk-config": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.1.tgz", + "integrity": "sha512-eCsFKHHE4J2DpD/1NzAtCmkmVDK310OXRtmoW0RlLnld1ESprJ5A/QRJ5Zxx1JbA8gjuwERY5vfUFA8lEJeopA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash": "^4.17.11", + "nconf": "^0.10.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "snyk-docker-plugin": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.24.2.tgz", + "integrity": "sha512-0tUrfh2O/WdO6SAHIq27AgGM/RKTQK3VPcY2XTaDmy0ObI6IfztEXN5Ysolw9KyEIZcs0qoWyCx6QDZlb1/sNQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "dockerfile-ast": "0.0.16", + "semver": "^6.1.0", + "tslib": "^1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "semver": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", + "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "dev": true + } + } + }, + "snyk-go-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.0.2.tgz", + "integrity": "sha512-vQfrPecK3j5JYwEI5lO0Gsy+QvFN2dHusGecmiXYpQPiyn1QLnYFTBxFIu94buxlxdKtujYkR/lA4dB82LJ8Lw==", + "dev": true, + "requires": { + "toml": "^3.0.0", + "tslib": "^1.9.3" + } + }, + "snyk-go-plugin": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.7.2.tgz", + "integrity": "sha512-PDYZplpMVS3G5mQWDJakje4h2QibJSfwuNNaKMjBYFi+i8YoO6SG//G57Pdkz0uJ5iz5sEldfEtQNN2xN/zlIw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "graphlib": "^2.1.1", + "snyk-go-parser": "1.0.2", + "tmp": "0.0.33" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "snyk-gradle-plugin": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.10.4.tgz", + "integrity": "sha512-73vK4cgNb7Geqmx9voliQ+IMN1Om6XZAFAbnFKOthZByuPlQ68IBG9LhwMva4Hc5CXdsGN6RdlwqPU5Aa1DnoQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "clone-deep": "^0.3.0", + "tmp": "0.0.33", + "tslib": "^1.9.3" + }, + "dependencies": { + "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" + } + } + } + }, + "snyk-module": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", + "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "hosted-git-info": "^2.7.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "snyk-mvn-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.3.0.tgz", + "integrity": "sha512-LOSiJu+XUPVqKCXcnQPLhlyTGm3ikDwjvYw5fpiEnvjMWkMDd8IfzZqulqreebJDmadUpP7Cn0fabfx7TszqxA==", + "dev": true, + "requires": { + "lodash": "4.17.11", + "tslib": "1.9.3" + } + }, + "snyk-nodejs-lockfile-parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.13.0.tgz", + "integrity": "sha512-fC1o9SJ+iM+IYeBUYtvCIYh005WAvWMzqhEH3hI4zGPdCYQqGYIfVpXf29aCOKoorkTR345k5g6Etx54+BbrTQ==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.0.2", + "graphlib": "^2.1.5", + "lodash": "^4.17.11", + "source-map-support": "^0.5.7", + "tslib": "^1.9.3", + "uuid": "^3.3.2" + } + }, + "snyk-nuget-plugin": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.10.0.tgz", + "integrity": "sha512-V69AIWcHw4KrgEFC8kNWoqHo54wZkWGfqyVv+kJjQxARWYmQqV4YL/vxfLAoZ7mDsNXgjPn5M4ZEaeHFCeWcyA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "jszip": "^3.1.5", + "lodash": "^4.17.10", + "snyk-paket-parser": "1.4.3", + "xml2js": "^0.4.17" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "snyk-paket-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.4.3.tgz", + "integrity": "sha512-6m736zGVoeT/zS9KEtlmqTSPEPjAfLe8iYoQ3AwbyxDhzuLY49lTaV67MyZtGwjhi1x4KBe+XOgeWwyf6Avf/A==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "snyk-php-plugin": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.3.tgz", + "integrity": "sha512-iZB3UpleLbeOL1D1bNLMFfh5hSflbQnepxmtXxXSD3S+euAhqJTZz/26QrsUIAtLQ2eHl3LfAXGTp6131tWyGw==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash": "^4.17.5" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "snyk-policy": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", + "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "email-validator": "^2.0.4", + "js-yaml": "^3.13.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.0.0", + "snyk-module": "^1.9.1", + "snyk-resolve": "^1.0.1", + "snyk-try-require": "^1.3.1", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "semver": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", + "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "dev": true + } + } + }, + "snyk-python-plugin": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.10.1.tgz", + "integrity": "sha512-1UAYRBTgnHgzPyX/PUAh9Wb9Udp6Q162IAfftK9uhN1o+KVN3RzsP/jeR0MhOXqECu7f4eABUv4rh+bn25/3hw==", + "dev": true, + "requires": { + "tmp": "0.0.33" + } + }, + "snyk-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", + "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "snyk-resolve-deps": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.0.3.tgz", + "integrity": "sha512-GP3VBrkz1iDDw2q8ftTqppHqzIAxmsUIoXR+FRWDKcipkKHXHJyUmtEo11QVT5fNRV0D0RCsssk2S5CTxTCu6A==", + "dev": true, + "requires": { + "ansicolors": "^0.3.2", + "debug": "^3.2.5", + "lodash.assign": "^4.2.0", + "lodash.assignin": "^4.2.0", + "lodash.clone": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lru-cache": "^4.0.0", + "semver": "^5.5.1", + "snyk-module": "^1.6.0", + "snyk-resolve": "^1.0.0", + "snyk-tree": "^1.0.0", + "snyk-try-require": "^1.1.1", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "snyk-sbt-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.2.0.tgz", + "integrity": "sha512-me/Su5J0ZVoOag3SrbfezHD6kkFymovGhZ0eK2P3T8607iWAOeGVEIbOXAAwMLSFmv8TpihQeWmnRgrCvPLfKw==", + "dev": true + }, + "snyk-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", + "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", + "dev": true, + "requires": { + "archy": "^1.0.0" + } + }, + "snyk-try-require": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", + "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.clonedeep": "^4.3.0", + "lru-cache": "^4.0.0", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "socks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "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", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sqlite3": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.6.tgz", + "integrity": "sha512-EqBXxHdKiwvNMRCgml86VTL5TK1i0IKiumnfxykX0gh6H6jaKijAXvE9O1N7+omfNSawR2fOmIyJZcfe8HYWpw==", + "requires": { + "nan": "~2.10.0", + "node-pre-gyp": "^0.11.0", + "request": "^2.87.0" + } + }, + "srcset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", + "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", + "requires": { + "array-uniq": "^1.0.2", + "number-is-nan": "^1.0.0" + } + }, + "sshpk": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", + "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "dev": true, + "requires": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + } + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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 + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "dev": true, + "requires": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha1-gnfzy+5JpNqrz9tOL0qbXp8snwA=", + "requires": { + "bluebird": "^2.6.2" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, + "strftime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", + "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" + }, + "string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.3.1.tgz", + "integrity": "sha1-tvmpANSWpX8CQI8iGYwQndoGMEE=" + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "table": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", + "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "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" + } + } + } + }, + "table-layout": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.4.tgz", + "integrity": "sha512-uNaR3SRMJwfdp9OUr36eyEi6LLsbcTqTO/hfTsNviKsNeyMBPICJCC7QXRF3+07bAP6FRwA8rczJPBqXDc0CkQ==", + "requires": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + } + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "terraformer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.9.tgz", + "integrity": "sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag==", + "requires": { + "@types/geojson": "^1.0.0" + } + }, + "terraformer-wkt-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz", + "integrity": "sha512-QU3iA54St5lF8Za1jg1oj4NYc8sn5tCZ08aNSWDeGzrsaV48eZk1iAVWasxhNspYBoCqdHuoot1pUTUrE1AJ4w==", + "requires": { + "@types/geojson": "^1.0.0", + "terraformer": "~1.0.5" + } + }, + "test-value": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", + "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", + "requires": { + "array-back": "^2.0.0", + "typical": "^2.6.1" + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "then-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", + "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "dev": true, + "requires": { + "promise": ">=3.2 <8" + } + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "umzug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", + "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", + "requires": { + "babel-runtime": "^6.23.0", + "bluebird": "^3.5.3" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "utcstring": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/utcstring/-/utcstring-0.1.0.tgz", + "integrity": "sha1-Qw/VEKt/yVtdWRDJAteYgMIIQ2s=" + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "uvm": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-1.7.5.tgz", + "integrity": "sha512-QteSdkvRFbrSozInbNwRy5c8RUlxyyZU32EFCVHBDDPprCJ/gAAbWwTTAvyqC8+7uhxGihocAtcn28YBrpObZg==", + "requires": { + "flatted": "2.0.0", + "inherits": "2.0.3", + "lodash": "4.17.11", + "uuid": "3.3.2" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "windows-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "dev": true, + "requires": { + "execa": "^1.0.0" + } + }, + "winston": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", + "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==", + "requires": { + "async": "^2.6.0", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^1.9.1", + "one-time": "0.0.4", + "readable-stream": "^2.3.6", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.2.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==", + "requires": { + "lodash": "^4.17.10" + } + } + } + }, + "winston-transport": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", + "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + } + }, + "wkx": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.6.tgz", + "integrity": "sha512-LHxXlzRCYQXA9ZHgs8r7Gafh0gVOE8o3QmudM1PIkOdkXXjW7Thcl+gb2P2dRuKgW8cqkitCRZkkjtmWzpHi7A==", + "requires": { + "@types/node": "*" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "requires": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "x-xss-protection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz", + "integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg==" + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.1.tgz", + "integrity": "sha512-qdGT2O3+OWTVY5HqESkgbOd8NE5MWUIuKxXd9PNQOhVC83SRfdje+Ku4vjFCaEpL6JZqlTOcKN33TlCEbApNcA==" + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, + "xss-clean": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/xss-clean/-/xss-clean-0.1.1.tgz", + "integrity": "sha1-07poTYXM1SBUlj0BrWqzbWYtsaU=", + "requires": { + "xss-filters": "1.2.6" + } + }, + "xss-filters": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz", + "integrity": "sha1-aLOQicsd/4udvIiUhIObL1B/XFU=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + } + } + } + } +} diff --git a/package.json b/package.json index e6ef102ae..69ff6614d 100644 --- a/package.json +++ b/package.json @@ -1,112 +1,117 @@ { - "name": "iofogcontroller", - "version": "1.0.37", - "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.", - "main": "./src/main.js", - "author": "Saeid Baghbidi", - "contributors": [ - "Kilton Hopkins ", - "Saeid Baghbidi", - "Pavel Kazlou", - "Egor Krylovich", - "Iryna Laryionava", - "Maryna Lipnitskaya", - "Dmitriy Kudasov", - "Dmitry Stolbunov", - "Darya Busel", - "Alexander Shpak", - "Kate Lukashick", - "Eugene Pankov", - "Maksim Chepelev", - "Tetiana Yatsiuk", - "Sergey Valevich" - ], - "license": { - "type": "EPL-2.0", - "url": "https://www.eclipse.org/legal/epl-v20.html" - }, - "bugs": { - "email": "edgemaster@iofog.org" - }, - "homepage": "https://www.iofog.org", - "repository": { - "type": "git", - "url": "https://github.com/ioFog/Controller" - }, - "scripts": { - "prestart": "npm run lint", - "start": "node scripts/scripts-api.js start", - "prestart-dev": "npm run lint", - "start-dev": "node scripts/scripts-api.js start-dev", - "prebuild": "npm run lint", - "build": "node scripts/scripts-api.js init", - "preuninstall": "node scripts/scripts-api.js preuninstall", - "postinstall": "node scripts/scripts-api.js postinstall", - "lint": "./node_modules/.bin/eslint \"**/*.js\"", - "automatic-release": "automatic-release", - "pretest": "npm run lint", - "test": "node scripts/scripts-api.js test", - "prepostman_test": "npm run lint", - "postman_test": "node scripts/scripts-api.js postmantest", - "precli-tests": "npm run lint", - "cli-tests": "node scripts/scripts-api.js cli-tests", - "precoverage": "npm run lint", - "coverage": "node scripts/scripts-api.js coverage", - "prepare": "npm run lint" - }, - "preferGlobal": true, - "bin": { - "iofog-controller": "src/main.js" - }, - "dependencies": { - "@sentry/node": "4.5.3", - "body-parser": "1.18.3", - "child_process": "1.0.2", - "command-line-args": "5.0.2", - "command-line-usage": "5.0.5", - "continuation-local-storage": "3.2.1", - "cookie-parser": "1.4.3", - "daemonize2": "0.4.2", - "ejs": "2.6.1", - "express": "4.16.4", - "formidable": "1.2.1", - "fs": "0.0.1-security", - "ftp": "0.3.10", - "helmet": "3.15.0", - "jsonschema": "1.2.4", - "moment": "2.24.0", - "morgan": "1.9.1", - "nconf": "0.10.0", - "newman": "4.3.1", - "nodemailer": "5.1.1", - "nodemailer-smtp-transport": "2.7.4", - "os": "0.1.1", - "path": "0.12.7", - "portscanner": "2.2.0", - "qs": "6.6.0", - "retry-as-promised": "3.1.0", - "semver": "5.6.0", - "sequelize": "4.42.0", - "sequelize-cli": "5.4.0", - "sqlite3": "4.0.6", - "string-format": "2.0.0", - "umzug": "2.2.0", - "underscore": "1.9.1", - "winston": "3.1.0", - "xss-clean": "0.1.1" - }, - "devDependencies": { - "automatic-release": "1.1.1", - "bdd-lazy-var": "2.5.0", - "chai": "4.2.0", - "chai-as-promised": "7.1.1", - "chai-http": "4.2.1", - "eslint": "^5.14.1", - "eslint-config-google": "^0.12.0", - "mocha": "5.2.0", - "newman": "4.3.1", - "nyc": "13.3.0", - "sinon": "7.2.3", - "sinon-chai": "3.3.0" - } + "name": "iofogcontroller", + "version": "1.1.0", + "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.", + "main": "./src/main.js", + "author": "Saeid Baghbidi", + "contributors": [ + "Kilton Hopkins ", + "Saeid Baghbidi", + "Alexandre de Wergifosse", + "Pavel Kazlou", + "Egor Krylovich", + "Iryna Laryionava", + "Maryna Lipnitskaya", + "Dmitriy Kudasov", + "Dmitry Stolbunov", + "Darya Busel", + "Alexander Shpak", + "Kate Lukashick", + "Eugene Pankov", + "Maksim Chepelev", + "Tetiana Yatsiuk", + "Sergey Valevich" + ], + "license": { + "type": "EPL-2.0", + "url": "https://www.eclipse.org/legal/epl-v20.html" + }, + "bugs": { + "email": "edgemaster@iofog.org" + }, + "homepage": "https://www.iofog.org", + "repository": { + "type": "git", + "url": "https://github.com/ioFog/Controller" + }, + "scripts": { + "prestart": "npm run lint", + "start": "node scripts/scripts-api.js start", + "prestart-dev": "npm run lint", + "start-dev": "node scripts/scripts-api.js start-dev", + "prebuild": "npm run lint", + "build": "node scripts/scripts-api.js init", + "preuninstall": "node scripts/scripts-api.js preuninstall", + "postinstall": "node scripts/scripts-api.js postinstall", + "lint": "./node_modules/.bin/eslint \"**/*.js\"", + "standard": "./node_modules/.bin/standard || true", + "snyk": "./node_modules/.bin/snyk monitor", + "automatic-release": "automatic-release", + "pretest": "npm run lint", + "test": "node scripts/scripts-api.js test", + "prepostman_test": "npm run lint", + "postman_test": "node scripts/scripts-api.js postmantest", + "precli-tests": "npm run lint", + "cli-tests": "node scripts/scripts-api.js cli-tests", + "precoverage": "npm run lint", + "coverage": "node scripts/scripts-api.js coverage", + "prepare": "npm run lint" + }, + "preferGlobal": true, + "bin": { + "iofog-controller": "src/main.js" + }, + "dependencies": { + "@sentry/node": "4.5.3", + "body-parser": "1.18.3", + "child_process": "1.0.2", + "command-line-args": "5.0.2", + "command-line-usage": "5.0.5", + "concurrent-queue": "7.0.2", + "cookie-parser": "1.4.3", + "daemonize2": "0.4.2", + "ejs": "2.6.1", + "express": "4.16.4", + "formidable": "1.2.1", + "ftp": "0.3.10", + "helmet": "3.15.0", + "jsonschema": "1.2.4", + "moment": "2.24.0", + "morgan": "1.9.1", + "nconf": "0.10.0", + "newman": "4.5.0", + "nodemailer": "5.1.1", + "nodemailer-smtp-transport": "2.7.4", + "os": "0.1.1", + "path": "0.12.7", + "portscanner": "2.2.0", + "qs": "6.6.0", + "request-promise": "4.2.4", + "retry-as-promised": "3.1.0", + "semver": "5.6.0", + "sequelize": "4.42.0", + "sequelize-cli": "5.4.0", + "sqlite3": "4.0.6", + "string-format": "2.0.0", + "umzug": "2.2.0", + "underscore": "1.9.1", + "winston": "3.1.0", + "xss-clean": "0.1.1" + }, + "devDependencies": { + "acorn": "6.1.1", + "automatic-release": "1.1.1", + "bdd-lazy-var": "2.5.2", + "chai": "4.2.0", + "chai-as-promised": "7.1.1", + "chai-http": "4.2.1", + "eslint": "5.14.1", + "eslint-config-google": "0.12.0", + "mocha": "5.2.0", + "nyc": "13.3.0", + "sinon": "7.2.3", + "sinon-chai": "3.3.0", + "snyk": "1.167.2", + "standard": "12.0.1" + } } diff --git a/scripts/cli-tests.js b/scripts/cli-tests.js index 812e7571e..32cf110ff 100644 --- a/scripts/cli-tests.js +++ b/scripts/cli-tests.js @@ -12,8 +12,8 @@ */ const execSync = require('child_process').execSync -const {init} = require('./init') -const {restoreDBs, backupDBs} = require('./util') +const { init } = require('./init') +const { restoreDBs, backupDBs } = require('./util') const options = { env: { @@ -53,7 +53,7 @@ const registryListFields = ['registries'] const tunnelListFields = ['tunnels'] -function testControllerSection() { +function testControllerSection () { console.log('\n=============================\nStarting controller section..') responseHasFields(testCommand('controller status'), controllerStatusFields) @@ -62,7 +62,7 @@ function testControllerSection() { hasSomeResponse(testCommand('controller version')) } -function testUserSection() { +function testUserSection () { console.log('\n=============================\nStarting user section..') responseHasFields(testCommand('user add -f John -l Doe -e user@domain.com -p \'#Bugs4Fun\''), userCreateFields) @@ -75,7 +75,7 @@ function testUserSection() { responseEquals(testCommand('user remove -e user@domain.com'), 'User removed successfully.') } -function testConfigSection() { +function testConfigSection () { console.log('\n=============================\nStarting config section..') // TODO backup config before this command @@ -86,7 +86,7 @@ function testConfigSection() { responseEquals(testCommand('config email-activation -f'), 'Email activation state updated successfully.') } -function testConnectorSection() { +function testConnectorSection () { console.log('\n=============================\nStarting connector section..') responseContains(testCommand('connector add -i 127.0.0.1 -n Connector1 -d iofog.test.org -c testCertPath' + @@ -97,7 +97,7 @@ function testConnectorSection() { responseIsArray(testCommand('connector list')) } -function testTunnelSection() { +function testTunnelSection () { console.log('\n=============================\nStarting tunnel section..') responseContains(testCommand('tunnel update -i testIoFogUuid -u testUsername -p testPassword -s 127.0.0.1 ' + @@ -105,7 +105,7 @@ function testTunnelSection() { responseHasFields(testCommand('tunnel list'), tunnelListFields) } -function testIoFogSection() { +function testIoFogSection () { console.log('\n=============================\nStarting iofog section..') const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e fogUser@domain.com' + @@ -135,7 +135,7 @@ function testIoFogSection() { } } -function testCatalogSection() { +function testCatalogSection () { console.log('\n=============================\nStarting catalog section..') const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e catalogUser@domain.com' + @@ -147,13 +147,13 @@ function testCatalogSection() { try { const catalogCreateResponse = responseHasFields(testCommand('catalog add -n testCatalogItem1 -d testDescription' + - ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' - + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + '-X \'{}\' -u ' + userId), catalogCreateFields) const catalogId = catalogCreateResponse.id responseEquals(testCommand('catalog update -i ' + catalogId + ' -n testCatalogItem2 -d testDescription' + - ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' - + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat -X \'{}\''), + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat -X \'{}\''), 'Catalog item has been updated successfully.') responseHasFields(testCommand('catalog list'), catalogListFields) responseHasFields(testCommand('catalog info -i ' + catalogId), catalogCreateFields) @@ -166,7 +166,7 @@ function testCatalogSection() { } } -function testFlowSection() { +function testFlowSection () { console.log('\n=============================\nStarting flow section..') const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e flowUser@domain.com' + @@ -188,7 +188,7 @@ function testFlowSection() { } } -function testMicroserviceSection() { +function testMicroserviceSection () { console.log('\n=============================\nStarting microservice section..') const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e microserviceUser@domain.com' + @@ -200,8 +200,8 @@ function testMicroserviceSection() { const registryId = registryCreateResponse.id const catalogCreateResponse = responseHasFields(executeCommand('catalog add -n testCatalogItem1 -d testDescription' + - ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' - + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + '-X \'{}\' -u ' + userId), catalogCreateFields) const catalogId = catalogCreateResponse.id @@ -254,7 +254,7 @@ function testMicroserviceSection() { } } -function testRegistrySection() { +function testRegistrySection () { console.log('\n=============================\nStarting registry section..') const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e registryUser@domain.com' + @@ -275,7 +275,7 @@ function testRegistrySection() { } } -function testDiagnosticsSection() { +function testDiagnosticsSection () { console.log('\n=============================\nStarting diagnostics section..') const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e diagnosticsUser@domain.com' + @@ -287,8 +287,8 @@ function testDiagnosticsSection() { const registryId = registryCreateResponse.id const catalogCreateResponse = responseHasFields(executeCommand('catalog add -n testCatalogItem1 -d testDescription' + - ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' - + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + '-X \'{}\' -u ' + userId), catalogCreateFields) const catalogId = catalogCreateResponse.id @@ -333,27 +333,27 @@ function testDiagnosticsSection() { } } -function testCommand(command) { +function testCommand (command) { console.log('\n Testing command \'' + command + '\'') testsCounter++ return executeCommand(command) } -function executeCommand(command) { +function executeCommand (command) { let response = execSync('node ./src/main.js ' + command, options) response = response.toString() response = response.replace(/\r?\n?/g, '') // remove line breaks return response } -function hasSomeResponse(response) { +function hasSomeResponse (response) { if (response === undefined || response === null) { testsFailed++ console.log('\'hasSomeResponse\' test failed with response: ' + JSON.stringify(response)) } } -function responseIsArray(jsonResponse) { +function responseIsArray (jsonResponse) { try { const response = JSON.parse(jsonResponse) if (!Array.isArray(response)) { @@ -366,7 +366,7 @@ function responseIsArray(jsonResponse) { } } -function responseHasFields(jsonResponse, fields) { +function responseHasFields (jsonResponse, fields) { try { const response = JSON.parse(jsonResponse) for (const field of fields) { @@ -383,21 +383,21 @@ function responseHasFields(jsonResponse, fields) { } } -function responseEquals(response, expectedResponse) { +function responseEquals (response, expectedResponse) { if (response !== expectedResponse) { testsFailed++ console.log('\'responseEquals\' test failed with response: ' + JSON.stringify(response)) } } -function responseContains(response, expectedResponsePart) { +function responseContains (response, expectedResponsePart) { if (!response.includes(expectedResponsePart)) { testsFailed++ console.log('\'responseContains\' test failed with response: ' + JSON.stringify(response)) } } -function cliTest() { +function cliTest () { try { backupDBs() // create new DBs diff --git a/scripts/postinstall.js b/scripts/postinstall.js index a7723b45c..7f139df81 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -17,12 +17,13 @@ const fs = require('fs') const semver = require('semver') const config = require('../src/config') const currentVersion = require('../package').version -const {restoreDBs, restoreConfigs, INSTALLATION_VARIABLES_FILE} = require('./util') +const { restoreDBs, restoreConfigs, restoreTrackingUuid, INSTALLATION_VARIABLES_FILE } = require('./util') function postinstall() { // restore all files restoreDBs() restoreConfigs() + restoreTrackingUuid() // process migrations try { diff --git a/scripts/postmantest.js b/scripts/postmantest.js index dfc2d53c6..61d30a8bf 100644 --- a/scripts/postmantest.js +++ b/scripts/postmantest.js @@ -12,10 +12,10 @@ */ const newman = require('newman') -const {init} = require('./init') -const {restoreDBs, backupDBs} = require('./util') -const {start} = require('./start') -const {stop} = require('./stop') +const { init } = require('./init') +const { restoreDBs, backupDBs } = require('./util') +const { start } = require('./start') +const { stop } = require('./stop') function postmanTest() { stop() diff --git a/scripts/preuninstall.js b/scripts/preuninstall.js index 5cbdb7aea..4d1e0f582 100644 --- a/scripts/preuninstall.js +++ b/scripts/preuninstall.js @@ -11,9 +11,10 @@ * */ +const execSync = require('child_process').execSync const fs = require('fs') const version = require('../package').version -const {backupDBs, backupConfigs, INSTALLATION_VARIABLES_FILE} = require('./util') +const { backupDBs, backupConfigs, backupTrackingUuid, INSTALLATION_VARIABLES_FILE } = require('./util') function preuninstall() { const instalationVars = { @@ -24,6 +25,12 @@ function preuninstall() { backupDBs() backupConfigs() + backupTrackingUuid() + + const options = { + stdio: [process.stdin, process.stdout, process.stderr], + } + execSync('iofog-controller stop', options) } module.exports = { diff --git a/scripts/scripts-api.js b/scripts/scripts-api.js index 2743bdf91..989ae2a38 100644 --- a/scripts/scripts-api.js +++ b/scripts/scripts-api.js @@ -11,15 +11,15 @@ * */ -const {start} = require('./start') -const {startDev} = require('./start-dev') -const {init} = require('./init') -const {preuninstall} = require('./preuninstall') -const {postinstall} = require('./postinstall') -const {test} = require('./test') -const {cliTest} = require('./cli-tests') -const {postmanTest} = require('./postmantest') -const {coverage} = require('./coverage') +const { start } = require('./start') +const { startDev } = require('./start-dev') +const { init } = require('./init') +const { preuninstall } = require('./preuninstall') +const { postinstall } = require('./postinstall') +const { test } = require('./test') +const { cliTest } = require('./cli-tests') +const { postmanTest } = require('./postmantest') +const { coverage } = require('./coverage') switch (process.argv[2]) { case 'start': diff --git a/scripts/util.js b/scripts/util.js index 8fd2e1434..f8cbb40c6 100644 --- a/scripts/util.js +++ b/scripts/util.js @@ -30,6 +30,9 @@ const DEFAULT_CONFIG_BACKUP = `${TEMP_DIR}/default_iofog_backup.json` const DEVELOP_CONFIG_BACKUP = `${TEMP_DIR}/development_iofog_backup.json` const PRODUCTION_CONFIG_BACKUP = `${TEMP_DIR}/production_iofog_backup.json` +const TRACKING_UUID_FILE = `${ROOT_DIR}/src/config/tracking-uuid` +const TRACKING_UUID_FILE_BACKUP = `${TEMP_DIR}/tracking-uuid_backup` + const INSTALLATION_VARIABLES_FILE = TEMP_DIR + '/iofogcontroller_install_variables' @@ -77,11 +80,21 @@ function restoreConfigs() { renameFile(PRODUCTION_CONFIG_BACKUP, PRODUCTION_CONFIG) } +function backupTrackingUuid() { + renameFile(TRACKING_UUID_FILE, TRACKING_UUID_FILE_BACKUP) +} + +function restoreTrackingUuid() { + renameFile(TRACKING_UUID_FILE_BACKUP, TRACKING_UUID_FILE) +} + module.exports = { backupDBs: backupDBs, restoreDBs: restoreDBs, backupConfigs: backupConfigs, restoreConfigs: restoreConfigs, + backupTrackingUuid: backupTrackingUuid, + restoreTrackingUuid: restoreTrackingUuid, renameFile: renameFile, getTempDir: getTempDir, diff --git a/src/cli/base-cli-handler.js b/src/cli/base-cli-handler.js index c5fb8dc4b..feaf44976 100644 --- a/src/cli/base-cli-handler.js +++ b/src/cli/base-cli-handler.js @@ -30,7 +30,7 @@ class CLIHandler { } parseCommandLineArgs(commandDefinitions, options = {}) { - return commandLineArgs(commandDefinitions, Object.assign({camelCase: true, partial: true}, options)) + return commandLineArgs(commandDefinitions, Object.assign({ camelCase: true, partial: true }, options)) } help(show = [], showOptions = true, hasCommands = true, additionalSection = []) { @@ -43,7 +43,7 @@ class CLIHandler { } } - helpSome(show = [], showOptions = true,) { + helpSome(show = [], showOptions = true, ) { const options = Object.keys(this.commands) .filter((key) => show.indexOf(key) !== -1) .map((key) => ({ diff --git a/src/cli/catalog.js b/src/cli/catalog.js index b00c581c4..a7d0f01ab 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -154,7 +154,7 @@ class Catalog extends BaseCLIHandler { async run(args) { try { - const catalogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const catalogCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = catalogCommand.command.command @@ -218,8 +218,8 @@ const _createCatalogItem = async function(obj, user) { ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createCatalogItemObject(obj) - logger.cliReq('catalog add', {args: item}) - const catalogItemIdObject = await CatalogItemService.createCatalogItem(item, user) + logger.cliReq('catalog add', { args: item }) + const catalogItemIdObject = await CatalogItemService.createCatalogItemEndPoint(item, user) logger.cliRes(JSON.stringify({ id: catalogItemIdObject.id, }, null, 2)) @@ -234,26 +234,26 @@ const _updateCatalogItem = async function(obj) { throw new Errors.NotFoundError(ErrorMessages.CATALOG_UPDATE_REQUIRES_ID) } - logger.cliReq('catalog update', {args: item}) - await CatalogItemService.updateCatalogItem(obj.itemId, item, {}, true) + logger.cliReq('catalog update', { args: item }) + await CatalogItemService.updateCatalogItemEndPoint(obj.itemId, item, {}, true) logger.cliRes('Catalog item has been updated successfully.') } const _deleteCatalogItem = async function(obj) { - logger.cliReq('catalog remove', {args: {itemId: obj.itemId}}) - await CatalogItemService.deleteCatalogItem(obj.itemId, {}, true) + logger.cliReq('catalog remove', { args: { itemId: obj.itemId } }) + await CatalogItemService.deleteCatalogItemEndPoint(obj.itemId, {}, true) logger.cliRes('Catalog item has been removed successfully') } const _listCatalogItems = async function() { logger.cliReq('catalog list') - const result = await CatalogItemService.listCatalogItems({}, true) + const result = await CatalogItemService.listCatalogItemsEndPoint({}, true) logger.cliRes(JSON.stringify(result, null, 2)) } const _getCatalogItem = async function(obj) { - logger.cliReq('catalog info', {args: {itemId: obj.itemId}}) - const result = await CatalogItemService.getCatalogItem(obj.itemId, {}, true) + logger.cliReq('catalog info', { args: { itemId: obj.itemId } }) + const result = await CatalogItemService.getCatalogItemEndPoint(obj.itemId, {}, true) logger.cliRes(JSON.stringify(result, null, 2)) } diff --git a/src/cli/config.js b/src/cli/config.js index 673d3ceda..c74cd193e 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -86,6 +86,10 @@ class Config extends BaseCLIHandler { name: 'off', alias: 'f', type: Boolean, description: 'Disable', group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION], }, + { + name: 'kubelet', alias: 't', type: String, description: 'iofog-kubelet url', + group: constants.CMD_ADD, + }, ] this.commands = { [constants.CMD_ADD]: 'Add a new config value.', @@ -97,7 +101,7 @@ class Config extends BaseCLIHandler { async run(args) { try { - const configCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const configCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = configCommand.command.command @@ -208,6 +212,11 @@ const _addConfigOption = async function(options) { config.set('Service:LogsFileSize', options.logSize * 1024) onSuccess() }) + + await updateConfig(options.kubelet, 'kubelet', 'Kubelet:Uri', (onSuccess) => { + config.set('Kubelet:Uri', options.kubelet) + onSuccess() + }) } const updateConfig = async function(newConfigValue, cliConfigName, configName, fn) { @@ -238,6 +247,7 @@ const _listConfigOptions = function() { 'Log files directory': config.get('Service:LogsDirectory'), 'Log files size': config.get('Service:LogsFileSize'), 'Dev mode': config.get('Server:DevMode'), + 'Kubelet Url': config.get('Kubelet:Uri'), } const result = Object.keys(configuration) diff --git a/src/cli/connector.js b/src/cli/connector.js index c13fae624..b82d36f08 100644 --- a/src/cli/connector.js +++ b/src/cli/connector.js @@ -80,7 +80,7 @@ class Connector extends BaseCLIHandler { async run(args) { try { - const connectorCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const connectorCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = connectorCommand.command.command @@ -126,7 +126,7 @@ async function _executeCase(commands, commandName, f, isUserRequired) { async function _createConnector(obj) { const connector = _createConnectorObject(obj) - logger.cliReq('connector add', {args: connector}) + logger.cliReq('connector add', { args: connector }) try { await ConnectorService.createConnector(connector) logger.cliRes('Connector has been created successfully.') @@ -137,7 +137,7 @@ async function _createConnector(obj) { async function _updateConnector(obj) { const connector = _createConnectorObject(obj) - logger.cliReq('connector update', {args: connector}) + logger.cliReq('connector update', { args: connector }) try { await ConnectorService.updateConnector(connector) logger.cliRes('Connector has been updated successfully.') @@ -148,7 +148,7 @@ async function _updateConnector(obj) { async function _deleteConnector(obj) { const connector = _createConnectorObject(obj) - logger.cliReq('connector remove', {args: connector}) + logger.cliReq('connector remove', { args: connector }) try { await ConnectorService.deleteConnector(connector) logger.cliRes('Connector has been removed successfully.') diff --git a/src/cli/controller.js b/src/cli/controller.js index 2d4750be9..543cfe9eb 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -40,7 +40,7 @@ class Controller extends BaseCLIHandler { async run(args) { try { - const controllerCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const controllerCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = controllerCommand.command.command diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index a146907fa..dc9924d1b 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -79,7 +79,7 @@ class Diagnostics extends BaseCLIHandler { async run(args) { try { - const diagnosticCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const diagnosticCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = diagnosticCommand.command.command @@ -128,15 +128,15 @@ const _executeCase = async function(diagnosticCommand, commandName, f, isUserReq const _changeMicroserviceStraceState = async function(obj) { const isEnable = AppHelper.validateBooleanCliOptions(obj.enable, obj.disable) - logger.cliReq('diagnostics strace-update', {args: {isEnable: isEnable}}) - await DiagnosticService.changeMicroserviceStraceState(obj.microserviceUuid, {enable: isEnable}, {}, true) + logger.cliReq('diagnostics strace-update', { args: { isEnable: isEnable } }) + await DiagnosticService.changeMicroserviceStraceState(obj.microserviceUuid, { enable: isEnable }, {}, true) const msg = isEnable ? 'Microservice strace has been enabled' : 'Microservice strace has been disabled' logger.cliRes(msg) } const _getMicroserviceStraceData = async function(obj) { - logger.cliReq('diagnostics strace-info', {args: obj}) - const result = await DiagnosticService.getMicroserviceStraceData(obj.microserviceUuid, {format: obj.format}, {}, true) + logger.cliReq('diagnostics strace-info', { args: obj }) + const result = await DiagnosticService.getMicroserviceStraceData(obj.microserviceUuid, { format: obj.format }, {}, true) logger.cliRes('Strace data:') logger.cliRes('=============================') logger.cliRes(result.data) @@ -144,7 +144,7 @@ const _getMicroserviceStraceData = async function(obj) { } const _postMicroserviceStraceDataToFtp = async function(obj) { - logger.cliReq('diagnostics strace-ftp-post', {args: obj}) + logger.cliReq('diagnostics strace-ftp-post', { args: obj }) await DiagnosticService.postMicroserviceStraceDatatoFtp(obj.microserviceUuid, obj, {}, true) logger.cliRes('Strace data has been posted to FTP successfully.') } diff --git a/src/cli/flow.js b/src/cli/flow.js index 70227a2de..1094b7a6d 100644 --- a/src/cli/flow.js +++ b/src/cli/flow.js @@ -83,7 +83,7 @@ class Flow extends BaseCLIHandler { async run(args) { try { - const flowCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const flowCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = flowCommand.command.command @@ -146,8 +146,8 @@ const _createFlow = async function(flowData, user) { const flow = flowData.file ? JSON.parse(fs.readFileSync(flowData.file, 'utf8')) : _createFlowObject(flowData) - logger.cliReq('flow add', {args: flow}) - const createdFlow = await FlowService.createFlow(flow, user, true) + logger.cliReq('flow add', { args: flow }) + const createdFlow = await FlowService.createFlowEndPoint(flow, user, true) logger.cliRes(JSON.stringify({ id: createdFlow.id, }, null, 2)) @@ -159,28 +159,28 @@ const _updateFlow = async function(flowData) { : _createFlowObject(flowData) const flowId = flowData.flowId - logger.cliReq('flow update', {args: flow}) - await FlowService.updateFlow(flow, flowId, {}, true) + logger.cliReq('flow update', { args: flow }) + await FlowService.updateFlowEndPoint(flow, flowId, {}, true) logger.cliRes('Flow updated successfully.') } const _deleteFlow = async function(flowData) { const flowId = flowData.flowId - logger.cliReq('flow remove', {args: {flowId: flowId}}) - await FlowService.deleteFlow(flowId, {}, true) + logger.cliReq('flow remove', { args: { flowId: flowId } }) + await FlowService.deleteFlowEndPoint(flowId, {}, true) logger.cliRes('Flow removed successfully.') } const _getAllFlows = async function() { logger.cliReq('flow list') - const flows = await FlowService.getAllFlows(true) + const flows = await FlowService.getAllFlowsEndPoint(true) logger.cliRes(JSON.stringify(flows, null, 2)) } const _getFlow = async function(flowData) { const flowId = flowData.flowId - logger.cliReq('flow info', {args: {flowId: flowId}}) - const flow = await FlowService.getFlowWithTransaction(flowId, {}, true) + logger.cliReq('flow info', { args: { flowId: flowId } }) + const flow = await FlowService.getFlowEndPoint(flowId, {}, true) logger.cliRes(JSON.stringify(flow, null, 2)) } diff --git a/src/cli/index.js b/src/cli/index.js index c54a284d4..25bd75aab 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -29,7 +29,7 @@ const packageJson = require('./../../package') const constants = require('../helpers/constants') const Sentry = require('@sentry/node') -Sentry.init({dsn: 'https://3213bc0b88db47ffb103075d7e1e254f@sentry.io/1378606'}) +Sentry.init({ dsn: 'https://3213bc0b88db47ffb103075d7e1e254f@sentry.io/1378606' }) Sentry.configureScope((scope) => { scope.setExtra('version', packageJson.version) }) @@ -38,7 +38,7 @@ class Cli extends BaseCLIHandler { constructor() { super() this.commandDefinitions = [ - {name: 'command', defaultOption: true}, + { name: 'command', defaultOption: true }, ] this.commands = { [constants.CMD_START]: 'Start iofog-controller service.', @@ -60,39 +60,41 @@ class Cli extends BaseCLIHandler { } } - run(daemon) { + async run(daemon) { + await Start.initDB() + const mainCommand = this.parseCommandLineArgs(this.commandDefinitions) const argv = mainCommand._unknown || [] switch (mainCommand.command) { case constants.CMD_START: - return Start.run({daemon}) + return Start.run({ daemon }) case constants.CMD_STOP: return daemon.stop() case constants.CMD_INIT_DB: - return Start.initDB() + return case constants.CMD_CONTROLLER: - return Controller.run({argv}) + return Controller.run({ argv }) case constants.CMD_USER: - return User.run({argv}) + return User.run({ argv }) case constants.CMD_CONFIG: - return Config.run({argv}) + return Config.run({ argv }) case constants.CMD_CONNECTOR: - return Connector.run({argv}) + return Connector.run({ argv }) case constants.CMD_TUNNEL: - return Tunnel.run({argv}) + return Tunnel.run({ argv }) case constants.CMD_IOFOG: - return IOFog.run({argv}) + return IOFog.run({ argv }) case constants.CMD_CATALOG: - return Catalog.run({argv}) + return Catalog.run({ argv }) case constants.CMD_FLOW: - return Flow.run({argv}) + return Flow.run({ argv }) case constants.CMD_MICROSERVICE: - return Microservice.run({argv}) + return Microservice.run({ argv }) case constants.CMD_REGISTRY: - return Registry.run({argv}) + return Registry.run({ argv }) case constants.CMD_DIAGNOSTICS: - return Diagnostics.run({argv}) + return Diagnostics.run({ argv }) case constants.CMD_HELP: default: return this.help([], false) diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 5f56c3129..610241e15 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -211,7 +211,7 @@ class IOFog extends BaseCLIHandler { async run(args) { try { - const iofogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const iofogCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = iofogCommand.command.command @@ -289,8 +289,8 @@ async function _createFog(obj, user) { ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createFogObject(obj) - logger.cliReq('fog add', {args: fog}) - const result = await FogService.createFog(fog, user, true) + logger.cliReq('fog add', { args: fog }) + const result = await FogService.createFogEndPoint(fog, user, true) logger.cliRes(JSON.stringify({ uuid: result.uuid, }, null, 2)) @@ -303,43 +303,43 @@ async function _updateFog(obj, user) { fog.uuid = obj.iofogUuid - logger.cliReq('fog update', {args: fog}) - await FogService.updateFog(fog, user, true) + logger.cliReq('fog update', { args: fog }) + await FogService.updateFogEndPoint(fog, user, true) logger.cliRes('ioFog node has been updated successfully.') } async function _deleteFog(obj, user) { const fog = _createFogObject(obj) - logger.cliReq('fog remove', {args: fog}) - await FogService.deleteFog(fog, user, true) + logger.cliReq('fog remove', { args: fog }) + await FogService.deleteFogEndPoint(fog, user, true) logger.cliRes('ioFog node has been removed successfully') } async function _getFogList(obj, user) { logger.cliReq('fog list') const emptyFilters = [] - const list = await FogService.getFogList(emptyFilters, user, true) + const list = await FogService.getFogListEndPoint(emptyFilters, user, true) logger.cliRes(JSON.stringify(list, null, 2)) } async function _getFog(obj, user) { const fog = _createFogObject(obj) - logger.cliReq('fog info', {args: fog}) - const res = await FogService.getFogWithTransaction(fog, user, true) + logger.cliReq('fog info', { args: fog }) + const res = await FogService.getFogEndPoint(fog, user, true) logger.cliRes(JSON.stringify(res, null, 2)) } async function _generateProvision(obj, user) { const fog = _createFogObject(obj) - logger.cliReq('fog provisioning-key', {args: fog}) - const response = await FogService.generateProvisioningKey(fog, user, true) + logger.cliReq('fog provisioning-key', { args: fog }) + const response = await FogService.generateProvisioningKeyEndPoint(fog, user, true) logger.cliRes(JSON.stringify(response), null, 2) } async function _setFogRebootCommand(obj, user) { const fog = _createFogObject(obj) - logger.cliReq('fog reboot', {args: fog}) - await FogService.setFogRebootCommand(fog, user, true) + logger.cliReq('fog reboot', { args: fog }) + await FogService.setFogRebootCommandEndPoint(fog, user, true) logger.cliRes('ioFog reboot command has been set successfully') } @@ -348,8 +348,8 @@ async function _setFogVersionCommand(obj, user) { uuid: obj.iofogUuid, versionCommand: obj.versionCommand, } - logger.cliReq('fog version', {args: fog}) - await FogService.setFogVersionCommand(fog, user, true) + logger.cliReq('fog version', { args: fog }) + await FogService.setFogVersionCommandEndPoint(fog, user, true) logger.cliRes('ioFog version command has been set successfully') } @@ -357,8 +357,8 @@ async function _getHalHardwareInfo(obj) { const uuidObj = { uuid: obj.iofogUuid, } - logger.cliReq('fog hal-hw', {args: uuidObj}) - const data = await FogService.getHalHardwareInfo(uuidObj, {}, true) + logger.cliReq('fog hal-hw', { args: uuidObj }) + const data = await FogService.getHalHardwareInfoEndPoint(uuidObj, {}, true) if (data) { if (data.hasOwnProperty('info')) { data.info = JSON.parse(data.info) @@ -372,8 +372,8 @@ async function _getHalUsbInfo(obj) { const uuidObj = { uuid: obj.iofogUuid, } - logger.cliReq('fog hal-usb', {args: uuidObj}) - const data = await FogService.getHalUsbInfo(uuidObj, {}, true) + logger.cliReq('fog hal-usb', { args: uuidObj }) + const data = await FogService.getHalUsbInfoEndPoint(uuidObj, {}, true) if (data) { if (data.hasOwnProperty('info')) { data.info = JSON.parse(data.info) diff --git a/src/cli/microservice.js b/src/cli/microservice.js index 2c5813e02..d40ec4218 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -47,6 +47,15 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( routes: [ 'string', ], + env: [ + { + key: 'string', + value: 'string', + }, + ], + cmd: [ + 'string', + ], } ) @@ -65,6 +74,15 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( accessMode: 'rw', }, ], + env: [ + { + key: 'string', + value: 'string', + }, + ], + cmd: [ + 'string', + ], } ) @@ -162,6 +180,14 @@ class Microservice extends BaseCLIHandler { name: 'mapping-id', alias: 'a', type: CliDataTypes.Integer, description: 'Volume mapping id', group: [constants.CMD_VOLUME_MAPPING_REMOVE], }, + { + name: 'env', alias: 'e', type: String, description: 'Microservice environemnt variable(s)', multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD], + }, + { + name: 'cmd', alias: 'C', type: String, description: 'Microservice container command and argument(s)', multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD], + }, ] this.commands = { [constants.CMD_ADD]: 'Add a new microservice.', @@ -182,7 +208,7 @@ class Microservice extends BaseCLIHandler { async run(args) { try { - const microserviceCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const microserviceCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = microserviceCommand.command.command @@ -323,8 +349,8 @@ const _createRoute = async function(obj, user) { const arr = obj.route.split(':') const sourceMicroserviceUuid = arr[0] const destMicroserviceUuid = arr[1] - logger.cliReq('microservice route-create', {args: {source: sourceMicroserviceUuid, dest: destMicroserviceUuid}}) - await MicroserviceService.createRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, true) + logger.cliReq('microservice route-create', { args: { source: sourceMicroserviceUuid, dest: destMicroserviceUuid } }) + await MicroserviceService.createRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, user, true) logger.cliRes(`Microservice route with source microservice ${sourceMicroserviceUuid} and dest microservice ${destMicroserviceUuid} has been created successfully.`) } catch (e) { @@ -337,8 +363,8 @@ const _removeRoute = async function(obj, user) { const arr = obj.route.split(':') const sourceMicroserviceUuid = arr[0] const destMicroserviceUuid = arr[1] - logger.cliReq('microservice route-remove', {args: {source: sourceMicroserviceUuid, dest: destMicroserviceUuid}}) - await MicroserviceService.deleteRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, true) + logger.cliReq('microservice route-remove', { args: { source: sourceMicroserviceUuid, dest: destMicroserviceUuid } }) + await MicroserviceService.deleteRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, user, true) logger.cliRes('Microservice route with source microservice ' + sourceMicroserviceUuid + ' and dest microservice ' + destMicroserviceUuid + 'has been removed successfully.') } catch (e) { @@ -348,15 +374,15 @@ const _removeRoute = async function(obj, user) { const _createPortMapping = async function(obj, user) { const mapping = parsePortMappingObject(obj.mapping, ErrorMessages.CLI.INVALID_PORT_MAPPING) - logger.cliReq('microservice port-mapping-create', {args: mapping}) - await MicroserviceService.createPortMapping(obj.microserviceUuid, mapping, user, true) + logger.cliReq('microservice port-mapping-create', { args: mapping }) + await MicroserviceService.createPortMappingEndPoint(obj.microserviceUuid, mapping, user, true) logger.cliRes('Port mapping has been created successfully.') } const _createVolumeMapping = async function(obj, user) { const mapping = parseVolumeMappingObject(obj.mapping, ErrorMessages.CLI.INVALID_VOLUME_MAPPING) - logger.cliReq('microservice volume-mapping-create', {args: mapping}) - const result = await MicroserviceService.createVolumeMapping(obj.microserviceUuid, mapping, user, true) + logger.cliReq('microservice volume-mapping-create', { args: mapping }) + const result = await MicroserviceService.createVolumeMappingEndPoint(obj.microserviceUuid, mapping, user, true) logger.cliRes(JSON.stringify({ id: result.id, }, null, 2)) @@ -364,8 +390,8 @@ const _createVolumeMapping = async function(obj, user) { const _removePortMapping = async function(obj, user) { try { - logger.cliReq('microservice port-mapping-remove', {args: obj}) - await MicroserviceService.deletePortMapping(obj.microserviceUuid, obj.internalPort, user, true) + logger.cliReq('microservice port-mapping-remove', { args: obj }) + await MicroserviceService.deletePortMappingEndPoint(obj.microserviceUuid, obj.internalPort, user, true) logger.cliRes('Port mapping has been removed successfully.') } catch (e) { logger.error(e.message) @@ -374,8 +400,8 @@ const _removePortMapping = async function(obj, user) { const _removeVolumeMapping = async function(obj, user) { try { - logger.cliReq('microservice volume-mapping-remove', {args: obj}) - await MicroserviceService.deleteVolumeMapping(obj.microserviceUuid, obj.mappingId, user, true) + logger.cliReq('microservice volume-mapping-remove', { args: obj }) + await MicroserviceService.deleteVolumeMappingEndPoint(obj.microserviceUuid, obj.mappingId, user, true) logger.cliRes('Volume mapping has been deleted successfully.') } catch (e) { logger.error(e.message) @@ -383,14 +409,14 @@ const _removeVolumeMapping = async function(obj, user) { } const _listPortMappings = async function(obj, user) { - logger.cliReq('microservice port-mapping-list', {args: {microserviceUuid: obj.microserviceUuid}}) - const result = await MicroserviceService.listMicroservicePortMappings(obj.microserviceUuid, user, true) + logger.cliReq('microservice port-mapping-list', { args: { microserviceUuid: obj.microserviceUuid } }) + const result = await MicroserviceService.listMicroservicePortMappingsEndPoint(obj.microserviceUuid, user, true) logger.cliRes(JSON.stringify(result, null, 2)) } const _listVolumeMappings = async function(obj, user) { - logger.cliReq('microservice volume-mapping-list', {args: {microserviceUuid: obj.microserviceUuid}}) - const result = await MicroserviceService.listVolumeMappings(obj.microserviceUuid, user, true) + logger.cliReq('microservice volume-mapping-list', { args: { microserviceUuid: obj.microserviceUuid } }) + const result = await MicroserviceService.listVolumeMappingsEndPoint(obj.microserviceUuid, user, true) logger.cliRes(JSON.stringify(result, null, 2)) } @@ -399,20 +425,20 @@ const _removeMicroservice = async function(obj, user) { withCleanup: obj.cleanup, } - logger.cliReq('microservice remove', {args: {microserviceUuid: obj.microserviceUuid, withCleanup: obj.cleanup}}) - await MicroserviceService.deleteMicroservice(obj.microserviceUuid, microserviceData, user, true) + logger.cliReq('microservice remove', { args: { microserviceUuid: obj.microserviceUuid, withCleanup: obj.cleanup } }) + await MicroserviceService.deleteMicroserviceEndPoint(obj.microserviceUuid, microserviceData, user, true) logger.cliRes('Microservice has been removed successfully.') } const _listMicroservices = async function() { logger.cliReq('microservice list') - const result = await MicroserviceService.listMicroservices({}, {}, true) + const result = await MicroserviceService.listMicroservicesEndPoint({}, {}, true) logger.cliRes(JSON.stringify(result, null, 2)) } const _getMicroservice = async function(obj, user) { - logger.cliReq('microservice info', {args: {microserviceUuid: obj.microserviceUuid}}) - const result = await MicroserviceService.getMicroservice(obj.microserviceUuid, user, true) + logger.cliReq('microservice info', { args: { microserviceUuid: obj.microserviceUuid } }) + const result = await MicroserviceService.getMicroserviceEndPoint(obj.microserviceUuid, user, true) logger.cliRes(JSON.stringify(result, null, 2)) } @@ -421,11 +447,16 @@ const _createMicroservice = async function(obj, user) { ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createMicroserviceObject(obj) - logger.cliReq('microservice add', {args: microservice}) - const result = await MicroserviceService.createMicroservice(microservice, user, true) - logger.cliRes(JSON.stringify({ + logger.cliReq('microservice add', { args: microservice }) + const result = await MicroserviceService.createMicroserviceEndPoint(microservice, user, true) + const output = { uuid: result.uuid, - }, null, 2)) + } + if (result.publicLink) { + output.publicLink = res.publicLink + } + + logger.cliRes(JSON.stringify(output, null, 2)) } const _updateMicroservice = async function(obj, user) { @@ -433,12 +464,25 @@ const _updateMicroservice = async function(obj, user) { ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _updateMicroserviceObject(obj) - logger.cliReq('microservice update', {args: microservice}) - await MicroserviceService.updateMicroservice(obj.microserviceUuid, microservice, user, true) + logger.cliReq('microservice update', { args: microservice }) + await MicroserviceService.updateMicroserviceEndPoint(obj.microserviceUuid, microservice, user, true) logger.cliRes('Microservice has been updated successfully.') } const _updateMicroserviceObject = function(obj) { + const envVars = obj.env || [] + const env = envVars.map((it) => { + const split = it.split('=') + if (!split || split.length < 2) { + return + } + + return { + key: split[0], + value: split.slice(1).join('='), + } + }).filter((it) => !!it) + const microserviceObj = { name: obj.name, config: obj.config, @@ -446,6 +490,8 @@ const _updateMicroserviceObject = function(obj) { rootHostAccess: AppHelper.validateBooleanCliOptions(obj.rootEnable, obj.rootDisable), logSize: obj.logSize, rebuild: obj.rebuild, + cmd: obj.cmd, + env, } if (obj.volumes) { @@ -456,6 +502,19 @@ const _updateMicroserviceObject = function(obj) { } const _createMicroserviceObject = function(obj) { + const envVars = obj.env || [] + const env = envVars.map((it) => { + const split = it.split('=') + if (!split || split.length < 2) { + return + } + + return { + key: split[0], + value: split.slice(1).join('='), + } + }).filter((it) => !!it) + const microserviceObj = { name: obj.name, config: obj.config, @@ -465,6 +524,8 @@ const _createMicroserviceObject = function(obj) { rootHostAccess: AppHelper.validateBooleanCliOptions(obj.rootEnable, obj.rootDisable), logSize: obj.logSize, routes: obj.routes, + cmd: obj.cmd, + env, } if (obj.volumes) { diff --git a/src/cli/registry.js b/src/cli/registry.js index 3e2e6b98e..99e53fec4 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -90,7 +90,7 @@ class Registry extends BaseCLIHandler { async run(args) { try { - const registryCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const registryCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = registryCommand.command.command @@ -124,7 +124,7 @@ async function _createRegistry(obj, user) { const logRegistry = Object.assign({}, registry) delete logRegistry.password - logger.cliReq('registry add', {args: logRegistry}) + logger.cliReq('registry add', { args: logRegistry }) const response = await RegistryService.createRegistry(registry, user) logger.cliRes(JSON.stringify({ @@ -139,8 +139,8 @@ async function _getRegistries(obj, user) { } async function _deleteRegistry(obj, user) { - logger.cliReq('registry remove', {args: {id: obj.itemId}}) - await RegistryService.deleteRegistry({id: obj.itemId}, user, true) + logger.cliReq('registry remove', { args: { id: obj.itemId } }) + await RegistryService.deleteRegistry({ id: obj.itemId }, user, true) logger.cliRes('Registry has been removed successfully.') } @@ -149,7 +149,7 @@ async function _updateRegistry(obj) { const logRegistry = Object.assign({}, registry) delete logRegistry.password - logger.cliReq('registry update', {args: logRegistry}) + logger.cliReq('registry update', { args: logRegistry }) await RegistryService.updateRegistry(registry, obj.itemId, {}, true) logger.cliRes('Registry has been updated successfully.') diff --git a/src/cli/start.js b/src/cli/start.js index 313f47969..9f3ca666d 100644 --- a/src/cli/start.js +++ b/src/cli/start.js @@ -29,9 +29,8 @@ class Start extends BaseCLIHandler { const pid = daemon.status() if (pid === 0) { - this.initDB() daemon.start() - checkDaemon(daemon, configuration) + await checkDaemon(daemon, configuration) } else { logger.cliRes(`iofog-controller already running. PID: ${pid}`) } @@ -39,8 +38,7 @@ class Start extends BaseCLIHandler { async initDB() { try { - await db.migrate() - await db.seed() + await db.initDB() } catch (err) { logger.error('Unable to initialize the database.', err) process.exit(1) @@ -49,28 +47,32 @@ class Start extends BaseCLIHandler { } function checkDaemon(daemon, configuration) { - let iterationsCount = 0 - const check = () => { - iterationsCount++ - const pid = daemon.status() - if (pid === 0) { - return logger.error('Error: port is probably allocated, or ssl_key or ssl_cert or intermediate_cert ' + - 'is either missing or invalid.') - } + return new Promise((resolve, reject) => { + let iterationsCount = 0 + const check = () => { + iterationsCount++ + const pid = daemon.status() + if (pid === 0) { + logger.error('Error: port is probably allocated, or ssl_key or ssl_cert or intermediate_cert ' + + 'is either missing or invalid.') + return reject(new Error('Error starting ioFog-Controller')) + } - if (iterationsCount === 5) { - checkServerProtocol(configuration) - return logger.cliRes(`ioFog-Controller has started at pid: ${pid}`) + if (iterationsCount === 5) { + checkServerProtocol(configuration) + logger.cliRes(`ioFog-Controller has started at pid: ${pid}`) + return resolve() + } + + setTimeout(check, 1000) } setTimeout(check, 1000) - } - - setTimeout(check, 1000) + }) } function checkServerProtocol(configuration) { - const {devMode, port, sslKey, sslCert, intermedKey} = configuration + const { devMode, port, sslKey, sslCert, intermedKey } = configuration if (!devMode && sslKey && sslCert && intermedKey) { logger.cliRes(`==> 🌎 HTTPS server listening on port ${port}. Open up https://localhost:${port}/ in your browser.`) } else { diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 8315245ba..a7e18a02a 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -76,7 +76,7 @@ class Tunnel extends BaseCLIHandler { async run(args) { try { - const tunnelCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const tunnelCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = tunnelCommand.command.command @@ -104,7 +104,7 @@ async function _updateTunnel(obj, user) { const logTunnel = Object.assign({}, tunnel) delete logTunnel.password - logger.cliReq('tunnel update', {args: logTunnel}) + logger.cliReq('tunnel update', { args: logTunnel }) if (tunnel.iofogUuid === undefined) { throw new Error('Required field \'ioFog UUID\' is missing.') @@ -115,7 +115,7 @@ async function _updateTunnel(obj, user) { await TunnelService.openTunnel(tunnel, user, true) break case 'close': - await TunnelService.closeTunnel({iofogUuid: tunnel.iofogUuid}, user) + await TunnelService.closeTunnel({ iofogUuid: tunnel.iofogUuid }, user) break default: throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY) diff --git a/src/cli/user.js b/src/cli/user.js index d94e86253..2f7efec9a 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -71,7 +71,7 @@ class User extends BaseCLIHandler { async run(args) { try { - const userCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}) + const userCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) const command = userCommand.command.command @@ -125,7 +125,7 @@ const _executeCase = async function(userCommand, commandName, f, isUserRequired) } const _createUser = async function(user) { - logger.cliReq('user add', {args: user}) + logger.cliReq('user add', { args: user }) await Validator.validate(user, Validator.schemas.signUp) user.password = AppHelper.encryptText(user.password, user.email) @@ -137,13 +137,13 @@ const _createUser = async function(user) { } const _updateUserDetails = async function(userDetails, user) { - logger.cliReq('user update', {args: userDetails}) + logger.cliReq('user update', { args: userDetails }) await UserService.updateUserDetails(user, userDetails, true) logger.cliRes('User updated successfully.') } const _deleteUser = async function(obj, user) { - logger.cliReq('user remove', {args: {user: user.dataValues, force: obj.force}}) + logger.cliReq('user remove', { args: { user: user.dataValues, force: obj.force } }) await UserService.deleteUser(obj.force, user, true) logger.cliRes('User removed successfully.') } @@ -155,7 +155,7 @@ const _getAllUsers = async function() { } const _generateToken = async function(emailObj, user) { - logger.cliReq('user generate-token', {args: user.dataValues}) + logger.cliReq('user generate-token', { args: user.dataValues }) const response = await UserService.login(user, true) logger.cliRes(JSON.stringify(response, null, 2)) } @@ -164,13 +164,13 @@ const _activateUser = async function(emailObj, user) { const codeData = { userId: user.id, } - logger.cliReq('user activate', {args: codeData}) + logger.cliReq('user activate', { args: codeData }) await UserService.activateUser(codeData, true) logger.cliRes('User activated successfully.') } const _suspendUser = async function(emailObj, user) { - logger.cliReq('user suspend', {args: user.dataValues}) + logger.cliReq('user suspend', { args: user.dataValues }) await UserService.suspendUser(user, true) logger.cliRes('User suspended successfully.') } diff --git a/src/config/constants.js b/src/config/constants.js index 97933a49a..9aaa097f1 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -27,6 +27,7 @@ module.exports = { 'Settings:UserTokenExpirationIntervalSeconds': 3600, 'Settings:FogTokenExpirationIntervalSeconds': 3600, 'Settings:KubeletTokenExpirationIntervalSeconds': 3600, + 'Settings:SchedulerTokenExpirationIntervalSeconds': 3600, 'Settings:FogStatusUpdateIntervalSeconds': 120, 'Settings:FogStatusFrequencySeconds': 60, diff --git a/src/config/default.json b/src/config/default.json index 62d9aa2f4..86087f320 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -2,6 +2,9 @@ "App": { "Name": "iofog-controller" }, + "Kubelet": { + "Uri": "http://localhost:1234" + }, "Server": { "Port": 54421, "DevMode": false @@ -24,4 +27,4 @@ "Diagnostics": { "DiagnosticDir": "diagnostic" } -} \ No newline at end of file +} diff --git a/src/config/development.json b/src/config/development.json index 1a21cf099..a2ae4f3c1 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -2,6 +2,9 @@ "App": { "Name": "iofog-controller-dev" }, + "Kubelet": { + "Uri": "http://localhost:1234" + }, "Server": { "Port": 51121, "DevMode": true diff --git a/src/config/index.js b/src/config/index.js index d8f8dcdc7..f96f24373 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -17,7 +17,7 @@ const constants = require('./constants') class Config { constructor() { - nconf.env({separator: '_'}) + nconf.env({ separator: '_' }) const environment = nconf.get('NODE:ENV') || 'production' this.load(environment) } diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index e5fb4e484..ccd0caac5 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -15,23 +15,23 @@ const CatalogService = require('../services/catalog-service') const AuthDecorator = require('./../decorators/authorization-decorator') const createCatalogItemEndPoint = async function(req, user) { - return await CatalogService.createCatalogItem(req.body, user) + return await CatalogService.createCatalogItemEndPoint(req.body, user) } const listCatalogItemsEndPoint = async function(req, user) { - return await CatalogService.listCatalogItems(user, false) + return await CatalogService.listCatalogItemsEndPoint(user, false) } const listCatalogItemEndPoint = async function(req, user) { - return await CatalogService.getCatalogItem(req.params.id, user, false) + return await CatalogService.getCatalogItemEndPoint(req.params.id, user, false) } const deleteCatalogItemEndPoint = async function(req, user) { - await CatalogService.deleteCatalogItem(req.params.id, user, false) + await CatalogService.deleteCatalogItemEndPoint(req.params.id, user, false) } const updateCatalogItemEndPoint = async function(req, user) { - await CatalogService.updateCatalogItem(req.params.id, req.body, user, false) + await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, user, false) } module.exports = { diff --git a/src/controllers/connector-controller.js b/src/controllers/connector-controller.js new file mode 100644 index 000000000..ad1d98672 --- /dev/null +++ b/src/controllers/connector-controller.js @@ -0,0 +1,43 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2018 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const ConnectorService = require('../services/connector-service') + +const addConnectorEndPoint = async function (req) { + const connectorData = req.body + return ConnectorService.createConnector(connectorData) +} + +const updateConnectorEndPoint = async function (req) { + const connectorData = req.body + return ConnectorService.updateConnector(connectorData) +} + +const deleteConnectorEndPoint = async function (req) { + const connectorData = req.body + return ConnectorService.deleteConnector(connectorData) +} + +const listConnectorEndPoint = async function (req) { + const res = await ConnectorService.getConnectorList() + return { + connectors: res, + } +} + +module.exports = { + addConnectorEndPoint, + updateConnectorEndPoint, + deleteConnectorEndPoint, + listConnectorEndPoint, +} diff --git a/src/controllers/flow-controller.js b/src/controllers/flow-controller.js index b53d44f2a..497606c64 100644 --- a/src/controllers/flow-controller.js +++ b/src/controllers/flow-controller.js @@ -17,30 +17,30 @@ const FlowService = require('../services/flow-service') const createFlowEndPoint = async function(req, user) { const flow = req.body - return await FlowService.createFlow(flow, user, false) + return await FlowService.createFlowEndPoint(flow, user, false) } const getFlowsByUserEndPoint = async function(req, user) { - return await FlowService.getUserFlows(user, false) + return await FlowService.getUserFlowsEndPoint(user, false) } const getFlowEndPoint = async function(req, user) { const flowId = req.params.id - return await FlowService.getFlowWithTransaction(flowId, user, false) + return await FlowService.getFlowEndPoint(flowId, user, false) } const updateFlowEndPoint = async function(req, user) { const flow = req.body const flowId = req.params.id - return await FlowService.updateFlow(flow, flowId, user, false) + return await FlowService.updateFlowEndPoint(flow, flowId, user, false) } const deleteFlowEndPoint = async function(req, user) { const flowId = req.params.id - return await FlowService.deleteFlow(flowId, user, false) + return await FlowService.deleteFlowEndPoint(flowId, user, false) } module.exports = { diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index c1795aa74..d7e98429a 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -17,20 +17,20 @@ const qs = require('qs') async function createFogEndPoint(req, user) { const newFog = req.body - return await FogService.createFog(newFog, user, false) + return await FogService.createFogEndPoint(newFog, user, false) } async function updateFogEndPoint(req, user) { const updateFog = req.body updateFog.uuid = req.params.uuid - return await FogService.updateFog(updateFog, user, false) + return await FogService.updateFogEndPoint(updateFog, user, false) } async function deleteFogEndPoint(req, user) { const deleteFog = { uuid: req.params.uuid, } - return await FogService.deleteFog(deleteFog, user, false) + return await FogService.deleteFogEndPoint(deleteFog, user, false) } async function getFogEndPoint(req, user) { @@ -38,12 +38,12 @@ async function getFogEndPoint(req, user) { uuid: req.params.uuid, } - return await FogService.getFogWithTransaction(getFog, user, false) + return await FogService.getFogEndPoint(getFog, user, false) } async function getFogListEndPoint(req, user) { const query = qs.parse(req.query) - return await FogService.getFogList(query.filters, user, false) + return await FogService.getFogListEndPoint(query.filters, user, false) } async function generateProvisionKeyEndPoint(req, user) { @@ -51,7 +51,7 @@ async function generateProvisionKeyEndPoint(req, user) { uuid: req.params.uuid, } - return await FogService.generateProvisioningKey(fog, user, false) + return await FogService.generateProvisioningKeyEndPoint(fog, user, false) } async function setFogVersionCommandEndPoint(req, user) { @@ -60,7 +60,7 @@ async function setFogVersionCommandEndPoint(req, user) { versionCommand: req.params.versionCommand, } - return await FogService.setFogVersionCommand(fogVersionCommand, user, false) + return await FogService.setFogVersionCommandEndPoint(fogVersionCommand, user, false) } async function setFogRebootCommandEndPoint(req, user) { @@ -68,21 +68,21 @@ async function setFogRebootCommandEndPoint(req, user) { uuid: req.params.uuid, } - return await FogService.setFogRebootCommand(fog, user, false) + return await FogService.setFogRebootCommandEndPoint(fog, user, false) } async function getHalHardwareInfoEndPoint(req, user) { const uuidObj = { uuid: req.params.uuid, } - return await FogService.getHalHardwareInfo(uuidObj, user, false) + return await FogService.getHalHardwareInfoEndPoint(uuidObj, user, false) } async function getHalUsbInfoEndPoint(req, user) { const uuidObj = { uuid: req.params.uuid, } - return await FogService.getHalUsbInfo(uuidObj, user, false) + return await FogService.getHalUsbInfoEndPoint(uuidObj, user, false) } module.exports = { diff --git a/src/controllers/kubelet-controller.js b/src/controllers/kubelet-controller.js index 63a0ab7bf..533d4cd39 100644 --- a/src/controllers/kubelet-controller.js +++ b/src/controllers/kubelet-controller.js @@ -14,97 +14,107 @@ const KubeletService = require('../services/kubelet-service') const AuthDecorator = require('../decorators/authorization-decorator') -const kubeletCreatePodEndPoint = async function(req) { +const kubeletCreatePodEndPoint = async function(req, user) { const createPodData = req.body - const fogNodeUuid = req.params.nodeName + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletCreatePod(createPodData, fogNodeUuid) + return await KubeletService.kubeletCreatePod(createPodData, fogNodeUuid, user) } -const kubeletUploadPodEndPoint = async function(req) { +const kubeletUpdatePodEndPoint = async function(req, user) { const uploadPodData = req.body - const fogNodeUuid = req.params.nodeName + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletUploadPod(uploadPodData, fogNodeUuid) + return await KubeletService.kubeletUpdatePod(uploadPodData, fogNodeUuid, user) } -const kubeletDeletePodEndPoint = async function(req) { - const fogNodeUuid = req.params.nodeName +const kubeletDeletePodEndPoint = async function(req, user) { + const fogNodeUuid = req.query.nodeName + const podData = req.body - return await KubeletService.kubeletDeletePod(fogNodeUuid) + return await KubeletService.kubeletDeletePod(podData, fogNodeUuid, user) } -const kubeletGetPodEndPoint = async function(req) { - const namespace = req.params.namespace - const name = req.params.name - const fogNodeUuid = req.params.nodeName +const kubeletGetPodEndPoint = async function(req, user) { + const namespace = req.query.namespace + const name = req.query.name + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletGetPod(namespace, name, fogNodeUuid) + return await KubeletService.kubeletGetPod(namespace, name, fogNodeUuid, user) } -const kubeletGetContainerLogsEndPoint = async function(req) { - const namespace = req.params.namespace - const podName = req.params.podName - const containerName = req.params.containerName - const tail = req.params.tail - const fogNodeUuid = req.params.nodeName +const kubeletGetContainerLogsEndPoint = async function(req, user) { + const namespace = req.query.namespace + const podName = req.query.podName + const containerName = req.query.containerName + const tail = req.query.tail + const fogNodeUuid = req.query.nodeName return await KubeletService.kubeletGetContainerLogs(namespace, podName, containerName, tail, fogNodeUuid) } -const kubeletGetPodStatusEndPoint = async function(req) { - const namespace = req.params.namespace - const name = req.params.name - const fogNodeUuid = req.params.nodeName +const kubeletGetPodStatusEndPoint = async function(req, user) { + const namespace = req.query.namespace + const name = req.query.name + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletGetPodStatus(namespace, name, fogNodeUuid) + return await KubeletService.kubeletGetPodStatus(namespace, name, fogNodeUuid, user) } -const kubeletGetPodsEndPoint = async function(req) { - const fogNodeUuid = req.params.nodeName +const kubeletGetPodsEndPoint = async function(req, user) { + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletGetPods(createPodData, fogNodeUuid) + return KubeletService.kubeletGetPods(fogNodeUuid, user) } -const kubeletGetCapacityEndPoint = async function(req) { - const fogNodeUuid = req.params.nodeName +const kubeletGetCapacityEndPoint = async function(req, user) { + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletGetCapacity(createPodData, fogNodeUuid) + return await KubeletService.kubeletGetCapacity(fogNodeUuid, user) } -const kubeletGetNodeConditionsEndPoint = async function(req) { - const fogNodeUuid = req.params.nodeName +const kubeletGetAllocatableEndPoint = async function(req, user) { + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletGetNodeConditions(createPodData, fogNodeUuid) + return await KubeletService.kubeletGetAllocatable(fogNodeUuid, user) } -const kubeletGetNodeAddressesEndPoint = async function(req) { - const fogNodeUuid = req.params.nodeName +const kubeletGetNodeConditionsEndPoint = async function(req, user) { + const fogNodeUuid = req.query.nodeName - return await KubeletService.kubeletGetNodeAddresses(createPodData, fogNodeUuid) + return await KubeletService.kubeletGetNodeConditions(fogNodeUuid, user) +} + +const kubeletGetNodeAddressesEndPoint = async function(req, user) { + const fogNodeUuid = req.query.nodeName + + return await KubeletService.kubeletGetNodeAddresses(fogNodeUuid, user) } const kubeletGetVkTokenEndPoint = async function(req, user) { const userId = user.id + return await KubeletService.kubeletGetVkToken(userId) } const kubeletGetSchedulerTokenEndPoint = async function(req, user) { const userId = user.id + return await KubeletService.kubeletGetSchedulerToken(userId) } module.exports = { - kubeletCreatePodEndPoint: kubeletCreatePodEndPoint, - kubeletUploadPodEndPoint: kubeletUploadPodEndPoint, - kubeletDeletePodEndPoint: kubeletDeletePodEndPoint, - kubeletGetPodEndPoint: kubeletGetPodEndPoint, - kubeletGetContainerLogsEndPoint: kubeletGetContainerLogsEndPoint, - kubeletGetPodStatusEndPoint: kubeletGetPodStatusEndPoint, - kubeletGetPodsEndPoint: kubeletGetPodsEndPoint, - kubeletGetCapacityEndPoint: kubeletGetCapacityEndPoint, - kubeletGetNodeConditionsEndPoint: kubeletGetNodeConditionsEndPoint, - kubeletGetNodeAddressesEndPoint: kubeletGetNodeAddressesEndPoint, + kubeletCreatePodEndPoint: AuthDecorator.checkAuthToken(kubeletCreatePodEndPoint), + kubeletUpdatePodEndPoint: AuthDecorator.checkAuthToken(kubeletUpdatePodEndPoint), + kubeletDeletePodEndPoint: AuthDecorator.checkAuthToken(kubeletDeletePodEndPoint), + kubeletGetPodEndPoint: AuthDecorator.checkAuthToken(kubeletGetPodEndPoint), + kubeletGetContainerLogsEndPoint: AuthDecorator.checkAuthToken(kubeletGetContainerLogsEndPoint), + kubeletGetPodStatusEndPoint: AuthDecorator.checkAuthToken(kubeletGetPodStatusEndPoint), + kubeletGetPodsEndPoint: AuthDecorator.checkAuthToken(kubeletGetPodsEndPoint), + kubeletGetCapacityEndPoint: AuthDecorator.checkAuthToken(kubeletGetCapacityEndPoint), + kubeletGetAllocatableEndPoint: AuthDecorator.checkAuthToken(kubeletGetAllocatableEndPoint), + kubeletGetNodeConditionsEndPoint: AuthDecorator.checkAuthToken(kubeletGetNodeConditionsEndPoint), + kubeletGetNodeAddressesEndPoint: AuthDecorator.checkAuthToken(kubeletGetNodeAddressesEndPoint), kubeletGetVkTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetVkTokenEndPoint), kubeletGetSchedulerTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetSchedulerTokenEndPoint), } diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 12a27b7ec..723ecd3af 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -16,58 +16,58 @@ const MicroservicesService = require('../services/microservices-service') const createMicroserviceOnFogEndPoint = async function(req, user) { const microservice = req.body - return await MicroservicesService.createMicroservice(microservice, user, false) + return await MicroservicesService.createMicroserviceEndPoint(microservice, user, false) } const getMicroserviceEndPoint = async function(req, user) { const microserviceUuid = req.params.uuid - return await MicroservicesService.getMicroservice(microserviceUuid, user, false) + return await MicroservicesService.getMicroserviceEndPoint(microserviceUuid, user, false) } const updateMicroserviceEndPoint = async function(req, user) { const microservice = req.body const microserviceUuid = req.params.uuid - return await MicroservicesService.updateMicroservice(microserviceUuid, microservice, user, false) + return await MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) } const deleteMicroserviceEndPoint = async function(req, user) { const microserviceUuid = req.params.uuid const microserviceData = req.body || {} - return await MicroservicesService.deleteMicroservice(microserviceUuid, microserviceData, user, false) + return await MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, user, false) } const getMicroservicesByFlowEndPoint = async function(req, user) { const flowId = req.query.flowId - return await MicroservicesService.listMicroservices(flowId, user, false) + return await MicroservicesService.listMicroservicesEndPoint(flowId, user, false) } const createMicroserviceRouteEndPoint = async function(req, user) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return await MicroservicesService.createRoute(sourceUuid, destUuid, user, false) + return await MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, user, false) } const deleteMicroserviceRouteEndPoint = async function(req, user) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return await MicroservicesService.deleteRoute(sourceUuid, destUuid, user, false) + return await MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, user, false) } const createMicroservicePortMappingEndPoint = async function(req, user) { const uuid = req.params.uuid const portMappingData = req.body - return await MicroservicesService.createPortMapping(uuid, portMappingData, user, false) + return await MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, user, false) } const deleteMicroservicePortMappingEndPoint = async function(req, user) { const uuid = req.params.uuid const internalPort = req.params.internalPort - return await MicroservicesService.deletePortMapping(uuid, internalPort, user, false) + return await MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, user, false) } const listMicroservicePortMappingsEndPoint = async function(req, user) { const uuid = req.params.uuid - const ports = await MicroservicesService.listMicroservicePortMappings(uuid, user, false) + const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, user, false) return { ports: ports, } @@ -76,7 +76,7 @@ const listMicroservicePortMappingsEndPoint = async function(req, user) { const createMicroserviceVolumeMappingEndPoint = async function(req, user) { const microserviceUuid = req.params.uuid const volumeMappingData = req.body - const volumeMapping = await MicroservicesService.createVolumeMapping(microserviceUuid, volumeMappingData, user, false) + const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, user, false) return { id: volumeMapping.id, } @@ -84,7 +84,7 @@ const createMicroserviceVolumeMappingEndPoint = async function(req, user) { const listMicroserviceVolumeMappingsEndPoint = async function(req, user) { const uuid = req.params.uuid - const volumeMappings = await MicroservicesService.listVolumeMappings(uuid, user, false) + const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, user, false) return { volumeMappings: volumeMappings, } @@ -93,7 +93,7 @@ const listMicroserviceVolumeMappingsEndPoint = async function(req, user) { const deleteMicroserviceVolumeMappingEndPoint = async function(req, user) { const uuid = req.params.uuid const id = req.params.id - return await MicroservicesService.deleteVolumeMapping(uuid, id, user, false) + return await MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, user, false) } module.exports = { diff --git a/src/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index 3c03ebcb4..774cec9d9 100644 --- a/src/decorators/authorization-decorator.js +++ b/src/decorators/authorization-decorator.js @@ -17,7 +17,7 @@ const AccessTokenManager = require('../sequelize/managers/access-token-manager') const FogManager = require('../sequelize/managers/iofog-manager') const FogAccessTokenManager = require('../sequelize/managers/iofog-access-token-manager') const Errors = require('../helpers/errors') -const {isTest} = require('../helpers/app-helper') +const { isTest } = require('../helpers/app-helper') function checkAuthToken(f) { return async function(...fArgs) { diff --git a/src/decorators/cli-decorator.js b/src/decorators/cli-decorator.js index 12f9fa76c..f77969f21 100644 --- a/src/decorators/cli-decorator.js +++ b/src/decorators/cli-decorator.js @@ -14,7 +14,7 @@ const logger = require('../logger') const UserManager = require('../sequelize/managers/user-manager') const Errors = require('../helpers/errors') -const {isTest} = require('../helpers/app-helper') +const { isTest } = require('../helpers/app-helper') function prepareUserById(f) { return async function(...args) { diff --git a/src/decorators/response-decorator.js b/src/decorators/response-decorator.js index 1faa92b93..6235adf59 100644 --- a/src/decorators/response-decorator.js +++ b/src/decorators/response-decorator.js @@ -11,7 +11,7 @@ * */ const logger = require('../logger') -const {isTest} = require('../helpers/app-helper') +const { isTest } = require('../helpers/app-helper') function handleErrors(f, successCode, errorsCodes) { return async function(...args) { @@ -22,7 +22,7 @@ function handleErrors(f, successCode, errorsCodes) { let responseObject = {} try { const responseBody = await f.apply(this, args) - responseObject = {code: successCode, body: responseBody} + responseObject = { code: successCode, body: responseBody } } catch (err) { logger.error('error: ' + err) diff --git a/src/decorators/tracking-decorator.js b/src/decorators/tracking-decorator.js index 763ff5a40..aa2ff4fba 100644 --- a/src/decorators/tracking-decorator.js +++ b/src/decorators/tracking-decorator.js @@ -11,7 +11,7 @@ * */ -const {isTest} = require('../helpers/app-helper') +const { isTest } = require('../helpers/app-helper') const Tracking = require('../tracking') function trackEvent(f, eventType) { diff --git a/src/decorators/transaction-decorator.js b/src/decorators/transaction-decorator.js index 10aa70d07..def9b9eb5 100644 --- a/src/decorators/transaction-decorator.js +++ b/src/decorators/transaction-decorator.js @@ -10,82 +10,80 @@ * ******************************************************************************* * */ - -const db = require('./../sequelize/models') -const retry = require('retry-as-promised') -const sequelize = db.sequelize +const cq = require('concurrent-queue') const Transaction = require('sequelize/lib/transaction') -const {isTest} = require('../helpers/app-helper') + +const { isTest } = require('../helpers/app-helper') + +const transactionsQueue = cq() + .limit({ concurrency: 1 }) + .process((task, cb) => { + task.transaction + .apply(task.that, task.args) + .then((res) => cb(null, res)) + .catch((err) => cb(err, null)) + }) function transaction(f) { - return async function(...fArgs) { + const fakeTransactionObject = { fakeTransaction: true } + return function(...fArgs) { if (isTest()) { - return await f.apply(this, fArgs) + return f.apply(this, fArgs) } - // TODO [when transactions concurrency issue fixed]: Remove 'fArgs[fArgs.length - 1].fakeTransaction' - if (fArgs.length > 0 && fArgs[fArgs.length - 1] - && (fArgs[fArgs.length - 1] instanceof Transaction || fArgs[fArgs.length - 1].fakeTransaction)) { - return await f.apply(this, fArgs) + if (fArgs.length > 0 && fArgs[fArgs.length - 1] instanceof Transaction) { + fArgs[fArgs.length - 1] = fakeTransactionObject + return f.apply(this, fArgs) } else { - // return f.apply(this, fArgs) - return sequelize.transaction(async (t) => { - fArgs.push(t) - return await f.apply(this, fArgs) - }) + fArgs.push(fakeTransactionObject) + return f.apply(this, fArgs) } } } -function generateTransaction(f) { - return function(...args) { - return retry(() => { - const t = transaction(f) - return t.apply(this, args) - }, { - max: 5, - match: [ - sequelize.ConnectionError, - 'SQLITE_BUSY', - ], - }) +function queueTransaction(resolve, reject, transaction, that, retries, ...args) { + const task = { + transaction, + that, + retries, + args, } -} -function fakeTransaction(f) { - const fakeTransactionObject = {fakeTransaction: true} - return async function(...fArgs) { - if (isTest()) { - return await f.apply(this, fArgs) + transactionsQueue(task, (error, success) => { + if (error === null) { + return resolve(success) } - if (fArgs.length > 0 && fArgs[fArgs.length - 1] instanceof Transaction) { - fArgs[fArgs.length - 1] = fakeTransactionObject - return await f.apply(this, fArgs) - } else { - fArgs.push(fakeTransactionObject) - return await f.apply(this, fArgs) + if (retries < 1 || (error.message || '').indexOf('SQLITE_BUSY') === -1) { + return reject(error) } - } + + queueTransaction(resolve, reject, transaction, that, retries - 1, ...args) + }) } -// TODO [when transactions concurrency issue fixed]: Remove -function generateFakeTransaction(f) { +function applyTransaction(resolve, reject, transaction, that, ...args) { + transaction.apply(that, args) + .then(resolve) + .catch((error) => { + if ((error.message || '').indexOf('SQLITE_BUSY') === -1) { + return reject(error) + } + + queueTransaction(resolve, reject, transaction, this, 5, ...args) + }) +} + +function generateTransaction(f) { return function(...args) { - return retry(() => { - const t = fakeTransaction(f) - return t.apply(this, args) - }, { - max: 5, - match: [ - sequelize.ConnectionError, - 'SQLITE_BUSY', - ], + const t = transaction(f) + + return new Promise((resolve, reject) => { + applyTransaction(resolve, reject, t, this, ...args) }) } } module.exports = { generateTransaction: generateTransaction, - generateFakeTransaction: generateFakeTransaction, } diff --git a/src/helpers/constants.js b/src/helpers/constants.js index 79d3fc591..e5ebcb276 100644 --- a/src/helpers/constants.js +++ b/src/helpers/constants.js @@ -12,6 +12,7 @@ */ module.exports = { + ROOT_DIR: `${__dirname}/../..`, CONNECTOR_HTTP_PORT: 8080, CONNECTOR_HTTPS_PORT: 443, diff --git a/src/jobs/fog-status-job.js b/src/jobs/fog-status-job.js index ae0d54e9b..f4e783d4d 100644 --- a/src/jobs/fog-status-job.js +++ b/src/jobs/fog-status-job.js @@ -29,7 +29,7 @@ class FogStatusJob extends BaseJobHandler { } run() { - setInterval(TransactionDecorator.generateFakeTransaction(updateFogsConnectionStatus), this.scheduleTime) + setInterval(TransactionDecorator.generateTransaction(updateFogsConnectionStatus), this.scheduleTime) } } @@ -41,7 +41,7 @@ async function updateFogsConnectionStatus(transaction) { async function _updateFogStatus(transaction) { const minInMs = Config.get('Settings:FogStatusFrequencySeconds') * 1000 - const fogs = await FogManager.findAll({daemonStatus: FogStates.RUNNING}, transaction) + const fogs = await FogManager.findAll({ daemonStatus: FogStates.RUNNING }, transaction) const unknownFogUuids = fogs .filter((fog) => { const intervalInMs = fog.statusFrequency > minInMs ? fog.statusFrequency * 2 : minInMs @@ -49,23 +49,23 @@ async function _updateFogStatus(transaction) { }) .map((fog) => fog.uuid) - const where = {uuid: unknownFogUuids} - const data = {daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0'} + const where = { uuid: unknownFogUuids } + const data = { daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0' } await FogManager.update(where, data, transaction) return unknownFogUuids } async function _updateMicroserviceStatus(unknownFogUuids, transaction) { - const microservices = await MicroserviceManager.findAllWithStatuses({iofogUuid: unknownFogUuids}, transaction) + const microservices = await MicroserviceManager.findAllWithStatuses({ iofogUuid: unknownFogUuids }, transaction) const microserviceStatusIds = microservices.map((microservice) => microservice.microserviceStatus.id) - await MicroserviceStatusManager.update({id: microserviceStatusIds}, {status: MicroserviceStates.NOT_RUNNING}, transaction) + await MicroserviceStatusManager.update({ id: microserviceStatusIds }, { status: MicroserviceStates.NOT_RUNNING }, transaction) return microservices } async function _deleteNotRunningMicroservices(microservices, transaction) { for (microservice of microservices) { if (microservice.delete) { - await MicroserviceService.deleteMicroserviceWithRoutesAndPortMappings(microservice.uuid, transaction) + await MicroserviceService.deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) } } } diff --git a/src/jobs/send-tracking-job.js b/src/jobs/send-tracking-job.js index 78c5a305e..f9921ed11 100644 --- a/src/jobs/send-tracking-job.js +++ b/src/jobs/send-tracking-job.js @@ -29,7 +29,7 @@ class SendTrackingJob extends BaseJobHandler { const intervalMin = 5 async function sendTracking() { - const fakeTransactionObject = {fakeTransaction: true} + const fakeTransactionObject = { fakeTransaction: true } const events = await TrackingEventManager.popAll(fakeTransactionObject) try { Tracking.sendEvents(events) diff --git a/src/jobs/time-tracking-job.js b/src/jobs/time-tracking-job.js index 85583d95a..50345c192 100644 --- a/src/jobs/time-tracking-job.js +++ b/src/jobs/time-tracking-job.js @@ -22,12 +22,14 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const INTERVAL_MIN = 5 +let timerThis class TimeTrackingJob extends BaseJobHandler { constructor() { super() this.scheduleTime = INTERVAL_MIN * 60 * 1000 this.startTime = moment.now() + timerThis = this } run() { @@ -37,17 +39,17 @@ class TimeTrackingJob extends BaseJobHandler { async trackTime() { let agentsCount = 0 try { - const agents = await TransactionDecorator.generateFakeTransaction(FogAccessTokenService.all)() + const agents = await TransactionDecorator.generateTransaction(FogAccessTokenService.all)() agentsCount = (agents || []).length } catch (e) { logger.warn('Unable to count ioFog agents') } - const runningTime = moment().diff(this.startTime, 'minutes') - const event = Tracking.buildEvent(TrackingEventType.RUNNING_TIME, {runningTime, agentsCount}) + const runningTime = moment().diff(timerThis.startTime, 'minutes') + const event = Tracking.buildEvent(TrackingEventType.RUNNING_TIME, { runningTime, agentsCount }) await Tracking.processEvent(event) - setTimeout(this.trackTime, this.scheduleTime) + setTimeout(timerThis.trackTime, timerThis.scheduleTime) } } diff --git a/src/logger/index.js b/src/logger/index.js index c5a9f9020..a3185661c 100644 --- a/src/logger/index.js +++ b/src/logger/index.js @@ -58,7 +58,7 @@ const prepareObjectLogs = winston.format((log) => { if (log.level === 'apiReq' && log.message instanceof Object) { const req = log.message log.message = `${req.method} ${req.originalUrl}` - log.args = {params: req.params, query: req.query, body: req.body} + log.args = { params: req.params, query: req.query, body: req.body } } if (log.level === 'apiRes' && log.message instanceof Object) { const req = log.message.req @@ -79,38 +79,13 @@ const logger = winston.createLogger({ prepareObjectLogs(), formattedJson() ), - filename: 'iofog-controller.0.log', + filename: 'iofog-controller.log', dirname: dirname, maxsize: maxsize, - rotationFormat: function() { - return getFormattedLogName() - }, }), ], }) -// logFileName pattern similar to agent -function getFormattedLogName() { - if (fs.existsSync(dirname)) { - const files = fs.readdirSync(dirname) - const latestFilePath = dirname + '/' + files[0] - - if (files.length === 0 || fs.statSync(latestFilePath).size <= maxsize) { - return '' - } - - files.reverse().forEach((file) => { - const path = dirname + '/' + file - if (fs.existsSync(path)) { - const strNumber = file.replace('iofog-controller.', '').replace('.log', '') - const number = parseInt(strNumber) + 1 - fs.renameSync(path, path.replace(strNumber, number)) - } - }) - } - return '' -} - logger.add(new winston.transports.Console({ level: 'info', format: winston.format((log) => { @@ -120,7 +95,7 @@ logger.add(new winston.transports.Console({ if (log.level === 'apiReq' && log.message instanceof Object) { const req = log.message log.message = `${req.method} ${req.originalUrl}` - log.args = {params: req.params, query: req.query, body: req.body} + log.args = { params: req.params, query: req.query, body: req.body } } if (log.level === 'apiRes' && log.message instanceof Object) { const req = log.message.req diff --git a/src/main.js b/src/main.js index 2c32f7c9c..c8eee0f33 100644 --- a/src/main.js +++ b/src/main.js @@ -20,10 +20,12 @@ if (!process.env.NODE_ENV) { const Cli = require('./cli') const daemon = require('./daemon') -function main() { +async function main() { const cli = new Cli() - cli.run(daemon) + await cli.run(daemon) } main() + .then(() => process.exit(0)) + .catch(() => process.exit(1)) diff --git a/src/routes/agent.js b/src/routes/agent.js index 1d0e47ed4..a45a3c905 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -48,7 +48,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -77,7 +77,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -101,7 +101,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -130,7 +130,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -159,7 +159,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -188,7 +188,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -213,7 +213,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -242,7 +242,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -267,7 +267,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -296,7 +296,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -325,7 +325,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -358,7 +358,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -387,7 +387,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -416,7 +416,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -445,7 +445,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -470,7 +470,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -499,7 +499,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -528,7 +528,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -557,7 +557,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/catalog.js b/src/routes/catalog.js index e9769d460..fc4dcb7a8 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -42,7 +42,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -78,7 +78,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -110,7 +110,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -150,7 +150,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -182,7 +182,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/connector.js b/src/routes/connector.js new file mode 100644 index 000000000..cf8ed3f09 --- /dev/null +++ b/src/routes/connector.js @@ -0,0 +1,132 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2018 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ +const constants = require('../helpers/constants') +const Connector = require('../controllers/connector-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const logger = require('../logger') +const Errors = require('../helpers/errors') + +module.exports = [ + { + method: 'post', + path: '/api/v3/connector', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError], + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + ] + const addConnectorEndPoint = ResponseDecorator.handleErrors(Connector.addConnectorEndPoint, successCode, errorCodes) + const responseObject = await addConnectorEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }, + }, + { + method: 'get', + path: '/api/v3/connector', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError], + }, + ] + const listConnectorEndPoint = ResponseDecorator.handleErrors(Connector.listConnectorEndPoint, successCode, errorCodes) + const responseObject = await listConnectorEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }, + }, + { + method: 'put', + path: '/api/v3/connector', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError], + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, + ] + const updateConnectorEndPoint = ResponseDecorator.handleErrors(Connector.updateConnectorEndPoint, successCode, errorCodes) + const responseObject = await updateConnectorEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }, + }, + { + method: 'delete', + path: '/api/v3/connector', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError], + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, + ] + const deleteConnectorEndPoint = ResponseDecorator.handleErrors(Connector.deleteConnectorEndPoint, successCode, errorCodes) + const responseObject = await deleteConnectorEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }, + }, +] diff --git a/src/routes/controller.js b/src/routes/controller.js index 8da2bb4da..ff4e76067 100644 --- a/src/routes/controller.js +++ b/src/routes/controller.js @@ -31,7 +31,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -49,7 +49,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -67,7 +67,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index a1d21d9a5..d5b934efa 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -47,7 +47,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -79,7 +79,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) } else { res.writeHead(successCode, { 'Content-Length': responseObject.body['Content-Length'], @@ -123,7 +123,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -155,7 +155,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -195,7 +195,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/flow.js b/src/routes/flow.js index baab5ba26..d21548db2 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -38,7 +38,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -66,7 +66,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -94,7 +94,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -126,7 +126,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -154,7 +154,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/iofog.js b/src/routes/iofog.js index f5eb6de3a..414770a87 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -42,7 +42,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -70,7 +70,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -102,7 +102,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -130,7 +130,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -158,7 +158,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -187,7 +187,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -220,7 +220,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -254,7 +254,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -283,7 +283,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -311,7 +311,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js index 83455d7a6..d53da7f95 100644 --- a/src/routes/kubelet.js +++ b/src/routes/kubelet.js @@ -11,11 +11,11 @@ * */ -const KubeletController = require('../controllers/kubelet-controller') -const ResponseDecorator = require('../decorators/response-decorator') const constants = require('../helpers/constants') const Errors = require('../helpers/errors') +const KubeletController = require('../controllers/kubelet-controller') const logger = require('../logger') +const ResponseDecorator = require('../decorators/response-decorator') module.exports = [ { @@ -30,6 +30,14 @@ module.exports = [ code: constants.HTTP_CODE_BAD_REQUEST, errors: [Errors.ValidationError], }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError], + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletCreatePodEndPoint = ResponseDecorator @@ -40,54 +48,62 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'put', - path: '/api/v3/k8s/uploadPod', + path: '/api/v3/k8s/updatePod', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError], + errors: [Errors.NotFoundError], }, ] - const kubeletUploadPodEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletUploadPodEndPoint, successCode, errorCodes) - const responseObject = await kubeletUploadPodEndPoint(req) + const kubeletUpdatePodEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletUpdatePodEndPoint, successCode, errorCodes) + const responseObject = await kubeletUpdatePodEndPoint(req) res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'delete', path: '/api/v3/k8s/deletePod', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletDeletePodEndPoint = ResponseDecorator @@ -98,23 +114,29 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/getPod', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletGetPodEndPoint = ResponseDecorator @@ -125,23 +147,29 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/getContainerLogs', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletGetContainerLogsEndPoint = ResponseDecorator @@ -152,23 +180,29 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/getPodStatus', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletGetPodStatusEndPoint = ResponseDecorator @@ -179,23 +213,29 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/getPods', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletGetPodsEndPoint = ResponseDecorator @@ -206,24 +246,31 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/capacity', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] + const kubeletGetCapacityEndPoint = ResponseDecorator .handleErrors(KubeletController.kubeletGetCapacityEndPoint, successCode, errorCodes) const responseObject = await kubeletGetCapacityEndPoint(req) @@ -232,23 +279,62 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', - path: '/api/v3/k8s/nodeConditions', + path: '/api/v3/k8s/allocatable', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError], + }, { code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, + ] + + const kubeletGetAllocatableEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetAllocatableEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetAllocatableEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }, + }, + { + method: 'get', + path: '/api/v3/k8s/nodeConditions', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletGetNodeConditionsEndPoint = ResponseDecorator @@ -259,23 +345,29 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/nodeAddresses', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { - code: constants.HTTP_CODE_NOT_FOUND, + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError], + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, errors: [Errors.AuthenticationError], }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError], + }, ] const kubeletGetNodeAddressesEndPoint = ResponseDecorator @@ -286,16 +378,14 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'put', path: '/api/v3/k8s/vk-token', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ @@ -313,16 +403,14 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { method: 'get', path: '/api/v3/k8s/scheduler-token', middleware: async (req, res) => { - res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ @@ -340,7 +428,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/microservices.js b/src/routes/microservices.js index 7ffb7cf79..a2c63162c 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -39,7 +39,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -68,7 +68,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -97,7 +97,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, @@ -131,7 +131,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -160,7 +160,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -193,7 +193,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -226,7 +226,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -259,7 +259,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -288,7 +288,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -317,7 +317,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -349,7 +349,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -385,7 +385,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -421,7 +421,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/registries.js b/src/routes/registries.js index 5d7ca8c5e..8fbd1e448 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -40,7 +40,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -66,7 +66,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -96,7 +96,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -127,7 +127,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index f1335e6a6..a4129d3a0 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -44,7 +44,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -70,7 +70,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/routes/user.js b/src/routes/user.js index c9ba0ef44..843181d5a 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -45,7 +45,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes('POST /api/v3/user/login', {args: {statusCode: responseObject.code}}) + logger.apiRes('POST /api/v3/user/login', { args: { statusCode: responseObject.code } }) // don't use req and responseObject as args, because they have password and token }, }, @@ -92,7 +92,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -117,7 +117,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -148,7 +148,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -172,7 +172,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -201,7 +201,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -226,7 +226,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -255,7 +255,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, { @@ -280,7 +280,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({req: req, res: responseObject}) + logger.apiRes({ req: req, res: responseObject }) }, }, ] diff --git a/src/schemas/agent.js b/src/schemas/agent.js index 74891c787..0c0ad1241 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -15,8 +15,8 @@ const agentProvision = { 'id': '/agentProvision', 'type': 'object', 'properties': { - 'type': {'type': 'integer', 'minimum': 0, 'maximum': 2}, - 'key': {'type': 'string'}, + 'type': { 'type': 'integer', 'minimum': 0, 'maximum': 2 }, + 'key': { 'type': 'string' }, }, 'required': ['type', 'key'], 'additionalProperties': false, @@ -28,7 +28,7 @@ const agentDeprovision = { 'properties': { 'microserviceUuids': { 'type': 'array', - 'items': {'type': 'string'}, + 'items': { 'type': 'string' }, }, }, 'required': ['microserviceUuids'], @@ -39,22 +39,22 @@ const updateAgentConfig = { 'id': '/updateAgentConfig', 'type': 'object', 'properties': { - 'networkInterface': {'type': 'string'}, - 'dockerUrl': {'type': 'string'}, - 'diskLimit': {'type': 'integer', 'minimum': 0}, - 'diskDirectory': {'type': 'string'}, - 'memoryLimit': {'type': 'integer', 'minimum': 0}, - 'cpuLimit': {'type': 'integer', 'minimum': 0}, - 'logLimit': {'type': 'integer', 'minimum': 0}, - 'logDirectory': {'type': 'string'}, - 'logFileCount': {'type': 'integer', 'minimum': 0}, - 'statusFrequency': {'type': 'integer', 'minimum': 0}, - 'changeFrequency': {'type': 'integer', 'minimum': 0}, - 'deviceScanFrequency': {'type': 'integer', 'minimum': 0}, - 'watchdogEnabled': {'type': 'boolean'}, - 'latitude': {'type': 'number', 'minimum': -90, 'maximum': 90}, - 'longitude': {'type': 'number', 'minimum': -180, 'maximum': 180}, - 'gpsMode': {'type': 'string'}, + 'networkInterface': { 'type': 'string' }, + 'dockerUrl': { 'type': 'string' }, + 'diskLimit': { 'type': 'integer', 'minimum': 0 }, + 'diskDirectory': { 'type': 'string' }, + 'memoryLimit': { 'type': 'integer', 'minimum': 0 }, + 'cpuLimit': { 'type': 'integer', 'minimum': 0 }, + 'logLimit': { 'type': 'integer', 'minimum': 0 }, + 'logDirectory': { 'type': 'string' }, + 'logFileCount': { 'type': 'integer', 'minimum': 0 }, + 'statusFrequency': { 'type': 'integer', 'minimum': 0 }, + 'changeFrequency': { 'type': 'integer', 'minimum': 0 }, + 'deviceScanFrequency': { 'type': 'integer', 'minimum': 0 }, + 'watchdogEnabled': { 'type': 'boolean' }, + 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, + 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 }, + 'gpsMode': { 'type': 'string' }, }, 'additionalProperties': false, } @@ -63,29 +63,34 @@ const updateAgentStatus = { 'id': '/updateAgentStatus', 'type': 'object', 'properties': { - 'daemonStatus': {'type': 'string'}, - 'daemonOperatingDuration': {'type': 'integer', 'minimum': 0}, - 'daemonLastStart': {'type': 'integer', 'minimum': 0}, - 'memoryUsage': {'type': 'number', 'minimum': 0}, - 'diskUsage': {'type': 'number', 'minimum': 0}, - 'cpuUsage': {'type': 'number', 'minimum': 0}, - 'memoryViolation': {'type': 'boolean'}, - 'diskViolation': {'type': 'boolean'}, - 'cpuViolation': {'type': 'boolean'}, - 'microserviceStatus': {'type': 'string'}, - 'repositoryCount': {'type': 'integer', 'minimum': 0}, - 'repositoryStatus': {'type': 'string'}, - 'systemTime': {'type': 'integer', 'minimum': 0}, - 'lastStatusTime': {'type': 'integer', 'minimum': 0}, - 'ipAddress': {'type': 'string'}, - 'processedMessages': {'type': 'integer', 'minimum': 0}, - 'microserviceMessageCounts': {'type': 'string'}, - 'messageSpeed': {'type': 'number', 'minimum': 0}, - 'lastCommandTime': {'type': 'integer', 'minimum': 0}, - 'tunnelStatus': {'type': 'string'}, - 'version': {'type': 'string'}, - 'isReadyToUpgrade': {'type': 'boolean'}, - 'isReadyToRollback': {'type': 'boolean'}, + 'daemonStatus': { 'type': 'string' }, + 'daemonOperatingDuration': { 'type': 'integer', 'minimum': 0 }, + 'daemonLastStart': { 'type': 'integer', 'minimum': 0 }, + 'memoryUsage': { 'type': 'number', 'minimum': 0 }, + 'diskUsage': { 'type': 'number', 'minimum': 0 }, + 'cpuUsage': { 'type': 'number', 'minimum': 0 }, + 'memoryViolation': { 'type': 'boolean' }, + 'diskViolation': { 'type': 'boolean' }, + 'cpuViolation': { 'type': 'boolean' }, + 'systemAvailableDisk': { 'type': 'integer' }, + 'systemAvailableMemory': { 'type': 'integer' }, + 'systemTotalCpu': { 'type': 'number' }, + 'securityStatus': { 'type': 'string' }, + 'securityViolationInfo': { 'type': 'string' }, + 'microserviceStatus': { 'type': 'string' }, + 'repositoryCount': { 'type': 'integer', 'minimum': 0 }, + 'repositoryStatus': { 'type': 'string' }, + 'systemTime': { 'type': 'integer', 'minimum': 0 }, + 'lastStatusTime': { 'type': 'integer', 'minimum': 0 }, + 'ipAddress': { 'type': 'string' }, + 'processedMessages': { 'type': 'integer', 'minimum': 0 }, + 'microserviceMessageCounts': { 'type': 'string' }, + 'messageSpeed': { 'type': 'number', 'minimum': 0 }, + 'lastCommandTime': { 'type': 'integer', 'minimum': 0 }, + 'tunnelStatus': { 'type': 'string' }, + 'version': { 'type': 'string' }, + 'isReadyToUpgrade': { 'type': 'boolean' }, + 'isReadyToRollback': { 'type': 'boolean' }, }, 'additionalProperties': false, } @@ -97,7 +102,7 @@ const updateAgentStrace = { 'properties': { 'straceData': { 'type': 'array', - 'items': {'$ref': '/straceData'}, + 'items': { '$ref': '/straceData' }, 'required': [], }, }, @@ -108,8 +113,8 @@ const straceData = { 'id': '/straceData', 'type': 'object', 'properties': { - 'microserviceUuid': {'type': 'string'}, - 'buffer': {'type': 'string'}, + 'microserviceUuid': { 'type': 'string' }, + 'buffer': { 'type': 'string' }, }, 'required': ['microserviceUuid', 'buffer'], 'additionalProperties': false, @@ -119,13 +124,13 @@ const microserviceStatus = { 'id': '/microserviceStatus', 'type': 'object', 'properties': { - 'id': {'type': 'string'}, - 'containerId': {'type': 'string'}, - 'status': {'type': 'string'}, - 'startTime': {'type': 'integer'}, - 'operatingDuration': {'type': 'integer'}, - 'cpuUsage': {'type': 'number'}, - 'memoryUsage': {'type': 'number'}, + 'id': { 'type': 'string' }, + 'containerId': { 'type': 'string' }, + 'status': { 'type': 'string' }, + 'startTime': { 'type': 'integer' }, + 'operatingDuration': { 'type': 'integer' }, + 'cpuUsage': { 'type': 'number' }, + 'memoryUsage': { 'type': 'number' }, }, 'required': ['id'], 'additionalProperties': false, @@ -135,7 +140,7 @@ const updateHardwareInfo = { 'id': '/updateHardwareInfo', 'type': 'object', 'properties': { - 'info': {'type': 'string'}, + 'info': { 'type': 'string' }, }, 'required': ['info'], 'additionalProperties': false, @@ -145,7 +150,7 @@ const updateUsbInfo = { 'id': '/updateUsbInfo', 'type': 'object', 'properties': { - 'info': {'type': 'string'}, + 'info': { 'type': 'string' }, }, 'required': ['info'], 'additionalProperties': false, @@ -154,18 +159,18 @@ const updateUsbInfo = { const trackingArray = { 'id': '/trackingArray', 'type': 'array', - 'items': {'$ref': '/trackingMessage'}, + 'items': { '$ref': '/trackingMessage' }, } const trackingMessage = { 'id': '/trackingMessage', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, - 'sourceType': {'type': 'string'}, - 'timestamp': {'type': 'number'}, - 'type': {'type': 'string'}, - 'data': {'$ref': '/trackingData'}, + 'uuid': { 'type': 'string' }, + 'sourceType': { 'type': 'string' }, + 'timestamp': { 'type': 'number' }, + 'type': { 'type': 'string' }, + 'data': { '$ref': '/trackingData' }, }, 'required': ['uuid', 'sourceType', 'timestamp', 'type', 'data'], 'additionalProperties': false, diff --git a/src/schemas/catalog.js b/src/schemas/catalog.js index 87ac0f0e6..831730edb 100644 --- a/src/schemas/catalog.js +++ b/src/schemas/catalog.js @@ -15,24 +15,24 @@ const catalogItemCreate = { 'id': '/catalogItemCreate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'description': {'type': 'string'}, - 'category': {'type': 'string'}, - 'publisher': {'type': 'string'}, - 'diskRequired': {'type': 'integer'}, - 'ramRequired': {'type': 'integer'}, - 'picture': {'type': 'string'}, - 'isPublic': {'type': 'boolean'}, - 'registryId': {'type': 'integer'}, - 'configExample': {'type': 'string'}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'description': { 'type': 'string' }, + 'category': { 'type': 'string' }, + 'publisher': { 'type': 'string' }, + 'diskRequired': { 'type': 'integer' }, + 'ramRequired': { 'type': 'integer' }, + 'picture': { 'type': 'string' }, + 'isPublic': { 'type': 'boolean' }, + 'registryId': { 'type': 'integer' }, + 'configExample': { 'type': 'string' }, 'images': { 'type': 'array', 'minItems': 1, 'maxItems': 2, - 'items': {'$ref': '/image'}, + 'items': { '$ref': '/image' }, }, - 'inputType': {'$ref': '/type'}, - 'outputType': {'$ref': '/type'}, + 'inputType': { '$ref': '/type' }, + 'outputType': { '$ref': '/type' }, }, 'required': ['name', 'registryId', 'images'], 'additionalProperties': false, @@ -42,23 +42,23 @@ const catalogItemUpdate = { 'id': '/catalogItemUpdate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'description': {'type': 'string'}, - 'category': {'type': 'string'}, - 'publisher': {'type': 'string'}, - 'diskRequired': {'type': 'integer'}, - 'ramRequired': {'type': 'integer'}, - 'picture': {'type': 'string'}, - 'isPublic': {'type': 'boolean'}, - 'registryId': {'type': 'integer'}, - 'configExample': {'type': 'string'}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'description': { 'type': 'string' }, + 'category': { 'type': 'string' }, + 'publisher': { 'type': 'string' }, + 'diskRequired': { 'type': 'integer' }, + 'ramRequired': { 'type': 'integer' }, + 'picture': { 'type': 'string' }, + 'isPublic': { 'type': 'boolean' }, + 'registryId': { 'type': 'integer' }, + 'configExample': { 'type': 'string' }, 'images': { 'type': 'array', 'maxItems': 2, - 'items': {'$ref': '/image'}, + 'items': { '$ref': '/image' }, }, - 'inputType': {'$ref': '/type'}, - 'outputType': {'$ref': '/type'}, + 'inputType': { '$ref': '/type' }, + 'outputType': { '$ref': '/type' }, }, 'additionalProperties': false, } @@ -67,7 +67,7 @@ const image = { 'id': '/image', 'type': 'object', 'properties': { - 'containerImage': {'type': 'string'}, + 'containerImage': { 'type': 'string' }, 'fogTypeId': { 'type': 'integer', @@ -83,8 +83,8 @@ const type = { 'id': '/type', 'type': 'object', 'properties': { - 'infoType': {'type': 'string'}, - 'infoFormat': {'type': 'string'}, + 'infoType': { 'type': 'string' }, + 'infoFormat': { 'type': 'string' }, }, 'additionalProperties': false, } diff --git a/src/schemas/config.js b/src/schemas/config.js index 4806ac910..74c73aab7 100644 --- a/src/schemas/config.js +++ b/src/schemas/config.js @@ -15,18 +15,19 @@ const configUpdate = { 'id': '/configUpdate', 'type': 'object', 'properties': { - 'port': {'type': 'integer', 'minimum': 0, 'maximum': 65535}, - 'sslCert': {'type': 'string'}, - 'sslKey': {'type': 'string'}, - 'intermediateCert': {'type': 'string'}, - 'emailActivationOn': {'type': 'boolean'}, - 'emailActivationOff': {'type': 'boolean'}, - 'homeUrl': {'type': 'string'}, - 'emailAddress': {'type': 'string'}, - 'emailPassword': {'type': 'string', 'minLength': 1}, - 'emailService': {'type': 'string'}, - 'logDir': {'type': 'string'}, - 'logSize': {'type': 'integer'}, + 'port': { 'type': 'integer', 'minimum': 0, 'maximum': 65535 }, + 'sslCert': { 'type': 'string' }, + 'sslKey': { 'type': 'string' }, + 'intermediateCert': { 'type': 'string' }, + 'emailActivationOn': { 'type': 'boolean' }, + 'emailActivationOff': { 'type': 'boolean' }, + 'homeUrl': { 'type': 'string' }, + 'emailAddress': { 'type': 'string' }, + 'emailPassword': { 'type': 'string', 'minLength': 1 }, + 'emailService': { 'type': 'string' }, + 'logDir': { 'type': 'string' }, + 'logSize': { 'type': 'integer' }, + 'kubelet': { 'type': 'string' }, }, } diff --git a/src/schemas/connector.js b/src/schemas/connector.js index bf57162fa..67264b392 100644 --- a/src/schemas/connector.js +++ b/src/schemas/connector.js @@ -15,12 +15,12 @@ const connectorCreate = { 'id': '/connectorCreate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'domain': {'type': 'string', 'minLength': 4}, - 'publicIp': {'type': 'string', 'minLength': 7}, - 'cert': {'type': 'string'}, - 'isSelfSignedCert': {'type': 'boolean'}, - 'devMode': {'type': 'boolean'}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'domain': { 'type': 'string', 'minLength': 4 }, + 'publicIp': { 'type': 'string', 'minLength': 7 }, + 'cert': { 'type': 'string' }, + 'isSelfSignedCert': { 'type': 'boolean' }, + 'devMode': { 'type': 'boolean' }, }, 'required': ['publicIp', 'name', 'devMode'], 'additionalProperties': false, @@ -30,12 +30,12 @@ const connectorUpdate = { 'id': '/connectorUpdate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'domain': {'type': 'string', 'minLength': 4}, - 'publicIp': {'type': 'string', 'minLength': 7}, - 'cert': {'type': 'string'}, - 'isSelfSignedCert': {'type': 'boolean'}, - 'devMode': {'type': 'boolean'}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'domain': { 'type': 'string', 'minLength': 4 }, + 'publicIp': { 'type': 'string', 'minLength': 7 }, + 'cert': { 'type': 'string' }, + 'isSelfSignedCert': { 'type': 'boolean' }, + 'devMode': { 'type': 'boolean' }, }, 'required': ['publicIp'], 'additionalProperties': false, @@ -45,7 +45,7 @@ const connectorDelete = { 'id': '/connectorDelete', 'type': 'object', 'properties': { - 'publicIp': {'type': 'string', 'minLength': 7}, + 'publicIp': { 'type': 'string', 'minLength': 7 }, }, 'required': ['publicIp'], 'additionalProperties': false, diff --git a/src/schemas/diagnostics.js b/src/schemas/diagnostics.js index 35762921a..138366ac8 100644 --- a/src/schemas/diagnostics.js +++ b/src/schemas/diagnostics.js @@ -15,7 +15,7 @@ const straceStateUpdate = { 'id': '/straceStateUpdate', 'type': 'object', 'properties': { - 'enable': {'type': 'boolean'}, + 'enable': { 'type': 'boolean' }, }, 'required': ['enable'], } @@ -24,7 +24,7 @@ const straceGetData = { 'id': '/straceGetData', 'type': 'object', 'properties': { - 'format': {'enum': ['string', 'file']}, + 'format': { 'enum': ['string', 'file'] }, }, 'required': ['format'], } @@ -33,11 +33,11 @@ const stracePostToFtp = { 'id': '/stracePostToFtp', 'type': 'object', 'properties': { - 'ftpHost': {'type': 'string'}, - 'ftpPort': {'type': 'integer', 'minimum': 0}, - 'ftpUser': {'type': 'string'}, - 'ftpPass': {'type': 'string'}, - 'ftpDestDir': {'type': 'string'}, + 'ftpHost': { 'type': 'string' }, + 'ftpPort': { 'type': 'integer', 'minimum': 0 }, + 'ftpUser': { 'type': 'string' }, + 'ftpPass': { 'type': 'string' }, + 'ftpDestDir': { 'type': 'string' }, }, 'required': ['ftpHost', 'ftpPort', 'ftpUser', 'ftpPass', 'ftpDestDir'], } diff --git a/src/schemas/flow.js b/src/schemas/flow.js index cb7f17afb..c05dc147b 100644 --- a/src/schemas/flow.js +++ b/src/schemas/flow.js @@ -2,9 +2,9 @@ const flowCreate = { 'id': '/flowCreate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'description': {'type': 'string'}, - 'isActivated': {'type': 'boolean'}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'description': { 'type': 'string' }, + 'isActivated': { 'type': 'boolean' }, }, 'required': ['name'], 'additionalProperties': false, @@ -14,9 +14,9 @@ const flowUpdate = { 'id': '/flowUpdate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'description': {'type': 'string'}, - 'isActivated': {'type': 'boolean'}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'description': { 'type': 'string' }, + 'isActivated': { 'type': 'boolean' }, }, 'additionalProperties': false, } diff --git a/src/schemas/iofog.js b/src/schemas/iofog.js index 4372926a6..a97836e5c 100644 --- a/src/schemas/iofog.js +++ b/src/schemas/iofog.js @@ -15,26 +15,26 @@ const iofogCreate = { 'id': '/iofogCreate', 'type': 'object', 'properties': { - 'name': {'type': 'string', 'minLength': 1}, - 'location': {'type': 'string'}, - 'latitude': {'type': 'number', 'minimum': -90, 'maximum': 90}, - 'longitude': {'type': 'number', 'minimum': -180, 'maximum': 180}, - 'description': {'type': 'string'}, - 'dockerUrl': {'type': 'string'}, - 'diskLimit': {'type': 'integer', 'minimum': 0}, - 'diskDirectory': {'type': 'string'}, - 'memoryLimit': {'type': 'integer', 'minimum': 0}, - 'cpuLimit': {'type': 'integer', 'minimum': 0}, - 'logLimit': {'type': 'integer', 'minimum': 0}, - 'logDirectory': {'type': 'string'}, - 'logFileCount': {'type': 'integer', 'minimum': 0}, - 'statusFrequency': {'type': 'integer', 'minimum': 0}, - 'changeFrequency': {'type': 'integer', 'minimum': 0}, - 'deviceScanFrequency': {'type': 'integer', 'minimum': 0}, - 'bluetoothEnabled': {'type': 'boolean'}, - 'watchdogEnabled': {'type': 'boolean'}, - 'abstractedHardwareEnabled': {'type': 'boolean'}, - 'fogType': {'type': 'integer', 'minimum': 0, 'maximum': 2}, + 'name': { 'type': 'string', 'minLength': 1 }, + 'location': { 'type': 'string' }, + 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, + 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 }, + 'description': { 'type': 'string' }, + 'dockerUrl': { 'type': 'string' }, + 'diskLimit': { 'type': 'integer', 'minimum': 0 }, + 'diskDirectory': { 'type': 'string' }, + 'memoryLimit': { 'type': 'integer', 'minimum': 0 }, + 'cpuLimit': { 'type': 'integer', 'minimum': 0 }, + 'logLimit': { 'type': 'integer', 'minimum': 0 }, + 'logDirectory': { 'type': 'string' }, + 'logFileCount': { 'type': 'integer', 'minimum': 0 }, + 'statusFrequency': { 'type': 'integer', 'minimum': 0 }, + 'changeFrequency': { 'type': 'integer', 'minimum': 0 }, + 'deviceScanFrequency': { 'type': 'integer', 'minimum': 0 }, + 'bluetoothEnabled': { 'type': 'boolean' }, + 'watchdogEnabled': { 'type': 'boolean' }, + 'abstractedHardwareEnabled': { 'type': 'boolean' }, + 'fogType': { 'type': 'integer', 'minimum': 0, 'maximum': 2 }, }, 'required': ['name', 'fogType'], 'additionalProperties': false, @@ -44,27 +44,27 @@ const iofogUpdate = { 'id': '/iofogUpdate', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, - 'name': {'type': 'string', 'minLength': 1}, - 'location': {'type': 'string'}, - 'latitude': {'type': 'number', 'minimum': -90, 'maximum': 90}, - 'longitude': {'type': 'number', 'minimum': -180, 'maximum': 180}, - 'description': {'type': 'string'}, - 'dockerUrl': {'type': 'string'}, - 'diskLimit': {'type': 'integer', 'minimum': 0}, - 'diskDirectory': {'type': 'string'}, - 'memoryLimit': {'type': 'integer', 'minimum': 0}, - 'cpuLimit': {'type': 'integer', 'minimum': 0}, - 'logLimit': {'type': 'integer', 'minimum': 0}, - 'logDirectory': {'type': 'string'}, - 'logFileCount': {'type': 'integer', 'minimum': 0}, - 'statusFrequency': {'type': 'integer', 'minimum': 0}, - 'changeFrequency': {'type': 'integer', 'minimum': 0}, - 'deviceScanFrequency': {'type': 'integer', 'minimum': 0}, - 'bluetoothEnabled': {'type': 'boolean'}, - 'watchdogEnabled': {'type': 'boolean'}, - 'abstractedHardwareEnabled': {'type': 'boolean'}, - 'fogType': {'type': 'integer', 'minimum': 0, 'maximum': 2}, + 'uuid': { 'type': 'string' }, + 'name': { 'type': 'string', 'minLength': 1 }, + 'location': { 'type': 'string' }, + 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, + 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 }, + 'description': { 'type': 'string' }, + 'dockerUrl': { 'type': 'string' }, + 'diskLimit': { 'type': 'integer', 'minimum': 0 }, + 'diskDirectory': { 'type': 'string' }, + 'memoryLimit': { 'type': 'integer', 'minimum': 0 }, + 'cpuLimit': { 'type': 'integer', 'minimum': 0 }, + 'logLimit': { 'type': 'integer', 'minimum': 0 }, + 'logDirectory': { 'type': 'string' }, + 'logFileCount': { 'type': 'integer', 'minimum': 0 }, + 'statusFrequency': { 'type': 'integer', 'minimum': 0 }, + 'changeFrequency': { 'type': 'integer', 'minimum': 0 }, + 'deviceScanFrequency': { 'type': 'integer', 'minimum': 0 }, + 'bluetoothEnabled': { 'type': 'boolean' }, + 'watchdogEnabled': { 'type': 'boolean' }, + 'abstractedHardwareEnabled': { 'type': 'boolean' }, + 'fogType': { 'type': 'integer', 'minimum': 0, 'maximum': 2 }, }, 'required': ['uuid'], 'additionalProperties': false, @@ -74,7 +74,7 @@ const iofogDelete = { 'id': '/iofogDelete', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, + 'uuid': { 'type': 'string' }, }, 'required': ['uuid'], 'additionalProperties': false, @@ -84,7 +84,7 @@ const iofogGet = { 'id': '/iofogGet', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, + 'uuid': { 'type': 'string' }, }, 'required': ['uuid'], 'additionalProperties': false, @@ -94,7 +94,7 @@ const iofogGenerateProvision = { 'id': '/iofogGenerateProvision', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, + 'uuid': { 'type': 'string' }, }, 'required': ['uuid'], 'additionalProperties': false, @@ -104,8 +104,8 @@ const iofogSetVersionCommand = { 'id': '/iofogSetVersionCommand', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, - 'versionCommand': {'enum': ['upgrade', 'rollback']}, + 'uuid': { 'type': 'string' }, + 'versionCommand': { 'enum': ['upgrade', 'rollback'] }, }, 'required': ['uuid', 'versionCommand'], 'additionalProperties': false, @@ -115,7 +115,7 @@ const iofogReboot = { 'id': '/iofogReboot', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, + 'uuid': { 'type': 'string' }, }, 'required': ['uuid'], 'additionalProperties': false, @@ -124,7 +124,7 @@ const iofogReboot = { const iofogFilters = { 'id': '/iofogFilters', 'type': 'array', - 'items': {'$ref': '/filter'}, + 'items': { '$ref': '/filter' }, 'required': [], 'additionalProperties': false, } @@ -133,9 +133,9 @@ const filter = { 'id': '/filter', 'type': 'object', 'properties': { - 'key': {'type': 'string'}, - 'value': {'type': 'string'}, - 'condition': {'enum': ['has', 'equals']}, + 'key': { 'type': 'string' }, + 'value': { 'type': 'string' }, + 'condition': { 'enum': ['has', 'equals'] }, }, 'required': ['key', 'value', 'condition'], 'additionalProperties': false, @@ -145,7 +145,7 @@ const halGet = { 'id': '/halGet', 'type': 'object', 'properties': { - 'uuid': {'type': 'string'}, + 'uuid': { 'type': 'string' }, }, 'required': ['uuid'], 'additionalProperties': false, diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index 8853f5e08..ead4fbc11 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -6,25 +6,31 @@ const microserviceCreate = { 'type': 'string', 'minLength': 1, }, - 'config': {'type': 'string'}, + 'config': { 'type': 'string' }, 'catalogItemId': { 'type': 'integer', 'minimum': 4, }, - 'flowId': {'type': 'integer'}, - 'iofogUuid': {'type': 'string'}, - 'rootHostAccess': {'type': 'boolean'}, - 'logSize': {'type': 'integer'}, - 'imageSnapshot': {'type': 'string'}, + 'flowId': { 'type': 'integer' }, + 'iofogUuid': { 'type': 'string' }, + 'rootHostAccess': { 'type': 'boolean' }, + 'logSize': { 'type': 'integer' }, + 'imageSnapshot': { 'type': 'string' }, 'volumeMappings': { 'type': 'array', - 'items': {'$ref': '/volumeMappings'}}, + 'items': { '$ref': '/volumeMappings' } }, 'ports': { 'type': 'array', - 'items': {'$ref': '/ports'}}, + 'items': { '$ref': '/ports' } }, 'routes': { 'type': 'array', - 'items': {'type': 'string'}}, + 'items': { 'type': 'string' } }, + 'env': { + 'type': 'array', + 'items': { '$ref': '/env' } }, + 'cmd': { + 'type': 'array', + 'items': { 'type': 'string' } }, }, 'required': ['name', 'flowId', 'catalogItemId'], 'additionalProperties': false, @@ -38,15 +44,21 @@ const microserviceUpdate = { 'type': 'string', 'minLength': 1, }, - 'config': {'type': 'string'}, - 'rebuild': {'type': 'boolean'}, - 'iofogUuid': {'type': 'string'}, - 'rootHostAccess': {'type': 'boolean'}, - 'logSize': {'type': 'integer', 'minimum': 0}, + 'config': { 'type': 'string' }, + 'rebuild': { 'type': 'boolean' }, + 'iofogUuid': { 'type': 'string' }, + 'rootHostAccess': { 'type': 'boolean' }, + 'logSize': { 'type': 'integer', 'minimum': 0 }, 'volumeMappings': { 'type': 'array', - 'items': {'$ref': '/volumeMappings'}, + 'items': { '$ref': '/volumeMappings' }, }, + 'env': { + 'type': 'array', + 'items': { '$ref': '/env' } }, + 'cmd': { + 'type': 'array', + 'items': { 'type': 'string' } }, }, 'additionalProperties': false, } @@ -62,13 +74,24 @@ const microserviceDelete = { }, } +const env = { + 'id': '/env', + 'type': 'object', + 'properties': { + 'key': { 'type': 'string' }, + 'value': { 'type': 'string' }, + }, + 'required': ['key', 'value'], + 'additionalProperties': false, +} + const ports = { 'id': '/ports', 'type': 'object', 'properties': { - 'internal': {'type': 'integer'}, - 'external': {'type': 'integer'}, - 'publicMode': {'enum': [false]}, + 'internal': { 'type': 'integer' }, + 'external': { 'type': 'integer' }, + 'publicMode': { 'type': 'boolean' }, }, 'required': ['internal', 'external'], 'additionalProperties': false, @@ -78,9 +101,9 @@ const portsCreate = { 'id': '/portsCreate', 'type': 'object', 'properties': { - 'internal': {'type': 'integer'}, - 'external': {'type': 'integer'}, - 'publicMode': {'type': 'boolean'}, + 'internal': { 'type': 'integer' }, + 'external': { 'type': 'integer' }, + 'publicMode': { 'type': 'boolean' }, }, 'required': ['internal', 'external'], 'additionalProperties': false, @@ -90,15 +113,15 @@ const volumeMappings = { 'id': '/volumeMappings', 'type': 'object', 'properties': { - 'hostDestination': {'type': 'string'}, - 'containerDestination': {'type': 'string'}, - 'accessMode': {'type': 'string'}, + 'hostDestination': { 'type': 'string' }, + 'containerDestination': { 'type': 'string' }, + 'accessMode': { 'type': 'string' }, }, 'required': ['hostDestination', 'containerDestination', 'accessMode'], 'additionalProperties': false, } module.exports = { - mainSchemas: [microserviceCreate, microserviceUpdate, ports, portsCreate, microserviceDelete, volumeMappings], - innerSchemas: [volumeMappings, ports], + mainSchemas: [microserviceCreate, microserviceUpdate, env, ports, portsCreate, microserviceDelete, volumeMappings], + innerSchemas: [volumeMappings, ports, env], } diff --git a/src/schemas/registry.js b/src/schemas/registry.js index f360386ee..e9acac687 100644 --- a/src/schemas/registry.js +++ b/src/schemas/registry.js @@ -15,17 +15,17 @@ const registryCreate = { 'id': '/registryCreate', 'type': 'object', 'properties': { - 'url': {'type': 'string', 'minLength': 1}, - 'isPublic': {'type': 'boolean'}, - 'username': {'type': 'string', 'minLength': 1}, - 'password': {'type': 'string'}, + 'url': { 'type': 'string', 'minLength': 1 }, + 'isPublic': { 'type': 'boolean' }, + 'username': { 'type': 'string', 'minLength': 1 }, + 'password': { 'type': 'string' }, 'email': { 'type': 'string', 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$', }, - 'requiresCert': {'type': 'boolean'}, - 'certificate': {'type': 'string'}, + 'requiresCert': { 'type': 'boolean' }, + 'certificate': { 'type': 'string' }, }, 'required': ['url', 'isPublic', 'username', 'password', 'email'], 'additionalProperties': false, @@ -35,7 +35,7 @@ const registryDelete = { 'id': '/registryDelete', 'type': 'object', 'properties': { - 'id': {'type': 'integer'}, + 'id': { 'type': 'integer' }, }, 'required': ['id'], 'additionalProperties': false, @@ -45,17 +45,17 @@ const registryUpdate = { 'id': '/registryUpdate', 'type': 'object', 'properties': { - 'url': {'type': 'string', 'minLength': 1}, - 'isPublic': {'type': 'boolean'}, - 'username': {'type': 'string', 'minLength': 1}, - 'password': {'type': 'string'}, + 'url': { 'type': 'string', 'minLength': 1 }, + 'isPublic': { 'type': 'boolean' }, + 'username': { 'type': 'string', 'minLength': 1 }, + 'password': { 'type': 'string' }, 'email': { 'type': 'string', 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$', }, - 'requiresCert': {'type': 'boolean'}, - 'certificate': {'type': 'string'}, + 'requiresCert': { 'type': 'boolean' }, + 'certificate': { 'type': 'string' }, }, 'additionalProperties': false, } diff --git a/src/schemas/tunnel.js b/src/schemas/tunnel.js index d4be11763..9e8a8670a 100644 --- a/src/schemas/tunnel.js +++ b/src/schemas/tunnel.js @@ -15,12 +15,12 @@ const tunnelCreate = { 'id': '/tunnelCreate', 'type': 'object', 'properties': { - 'iofogUuid': {'type': 'string'}, - 'username': {'type': 'string', 'minLength': 1}, - 'password': {'type': 'string'}, - 'rsakey': {'type': 'string'}, - 'lport': {'type': 'integer', 'minimum': 0, 'maximum': 65535}, - 'rport': {'type': 'integer', 'minimum': 0, 'maximum': 65535}, + 'iofogUuid': { 'type': 'string' }, + 'username': { 'type': 'string', 'minLength': 1 }, + 'password': { 'type': 'string' }, + 'rsakey': { 'type': 'string' }, + 'lport': { 'type': 'integer', 'minimum': 0, 'maximum': 65535 }, + 'rport': { 'type': 'integer', 'minimum': 0, 'maximum': 65535 }, }, 'required': ['iofogUuid', 'username', 'password', 'lport', 'rport'], } diff --git a/src/schemas/user.js b/src/schemas/user.js index f8c757b94..cd29eb953 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -15,14 +15,14 @@ const signUp = { 'id': '/signUp', 'type': 'object', 'properties': { - 'firstName': {'type': 'string', 'minLength': 3}, - 'lastName': {'type': 'string', 'minLength': 3}, + 'firstName': { 'type': 'string', 'minLength': 3 }, + 'lastName': { 'type': 'string', 'minLength': 3 }, 'email': { 'type': 'string', 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$', }, - 'password': {'type': 'string', 'minLength': 8}, + 'password': { 'type': 'string', 'minLength': 8 }, }, 'required': ['email', 'password', 'firstName', 'lastName'], 'additionalProperties': false, @@ -37,7 +37,7 @@ const login = { 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$', }, - 'password': {'type': 'string'}, + 'password': { 'type': 'string' }, }, 'required': ['email', 'password'], 'additionalProperties': false, @@ -61,7 +61,7 @@ const activateUser = { 'id': '/activateUser', 'type': 'object', 'properties': { - 'activationCode': {'type': 'string'}, + 'activationCode': { 'type': 'string' }, }, 'required': ['activationCode'], 'additionalProperties': false, @@ -71,7 +71,7 @@ const activateUserCLI = { 'id': '/activateUserCLI', 'type': 'object', 'properties': { - 'email': {'type': 'string'}, + 'email': { 'type': 'string' }, }, 'required': ['email'], 'additionalProperties': false, @@ -81,8 +81,8 @@ const updateUserProfile = { 'id': '/updateUserProfile', 'type': 'object', 'properties': { - 'firstName': {'type': 'string', 'minLength': 3}, - 'lastName': {'type': 'string', 'minLength': 3}, + 'firstName': { 'type': 'string', 'minLength': 3 }, + 'lastName': { 'type': 'string', 'minLength': 3 }, }, 'required': [], 'additionalProperties': false, @@ -92,9 +92,9 @@ const updateUserProfileCLI = { 'id': '/updateUserProfileCLI', 'type': 'object', 'properties': { - 'firstName': {'type': 'string', 'minLength': 3}, - 'lastName': {'type': 'string', 'minLength': 3}, - 'password': {'type': 'string', 'minLength': 8}, + 'firstName': { 'type': 'string', 'minLength': 3 }, + 'lastName': { 'type': 'string', 'minLength': 3 }, + 'password': { 'type': 'string', 'minLength': 8 }, }, 'required': [], 'additionalProperties': false, @@ -104,8 +104,8 @@ const updatePassword = { 'id': '/updatePassword', 'type': 'object', 'properties': { - 'oldPassword': {'type': 'string'}, - 'newPassword': {'type': 'string', 'minLength': 8}, + 'oldPassword': { 'type': 'string' }, + 'newPassword': { 'type': 'string', 'minLength': 8 }, }, 'required': ['oldPassword', 'newPassword'], 'additionalProperties': false, diff --git a/src/sequelize/config/config.json b/src/sequelize/config/config.json index ae1a9f086..bf6a2f35c 100644 --- a/src/sequelize/config/config.json +++ b/src/sequelize/config/config.json @@ -3,18 +3,57 @@ "dialect": "sqlite", "storage": "dev_database.sqlite", "logging": false, - "operatorsAliases": false - }, + "operatorsAliases": false, + "transactionType": "DEFERRED", + "retry": { + "match": [ + "/SQLITE_BUSY/" + ], + "max": 0 + }, + "pool": { + "maxactive": 1, + "max": 5, + "min": 0, + "idle": 20000 + } +}, "test": { "dialect": "sqlite", "storage": "test_database.sqlite", "logging": false, - "operatorsAliases": false + "operatorsAliases": false, + "transactionType": "DEFERRED", + "retry": { + "match": [ + "/SQLITE_BUSY/" + ], + "max": 0 + }, + "pool": { + "maxactive": 1, + "max": 5, + "min": 0, + "idle": 20000 + } }, "production": { "dialect": "sqlite", "storage": "prod_database.sqlite", "logging": false, - "operatorsAliases": false + "operatorsAliases": false, + "transactionType": "DEFERRED", + "retry": { + "match": [ + "/SQLITE_BUSY/" + ], + "max": 0 + }, + "pool": { + "maxactive": 1, + "max": 5, + "min": 0, + "idle": 20000 + } } } \ No newline at end of file diff --git a/src/sequelize/managers/base-manager.js b/src/sequelize/managers/base-manager.js index 4821f8fa6..fa6e68ec5 100644 --- a/src/sequelize/managers/base-manager.js +++ b/src/sequelize/managers/base-manager.js @@ -40,8 +40,8 @@ module.exports = class BaseManager { findAllWithAttributes(where, attributes, transaction) { return this.getEntity().findAll({ where: where, - attributes: attributes}, - {transaction: transaction}) + attributes: attributes }, + { transaction: transaction }) } async findOne(object, transaction) { @@ -66,7 +66,7 @@ module.exports = class BaseManager { const options = transaction.fakeTransaction ? {} - : {transaction: transaction} + : { transaction: transaction } return this.getEntity().create(object, options) } @@ -76,7 +76,7 @@ module.exports = class BaseManager { const options = transaction.fakeTransaction ? {} - : {transaction: transaction} + : { transaction: transaction } return this.getEntity().bulkCreate(arr, options) } @@ -120,7 +120,7 @@ module.exports = class BaseManager { const options = transaction.fakeTransaction ? {} - : {transaction: transaction} + : { transaction: transaction } return this.getEntity().upsert(data, options) } @@ -158,4 +158,14 @@ module.exports = class BaseManager { return await this.update(whereData, newData, transaction) } } + + async updateAndFind(whereData, data, transaction) { + AppHelper.checkTransaction(transaction) + + const obj = await this.findOne(whereData, transaction) + if (obj) { + await this.update(whereData, data, transaction) + return this.findOne(whereData, transaction) + } + } } diff --git a/src/sequelize/managers/catalog-item-manager.js b/src/sequelize/managers/catalog-item-manager.js index e1b28856e..ded5efbbe 100644 --- a/src/sequelize/managers/catalog-item-manager.js +++ b/src/sequelize/managers/catalog-item-manager.js @@ -46,7 +46,7 @@ class CatalogItemManager extends BaseManager { }], where: where, attributes: attributes, - }, {transaction: transaction}) + }, { transaction: transaction }) } findOneWithDependencies(where, attribures, transaction) { @@ -72,7 +72,7 @@ class CatalogItemManager extends BaseManager { }], where: where, attributes: attribures, - }, {transaction: transaction}) + }, { transaction: transaction }) } } diff --git a/src/sequelize/managers/flow-manager.js b/src/sequelize/managers/flow-manager.js index 64ff3802d..77cd6b854 100644 --- a/src/sequelize/managers/flow-manager.js +++ b/src/sequelize/managers/flow-manager.js @@ -33,14 +33,14 @@ class FlowManager extends BaseManager { ], where: where, attributes: ['id'], - }, {transaction: transaction}) + }, { transaction: transaction }) } async findAllWithAttributes(where, attributes, transaction) { return Flow.findAll({ where: where, - attributes: attributes}, - {transaction: transaction}) + attributes: attributes }, + { transaction: transaction }) } async findOneWithAttributes(where, attributes, transaction) { @@ -48,7 +48,7 @@ class FlowManager extends BaseManager { where: where, attributes: attributes, }, - {transaction: transaction}) + { transaction: transaction }) } } diff --git a/src/sequelize/managers/iofog-manager.js b/src/sequelize/managers/iofog-manager.js index e654d028c..ab760763f 100644 --- a/src/sequelize/managers/iofog-manager.js +++ b/src/sequelize/managers/iofog-manager.js @@ -62,7 +62,7 @@ class FogManager extends BaseManager { }], }], where: where, - }, {transaction: transaction}) + }, { transaction: transaction }) } } diff --git a/src/sequelize/managers/microservice-arg-manager.js b/src/sequelize/managers/microservice-arg-manager.js new file mode 100644 index 000000000..f4c464f0d --- /dev/null +++ b/src/sequelize/managers/microservice-arg-manager.js @@ -0,0 +1,35 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2018 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceArg = models.MicroserviceArg + +const microserviceArgExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid', +] + +class MicroserviceArgManager extends BaseManager { + getEntity() { + return MicroserviceArg + } + + findAllExcludeFields(where, transaction) { + return this.findAllWithAttributes(where, { exclude: microserviceArgExcludedFields }, transaction) + } +} + +const instance = new MicroserviceArgManager() +module.exports = instance diff --git a/src/sequelize/managers/microservice-env-manager.js b/src/sequelize/managers/microservice-env-manager.js new file mode 100644 index 000000000..10534d9c5 --- /dev/null +++ b/src/sequelize/managers/microservice-env-manager.js @@ -0,0 +1,35 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2018 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceEnv = models.MicroserviceEnv + +const microserviceEnvExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid', +] + +class MicroserviceEnvManager extends BaseManager { + getEntity() { + return MicroserviceEnv + } + + findAllExcludeFields(where, transaction) { + return this.findAllWithAttributes(where, { exclude: microserviceEnvExcludedFields }, transaction) + } +} + +const instance = new MicroserviceEnvManager() +module.exports = instance diff --git a/src/sequelize/managers/microservice-manager.js b/src/sequelize/managers/microservice-manager.js index 0168f556c..3fe2b00f8 100644 --- a/src/sequelize/managers/microservice-manager.js +++ b/src/sequelize/managers/microservice-manager.js @@ -15,6 +15,8 @@ const BaseManager = require('./base-manager') const models = require('./../models') const Microservice = models.Microservice const MicroservicePort = models.MicroservicePort +const MicroserviceEnv = models.MicroserviceEnv +const MicroserviceArg = models.MicroserviceArg const VolumeMapping = models.VolumeMapping const StraceDiagnostics = models.StraceDiagnostics const CatalogItem = models.CatalogItem @@ -49,6 +51,18 @@ class MicroserviceManager extends BaseManager { findAllWithDependencies(where, attributes, transaction) { return Microservice.findAll({ include: [ + { + model: MicroserviceEnv, + as: 'env', + required: false, + attributes: ['key', 'value'], + }, + { + model: MicroserviceArg, + as: 'cmd', + required: false, + attributes: ['cmd'], + }, { model: MicroservicePort, as: 'ports', @@ -93,19 +107,31 @@ class MicroserviceManager extends BaseManager { as: 'destMicroservice', attributes: ['uuid'], }], - attributes: {exclude: ['id', 'source_microservice_uuid', + attributes: { exclude: ['id', 'source_microservice_uuid', 'sourceMicroserviceUuid', 'destMicroserviceUuid', 'sourceNetworkMicroserviceUuid', - 'destNetworkMicroserviceUuid', 'sourceIofogUuid', 'destIofogUuid', 'connectorPortId']}, + 'destNetworkMicroserviceUuid', 'sourceIofogUuid', 'destIofogUuid', 'connectorPortId'] }, }, ], where: where, attributes: attributes, - }, {transaction: transaction}) + }, { transaction: transaction }) } findAllActiveFlowMicroservices(iofogUuid, transaction) { return Microservice.findAll({ include: [ + { + model: MicroserviceEnv, + as: 'env', + required: false, + attributes: ['key', 'value'], + }, + { + model: MicroserviceArg, + as: 'cmd', + required: false, + attributes: ['cmd', 'id'], + }, { model: MicroservicePort, as: 'ports', @@ -153,18 +179,30 @@ class MicroserviceManager extends BaseManager { '$flow.is_activated$': true, }, { - '$catalogItem.category$': {[Op.eq]: 'SYSTEM'}, - '$catalogItem.id$': {[Op.ne]: 1}, + '$catalogItem.category$': { [Op.eq]: 'SYSTEM' }, + '$catalogItem.id$': { [Op.ne]: 1 }, }, ], }, - }, {transaction: transaction}) + }, { transaction: transaction }) } findOneWithDependencies(where, attributes, transaction) { return Microservice.findOne({ include: [ + { + model: MicroserviceEnv, + as: 'env', + required: false, + attributes: ['key', 'value'], + }, + { + model: MicroserviceArg, + as: 'cmd', + required: false, + attributes: ['cmd'], + }, { model: MicroservicePort, as: 'ports', @@ -209,15 +247,15 @@ class MicroserviceManager extends BaseManager { as: 'destMicroservice', attributes: ['uuid'], }], - attributes: {exclude: ['id', + attributes: { exclude: ['id', 'sourceMicroserviceUuid', 'destMicroserviceUuid', 'sourceNetworkMicroserviceUuid', 'destNetworkMicroserviceUuid', - 'sourceIofogUuid', 'destIofogUuid', 'connectorPortId']}, + 'sourceIofogUuid', 'destIofogUuid', 'connectorPortId'] }, }, ], where: where, attributes: attributes, - }, {transaction: transaction}) + }, { transaction: transaction }) } findOneWithStatusAndCategory(where, transaction) { @@ -236,7 +274,7 @@ class MicroserviceManager extends BaseManager { }, ], where: where, - }, {transaction: transaction}) + }, { transaction: transaction }) } findAllWithStatuses(where, transaction) { @@ -249,7 +287,7 @@ class MicroserviceManager extends BaseManager { }, ], where: where, - }, {transaction: transaction}) + }, { transaction: transaction }) } findMicroserviceOnGet(where, transaction) { @@ -272,7 +310,7 @@ class MicroserviceManager extends BaseManager { ], where: where, attributes: ['uuid'], - }, {transaction: transaction}) + }, { transaction: transaction }) } async findOneExcludeFields(where, transaction) { @@ -280,7 +318,7 @@ class MicroserviceManager extends BaseManager { where: where, attributes: { exclude: microserviceExcludedFields, - }}, { + } }, { transaction: transaction, }) } @@ -290,7 +328,7 @@ class MicroserviceManager extends BaseManager { where: where, attributes: { exclude: microserviceExcludedFields, - }}, { + } }, { transaction: transaction, }) } @@ -306,7 +344,7 @@ class MicroserviceManager extends BaseManager { }, ], where: where, - }, {transaction: transaction}) + }, { transaction: transaction }) } } diff --git a/src/sequelize/managers/microservice-public-mode-manager.js b/src/sequelize/managers/microservice-public-mode-manager.js index 673fbd78f..0bd793ce2 100644 --- a/src/sequelize/managers/microservice-public-mode-manager.js +++ b/src/sequelize/managers/microservice-public-mode-manager.js @@ -33,7 +33,7 @@ class MicroservicePublicModeManager extends BaseManager { where: { '$connectorPort.connector_id$': connectorId, }, - }, {transaction: transaction}) + }, { transaction: transaction }) } } diff --git a/src/sequelize/managers/routing-manager.js b/src/sequelize/managers/routing-manager.js index 627bee1c6..51c01bd11 100644 --- a/src/sequelize/managers/routing-manager.js +++ b/src/sequelize/managers/routing-manager.js @@ -33,7 +33,7 @@ class RoutingManager extends BaseManager { where: { '$connectorPort.connector_id$': connectorId, }, - }, {transaction: transaction}) + }, { transaction: transaction }) } } diff --git a/src/sequelize/managers/scheduler-access-token-manager.js b/src/sequelize/managers/scheduler-access-token-manager.js new file mode 100644 index 000000000..b4d670314 --- /dev/null +++ b/src/sequelize/managers/scheduler-access-token-manager.js @@ -0,0 +1,25 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2019 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('./../models') +const SchedulerAccessToken = models.SchedulerAccessToken + +class SchedulerAccessTokenManager extends BaseManager { + getEntity() { + return SchedulerAccessToken + } +} + +const instance = new SchedulerAccessTokenManager() +module.exports = instance diff --git a/src/sequelize/managers/user-manager.js b/src/sequelize/managers/user-manager.js index ae002c359..b4bcf5441 100644 --- a/src/sequelize/managers/user-manager.js +++ b/src/sequelize/managers/user-manager.js @@ -61,7 +61,7 @@ class UserManager extends BaseManager { // no transaction required here, used by cli decorator findById(id) { - return User.findOne({where: {id: id}}) + return User.findOne({ where: { id: id } }) } updateDetails(user, updateObject, transaction) { @@ -88,7 +88,7 @@ class UserManager extends BaseManager { // no transaction required here, used by cli decorator findById(id) { - return User.findOne({where: {id: id}}) + return User.findOne({ where: { id: id } }) } } diff --git a/src/sequelize/managers/volume-mapping-manager.js b/src/sequelize/managers/volume-mapping-manager.js index 6ddb49061..c3a51de33 100644 --- a/src/sequelize/managers/volume-mapping-manager.js +++ b/src/sequelize/managers/volume-mapping-manager.js @@ -24,7 +24,7 @@ class VolumeMappingManager extends BaseManager { return VolumeMapping.findAll({ where: where, attributes: ['hostDestination', 'containerDestination', 'accessMode', 'id'], - }, {transaction: transaction}) + }, { transaction: transaction }) } } diff --git a/src/sequelize/migrations/20180930164635-create-flow.js b/src/sequelize/migrations/20180930164635-create-flow.js index 3590a2f4c..5231d59c7 100644 --- a/src/sequelize/migrations/20180930164635-create-flow.js +++ b/src/sequelize/migrations/20180930164635-create-flow.js @@ -38,13 +38,13 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, updatedBy: { type: Sequelize.INTEGER, field: 'updated_by', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'set null', }, }) diff --git a/src/sequelize/migrations/20180930173823-create-registry.js b/src/sequelize/migrations/20180930173823-create-registry.js index b62d47ec0..64b3c433b 100644 --- a/src/sequelize/migrations/20180930173823-create-registry.js +++ b/src/sequelize/migrations/20180930173823-create-registry.js @@ -44,7 +44,7 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930184436-create-catalog-item.js b/src/sequelize/migrations/20180930184436-create-catalog-item.js index 8b14a1619..b68816428 100644 --- a/src/sequelize/migrations/20180930184436-create-catalog-item.js +++ b/src/sequelize/migrations/20180930184436-create-catalog-item.js @@ -55,14 +55,14 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, registryId: { type: Sequelize.INTEGER, field: 'registry_id', as: 'registryId', - references: {model: 'Registries', key: 'id'}, + references: { model: 'Registries', key: 'id' }, onDelete: 'set null', defaultValue: 1, }, diff --git a/src/sequelize/migrations/20180930184703-create-fog-type.js b/src/sequelize/migrations/20180930184703-create-fog-type.js index 43f91c2d8..5adce4282 100644 --- a/src/sequelize/migrations/20180930184703-create-fog-type.js +++ b/src/sequelize/migrations/20180930184703-create-fog-type.js @@ -24,19 +24,19 @@ module.exports = { networkCatalogItemId: { type: Sequelize.INTEGER, field: 'network_catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, halCatalogItemId: { type: Sequelize.INTEGER, field: 'hal_catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, bluetoothCatalogItemId: { type: Sequelize.INTEGER, field: 'bluetooth_catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930184921-create-catalog-item-image.js b/src/sequelize/migrations/20180930184921-create-catalog-item-image.js index c65f8f035..41e6a828c 100644 --- a/src/sequelize/migrations/20180930184921-create-catalog-item-image.js +++ b/src/sequelize/migrations/20180930184921-create-catalog-item-image.js @@ -16,13 +16,13 @@ module.exports = { catalogItemId: { type: Sequelize.INTEGER, field: 'catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, fogTypeId: { type: Sequelize.INTEGER, field: 'fog_type_id', - references: {model: 'FogTypes', key: 'id'}, + references: { model: 'FogTypes', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930194506-create-catalog-item-input-type.js b/src/sequelize/migrations/20180930194506-create-catalog-item-input-type.js index 6d13e5f5c..2f2e94e07 100644 --- a/src/sequelize/migrations/20180930194506-create-catalog-item-input-type.js +++ b/src/sequelize/migrations/20180930194506-create-catalog-item-input-type.js @@ -20,7 +20,7 @@ module.exports = { catalogItemId: { type: Sequelize.INTEGER, field: 'catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930195746-create-catalog-item-output-type.js b/src/sequelize/migrations/20180930195746-create-catalog-item-output-type.js index d8da6cd4a..238747c2d 100644 --- a/src/sequelize/migrations/20180930195746-create-catalog-item-output-type.js +++ b/src/sequelize/migrations/20180930195746-create-catalog-item-output-type.js @@ -20,7 +20,7 @@ module.exports = { catalogItemId: { type: Sequelize.INTEGER, field: 'catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930204039-create-email-activation-code.js b/src/sequelize/migrations/20180930204039-create-email-activation-code.js index c36d217fe..28f0a3439 100644 --- a/src/sequelize/migrations/20180930204039-create-email-activation-code.js +++ b/src/sequelize/migrations/20180930204039-create-email-activation-code.js @@ -20,7 +20,7 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930225403-create-fog.js b/src/sequelize/migrations/20180930225403-create-fog.js index 81b9de9c8..d15010d17 100644 --- a/src/sequelize/migrations/20180930225403-create-fog.js +++ b/src/sequelize/migrations/20180930225403-create-fog.js @@ -227,13 +227,13 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, fogTypeId: { type: Sequelize.INTEGER, field: 'fog_type_id', - references: {model: 'FogTypes', key: 'id'}, + references: { model: 'FogTypes', key: 'id' }, onDelete: 'set null', }, }) diff --git a/src/sequelize/migrations/20180930225846-create-change-tracking.js b/src/sequelize/migrations/20180930225846-create-change-tracking.js index ba9c45de7..e8761d9c8 100644 --- a/src/sequelize/migrations/20180930225846-create-change-tracking.js +++ b/src/sequelize/migrations/20180930225846-create-change-tracking.js @@ -56,7 +56,7 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930230219-create-fog-access-token.js b/src/sequelize/migrations/20180930230219-create-fog-access-token.js index 3c6f26e7b..fe3d7182c 100644 --- a/src/sequelize/migrations/20180930230219-create-fog-access-token.js +++ b/src/sequelize/migrations/20180930230219-create-fog-access-token.js @@ -20,13 +20,13 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930230626-create-fog-provision-key.js b/src/sequelize/migrations/20180930230626-create-fog-provision-key.js index c1efdec87..4b60040e8 100644 --- a/src/sequelize/migrations/20180930230626-create-fog-provision-key.js +++ b/src/sequelize/migrations/20180930230626-create-fog-provision-key.js @@ -21,7 +21,7 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930231241-create-fog-version-command.js b/src/sequelize/migrations/20180930231241-create-fog-version-command.js index 9bb62b460..f7383b1b8 100644 --- a/src/sequelize/migrations/20180930231241-create-fog-version-command.js +++ b/src/sequelize/migrations/20180930231241-create-fog-version-command.js @@ -16,7 +16,7 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930231536-create-hw-info.js b/src/sequelize/migrations/20180930231536-create-hw-info.js index 2ee12a6c0..24e496a85 100644 --- a/src/sequelize/migrations/20180930231536-create-hw-info.js +++ b/src/sequelize/migrations/20180930231536-create-hw-info.js @@ -27,7 +27,7 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930232242-create-usb-info.js b/src/sequelize/migrations/20180930232242-create-usb-info.js index c257e3cfc..02a34f5b0 100644 --- a/src/sequelize/migrations/20180930232242-create-usb-info.js +++ b/src/sequelize/migrations/20180930232242-create-usb-info.js @@ -27,7 +27,7 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20180930232508-create-tunnel.js b/src/sequelize/migrations/20180930232508-create-tunnel.js index c1349da89..d16a035c0 100644 --- a/src/sequelize/migrations/20180930232508-create-tunnel.js +++ b/src/sequelize/migrations/20180930232508-create-tunnel.js @@ -42,7 +42,7 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181001062956-create-microservice.js b/src/sequelize/migrations/20181001062956-create-microservice.js index 9ae717487..296c9f222 100644 --- a/src/sequelize/migrations/20181001062956-create-microservice.js +++ b/src/sequelize/migrations/20181001062956-create-microservice.js @@ -61,31 +61,31 @@ module.exports = { iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'set null', }, updatedBy: { type: Sequelize.INTEGER, field: 'updated_by', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'set null', }, catalogItemId: { type: Sequelize.INTEGER, field: 'catalog_item_id', - references: {model: 'CatalogItems', key: 'id'}, + references: { model: 'CatalogItems', key: 'id' }, onDelete: 'cascade', }, registryId: { type: Sequelize.INTEGER, field: 'registry_id', - references: {model: 'Registries', key: 'id'}, + references: { model: 'Registries', key: 'id' }, onDelete: 'cascade', }, flowId: { type: Sequelize.INTEGER, field: 'flow_id', - references: {model: 'Flows', key: 'id'}, + references: { model: 'Flows', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181001070828-create-microservice-port.js b/src/sequelize/migrations/20181001070828-create-microservice-port.js index a07cafb6d..c26983d03 100644 --- a/src/sequelize/migrations/20181001070828-create-microservice-port.js +++ b/src/sequelize/migrations/20181001070828-create-microservice-port.js @@ -34,13 +34,13 @@ module.exports = { microserviceUuid: { type: Sequelize.TEXT, field: 'microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, updatedBy: { type: Sequelize.INTEGER, field: 'updated_by', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181001071315-create-microservice-status.js b/src/sequelize/migrations/20181001071315-create-microservice-status.js index 07c78b948..d3326934a 100644 --- a/src/sequelize/migrations/20181001071315-create-microservice-status.js +++ b/src/sequelize/migrations/20181001071315-create-microservice-status.js @@ -40,7 +40,7 @@ module.exports = { microserviceUuid: { type: Sequelize.TEXT, field: 'microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181001071858-create-connector-port.js b/src/sequelize/migrations/20181001071858-create-connector-port.js index ca2437d88..9d65f1c24 100644 --- a/src/sequelize/migrations/20181001071858-create-connector-port.js +++ b/src/sequelize/migrations/20181001071858-create-connector-port.js @@ -58,7 +58,7 @@ module.exports = { connectorId: { type: Sequelize.INTEGER, field: 'connector_id', - references: {model: 'Connectors', key: 'id'}, + references: { model: 'Connectors', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181001073429-create-strace-diagnostics.js b/src/sequelize/migrations/20181001073429-create-strace-diagnostics.js index 778e3fd39..08cf5da0d 100644 --- a/src/sequelize/migrations/20181001073429-create-strace-diagnostics.js +++ b/src/sequelize/migrations/20181001073429-create-strace-diagnostics.js @@ -21,7 +21,7 @@ module.exports = { microserviceUuid: { type: Sequelize.TEXT, field: 'microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181003102815-create-volume-mapping.js b/src/sequelize/migrations/20181003102815-create-volume-mapping.js index 90f69d347..e9dd4625b 100644 --- a/src/sequelize/migrations/20181003102815-create-volume-mapping.js +++ b/src/sequelize/migrations/20181003102815-create-volume-mapping.js @@ -24,7 +24,7 @@ module.exports = { microserviceUuid: { type: Sequelize.TEXT, field: 'microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181003104606-create-access-token.js b/src/sequelize/migrations/20181003104606-create-access-token.js index 148e62181..298403aa0 100644 --- a/src/sequelize/migrations/20181003104606-create-access-token.js +++ b/src/sequelize/migrations/20181003104606-create-access-token.js @@ -20,7 +20,7 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20181022110529-create-routing.js b/src/sequelize/migrations/20181022110529-create-routing.js index d8b0fdbac..4217c36b4 100644 --- a/src/sequelize/migrations/20181022110529-create-routing.js +++ b/src/sequelize/migrations/20181022110529-create-routing.js @@ -17,43 +17,43 @@ module.exports = { sourceMicroserviceUuid: { type: Sequelize.TEXT, field: 'source_microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, destMicroserviceUuid: { type: Sequelize.TEXT, field: 'dest_microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, sourceNetworkMicroserviceUuid: { type: Sequelize.TEXT, field: 'source_network_microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'set null', }, destNetworkMicroserviceUuid: { type: Sequelize.TEXT, field: 'dest_network_microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'set null', }, sourceIofogUuid: { type: Sequelize.TEXT, field: 'source_iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'set null', }, destIofogUuid: { type: Sequelize.TEXT, field: 'dest_iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'set null', }, connectorPortId: { type: Sequelize.TEXT, field: 'connector_port_id', - references: {model: 'ConnectorPorts', key: 'id'}, + references: { model: 'ConnectorPorts', key: 'id' }, onDelete: 'set null', }, }) diff --git a/src/sequelize/migrations/20181022114905-create-microservice-public-mode.js b/src/sequelize/migrations/20181022114905-create-microservice-public-mode.js index 68583403c..4009d7e96 100644 --- a/src/sequelize/migrations/20181022114905-create-microservice-public-mode.js +++ b/src/sequelize/migrations/20181022114905-create-microservice-public-mode.js @@ -12,31 +12,31 @@ module.exports = { microserviceUuid: { type: Sequelize.TEXT, field: 'microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade', }, networkMicroserviceUuid: { type: Sequelize.TEXT, field: 'network_microservice_uuid', - references: {model: 'Microservices', key: 'uuid'}, + references: { model: 'Microservices', key: 'uuid' }, onDelete: 'set null', }, iofogUuid: { type: Sequelize.TEXT, field: 'iofog_uuid', - references: {model: 'Fogs', key: 'uuid'}, + references: { model: 'Fogs', key: 'uuid' }, onDelete: 'set null', }, microservicePortId: { type: Sequelize.TEXT, field: 'microservice_port_id', - references: {model: 'MicroservicePorts', key: 'id'}, + references: { model: 'MicroservicePorts', key: 'id' }, onDelete: 'set null', }, connectorPortId: { type: Sequelize.TEXT, field: 'connector_port_id', - references: {model: 'ConnectorPorts', key: 'id'}, + references: { model: 'ConnectorPorts', key: 'id' }, onDelete: 'set null', }, }) diff --git a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js index aeefca1cd..68f239e01 100644 --- a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js +++ b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js @@ -20,7 +20,7 @@ module.exports = { userId: { type: Sequelize.INTEGER, field: 'user_id', - references: {model: 'Users', key: 'id'}, + references: { model: 'Users', key: 'id' }, onDelete: 'cascade', }, }) diff --git a/src/sequelize/migrations/20190226111416-add-system-metrics-to-fog.js b/src/sequelize/migrations/20190226111416-add-system-metrics-to-fog.js new file mode 100644 index 000000000..0d1543c42 --- /dev/null +++ b/src/sequelize/migrations/20190226111416-add-system-metrics-to-fog.js @@ -0,0 +1,50 @@ +'use strict' + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn('Fogs', + 'system-available-memory', Sequelize.BIGINT + ).then(() => { + return queryInterface.addColumn('Fogs', + 'system-available-disk', Sequelize.BIGINT + ) + }).then(() => { + return queryInterface.addColumn('Fogs', + 'system-total-cpu', Sequelize.FLOAT + ) + }) + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeColumn('Fogs', 'system-available-memory') + .then(() => { + return queryInterface.removeColumn('Fogs', 'system-available-disk') + }).then(() => { + return queryInterface.removeColumn('Fogs', 'system-total-cpu') + }) + // restore constraints. Because Sequelize has problem with Sqlite constraints + .then(() => { + return queryInterface.addConstraint('Fogs', ['user_id'], { + type: 'FOREIGN KEY', + name: 'userId', + references: { + name: 'userId', + table: 'Users', + field: 'id', + }, + onDelete: 'cascade', + }) + }).then(() => { + return queryInterface.addConstraint('Fogs', ['fog_type_id'], { + type: 'FOREIGN KEY', + name: 'fogTypeId', + references: { + name: 'fogTypeId', + table: 'FogTypes', + field: 'id', + }, + onDelete: 'set null', + }) + }) + }, +} diff --git a/src/sequelize/migrations/20190227154512-create-scheduler-access-token.js b/src/sequelize/migrations/20190227154512-create-scheduler-access-token.js new file mode 100644 index 000000000..8b4ec9333 --- /dev/null +++ b/src/sequelize/migrations/20190227154512-create-scheduler-access-token.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('SchedulerAccessTokens', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + expirationTime: { + type: Sequelize.BIGINT, + field: 'expiration_time', + }, + token: { + type: Sequelize.TEXT, + field: 'token', + }, + userId: { + type: Sequelize.INTEGER, + field: 'user_id', + references: { model: 'Users', key: 'id' }, + onDelete: 'cascade', + }, + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('SchedulerAccessTokens') + }, +} diff --git a/src/sequelize/migrations/20190305142715-add-security-status-fields.js b/src/sequelize/migrations/20190305142715-add-security-status-fields.js new file mode 100644 index 000000000..7b752e34d --- /dev/null +++ b/src/sequelize/migrations/20190305142715-add-security-status-fields.js @@ -0,0 +1,44 @@ +'use strict' + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn('Fogs', + 'security_status', Sequelize.TEXT + ).then(() => { + return queryInterface.addColumn('Fogs', + 'security_violation_info', Sequelize.TEXT + ) + }) + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeColumn('Fogs', 'security_status') + .then(() => { + return queryInterface.removeColumn('Fogs', 'security_violation_info') + }) + // restore constraints. Because Sequelize has problem with Sqlite constraints + .then(() => { + return queryInterface.addConstraint('Fogs', ['user_id'], { + type: 'FOREIGN KEY', + name: 'userId', + references: { + name: 'userId', + table: 'Users', + field: 'id', + }, + onDelete: 'cascade', + }) + }).then(() => { + return queryInterface.addConstraint('Fogs', ['fog_type_id'], { + type: 'FOREIGN KEY', + name: 'fogTypeId', + references: { + name: 'fogTypeId', + table: 'FogTypes', + field: 'id', + }, + onDelete: 'set null', + }) + }) + }, +} diff --git a/src/sequelize/migrations/20190409055710-add-microservices-env.js b/src/sequelize/migrations/20190409055710-add-microservices-env.js new file mode 100644 index 000000000..8f2c13606 --- /dev/null +++ b/src/sequelize/migrations/20190409055710-add-microservices-env.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('MicroserviceEnvs', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + key: { + type: Sequelize.TEXT, + field: 'key', + }, + value: { + type: Sequelize.TEXT, + field: 'value', + }, + microserviceUuid: { + type: Sequelize.TEXT, + field: 'microservice_uuid', + references: { model: 'Microservices', key: 'uuid' }, + onDelete: 'cascade', + }, + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('MicroserviceEnvs') + }, +} diff --git a/src/sequelize/migrations/20190410055710-add-microservices-arg.js b/src/sequelize/migrations/20190410055710-add-microservices-arg.js new file mode 100644 index 000000000..5657f13e7 --- /dev/null +++ b/src/sequelize/migrations/20190410055710-add-microservices-arg.js @@ -0,0 +1,27 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('MicroserviceArgs', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + cmd: { + type: Sequelize.TEXT, + field: 'cmd', + }, + microserviceUuid: { + type: Sequelize.TEXT, + field: 'microservice_uuid', + references: { model: 'Microservices', key: 'uuid' }, + onDelete: 'cascade', + }, + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('MicroserviceArgs') + }, +} diff --git a/src/sequelize/models/fog.js b/src/sequelize/models/fog.js index 747d322d6..574dd397a 100644 --- a/src/sequelize/models/fog.js +++ b/src/sequelize/models/fog.js @@ -77,6 +77,28 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.TEXT, field: 'cpu_violation', }, + systemAvailableDisk: { + type: DataTypes.BIGINT, + field: 'system-available-disk', + }, + systemAvailableMemory: { + type: DataTypes.BIGINT, + field: 'system-available-memory', + }, + systemTotalCpu: { + type: DataTypes.FLOAT, + field: 'system-total-cpu', + }, + securityStatus: { + type: DataTypes.TEXT, + defaultValue: 'OK', + field: 'security_status', + }, + securityViolationInfo: { + type: DataTypes.TEXT, + defaultValue: 'No violation', + field: 'security_violation_info', + }, catalogItemStatus: { type: DataTypes.TEXT, field: 'catalog_item_status', diff --git a/src/sequelize/models/index.js b/src/sequelize/models/index.js index 6f62c8a79..935842be7 100644 --- a/src/sequelize/models/index.js +++ b/src/sequelize/models/index.js @@ -57,7 +57,9 @@ Object.keys(db).forEach((modelName) => { db.sequelize = sequelize db.Sequelize = Sequelize -db.migrate = () => createUmzug(path.resolve(__dirname, '../migrations')).up() -db.seed = () => createUmzug(path.resolve(__dirname, '../seeders')).up() +db.initDB = async () => { + await createUmzug(path.resolve(__dirname, '../migrations')).up() + await createUmzug(path.resolve(__dirname, '../seeders')).up() +} module.exports = db diff --git a/src/sequelize/models/microservice.js b/src/sequelize/models/microservice.js index 12c92ce78..5d22e9d78 100644 --- a/src/sequelize/models/microservice.js +++ b/src/sequelize/models/microservice.js @@ -10,7 +10,7 @@ module.exports = (sequelize, DataTypes) => { config: { type: DataTypes.TEXT, field: 'config', - defaultValue: '', + defaultValue: '{}', }, name: { type: DataTypes.TEXT, @@ -122,6 +122,17 @@ module.exports = (sequelize, DataTypes) => { foreignKey: 'microservice_uuid', as: 'microserviceStatus', }) + + Microservice.hasMany(models.MicroserviceEnv, { + foreignKey: 'microservice_uuid', + as: 'env', + }) + + Microservice.hasMany(models.MicroserviceArg, { + foreignKey: 'microservice_uuid', + as: 'cmd', + }) } + return Microservice } diff --git a/src/sequelize/models/microservicearg.js b/src/sequelize/models/microservicearg.js new file mode 100644 index 000000000..7824bba15 --- /dev/null +++ b/src/sequelize/models/microservicearg.js @@ -0,0 +1,30 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceArg = sequelize.define('MicroserviceArg', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + cmd: { + type: DataTypes.TEXT, + field: 'cmd', + }, + }, { + timestamps: false, + underscored: true, + }) + MicroserviceArg.associate = function(models) { + MicroserviceArg.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid', + }, + as: 'microservice', + onDelete: 'cascade', + }) + } + return MicroserviceArg +} diff --git a/src/sequelize/models/microserviceenv.js b/src/sequelize/models/microserviceenv.js new file mode 100644 index 000000000..3c36507d7 --- /dev/null +++ b/src/sequelize/models/microserviceenv.js @@ -0,0 +1,34 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceEnv = sequelize.define('MicroserviceEnv', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + key: { + type: DataTypes.TEXT, + field: 'key', + }, + value: { + type: DataTypes.TEXT, + field: 'value', + }, + }, { + timestamps: false, + underscored: true, + }) + MicroserviceEnv.associate = function(models) { + MicroserviceEnv.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid', + }, + as: 'microservice', + onDelete: 'cascade', + }) + } + return MicroserviceEnv +} diff --git a/src/sequelize/models/scheduleraccesstoken.js b/src/sequelize/models/scheduleraccesstoken.js new file mode 100644 index 000000000..314534272 --- /dev/null +++ b/src/sequelize/models/scheduleraccesstoken.js @@ -0,0 +1,34 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const SchedulerAccessToken = sequelize.define('SchedulerAccessToken', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + expirationTime: { + type: DataTypes.BIGINT, + field: 'expiration_time', + }, + token: { + type: DataTypes.TEXT, + field: 'token', + }, + }, { + timestamps: false, + underscored: true, + }) + SchedulerAccessToken.associate = function(models) { + SchedulerAccessToken.belongsTo(models.User, { + foreignKey: { + name: 'userId', + field: 'user_id', + }, + as: 'user', + onDelete: 'cascade', + }) + } + return SchedulerAccessToken +} diff --git a/src/sequelize/seeders/20190130112616-insert-logging-catalog-item.js b/src/sequelize/seeders/20190130112616-insert-logging-catalog-item.js index cf000c929..6d817320f 100644 --- a/src/sequelize/seeders/20190130112616-insert-logging-catalog-item.js +++ b/src/sequelize/seeders/20190130112616-insert-logging-catalog-item.js @@ -38,8 +38,8 @@ module.exports = { }, down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('CatalogItems', {ID: 100}, {}).then(() => { - return queryInterface.bulkDelete('CatalogItemImages', {catalog_item_id: 100}) + return queryInterface.bulkDelete('CatalogItems', { ID: 100 }, {}).then(() => { + return queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: 100 }) }) }, } diff --git a/src/sequelize/seeders/20190131111441-insert-json-generator-catalog-item.js b/src/sequelize/seeders/20190131111441-insert-json-generator-catalog-item.js index 0cb16b3eb..c7953c51a 100644 --- a/src/sequelize/seeders/20190131111441-insert-json-generator-catalog-item.js +++ b/src/sequelize/seeders/20190131111441-insert-json-generator-catalog-item.js @@ -34,8 +34,8 @@ module.exports = { }, down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('CatalogItems', {ID: 101}, {}).then(() => { - return queryInterface.bulkDelete('CatalogItemImages', {catalog_item_id: 101}) + return queryInterface.bulkDelete('CatalogItems', { ID: 101 }, {}).then(() => { + return queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: 101 }) }) }, } diff --git a/src/server.js b/src/server.js index 81d9fc1c8..ec10325ae 100644 --- a/src/server.js +++ b/src/server.js @@ -21,7 +21,7 @@ const fs = require('fs') const helmet = require('helmet') const https = require('https') const path = require('path') -const {renderFile} = require('ejs') +const { renderFile } = require('ejs') const xss = require('xss-clean') const packageJson = require('../package') @@ -31,7 +31,7 @@ const Sentry = require('@sentry/node') const Tracking = require('./tracking') const TrackingEventType = require('./enums/tracking-event-type') -Sentry.init({dsn: 'https://a15f11352d404c2aa4c8f321ad9e759a@sentry.io/1378602'}) +Sentry.init({ dsn: 'https://a15f11352d404c2aa4c8f321ad9e759a@sentry.io/1378602' }) Sentry.configureScope((scope) => { scope.setExtra('version', packageJson.version) }) @@ -125,8 +125,7 @@ function startHttpsServer(app, port, sslKey, sslCert, intermedKey, jobs) { } } -const - devMode = config.get('Server:DevMode') +const devMode = config.get('Server:DevMode') const port = config.get('Server:Port') const sslKey = config.get('Server:SslKey') const sslCert = config.get('Server:SslCert') diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 1888adc71..c0b09d9b0 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -88,8 +88,8 @@ const agentDeprovision = async function(deprovisionData, fog, transaction) { await Validator.validate(deprovisionData, Validator.schemas.agentDeprovision) await MicroserviceStatusManager.update( - {microserviceUuid: deprovisionData.microserviceUuids}, - {status: MicroserviceStates.NOT_RUNNING}, + { microserviceUuid: deprovisionData.microserviceUuids }, + { status: MicroserviceStates.NOT_RUNNING }, transaction ) @@ -97,8 +97,8 @@ const agentDeprovision = async function(deprovisionData, fog, transaction) { } const _invalidateFogNode = async function(fog, transaction) { - const where = {uuid: fog.uuid} - const data = {daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0'} + const where = { uuid: fog.uuid } + const data = { daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0' } await FogManager.update(where, data, transaction) const updatedFog = Object.assign({}, fog) updatedFog.daemonStatus = FogStates.UNKNOWN @@ -190,6 +190,11 @@ const updateAgentStatus = async function(agentStatus, fog, transaction) { memoryViolation: agentStatus.memoryViolation, diskViolation: agentStatus.diskViolation, cpuViolation: agentStatus.cpuViolation, + systemAvailableDisk: agentStatus.systemAvailableDisk, + systemAvailableMemory: agentStatus.systemAvailableMemory, + systemTotalCpu: agentStatus.systemTotalCpu, + securityStatus: agentStatus.securityStatus, + securityViolationInfo: agentStatus.securityViolationInfo, repositoryCount: agentStatus.repositoryCount, repositoryStatus: agentStatus.repositoryStatus, systemTime: agentStatus.systemTime, @@ -249,6 +254,13 @@ const getAgentMicroservices = async function(fog, transaction) { } const routes = await MicroserviceService.getPhysicalConnections(microservice, transaction) + const env = microservice.env && microservice.env.map((it) => { + return { + key: it.key, + value: it.value, + } + }) + const cmd = microservice.cmd && microservice.cmd.sort((a, b) => a.id > b.id).map((it) => it.cmd) const responseMicroservice = { uuid: microservice.uuid, @@ -256,7 +268,7 @@ const getAgentMicroservices = async function(fog, transaction) { config: microservice.config, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, - logSize: microservice.logSize, + logSize: parseInt(microservice.logSize) || 50, registryId: microservice.catalogItem.registry.id, portMappings: microservice.ports, volumeMappings: microservice.volumeMappings, @@ -264,6 +276,8 @@ const getAgentMicroservices = async function(fog, transaction) { delete: microservice.delete, deleteWithCleanup: microservice.deleteWithCleanup, routes: routes, + env: env, + cmd: cmd, } response.push(responseMicroservice) @@ -506,23 +520,23 @@ const agentProvisionWithTracking = TrackingDecorator.trackEvent(agentProvision, module.exports = { - agentProvision: TransactionDecorator.generateFakeTransaction(agentProvisionWithTracking), - agentDeprovision: TransactionDecorator.generateFakeTransaction(agentDeprovision), + agentProvision: TransactionDecorator.generateTransaction(agentProvisionWithTracking), + agentDeprovision: TransactionDecorator.generateTransaction(agentDeprovision), getAgentConfig: getAgentConfig, - updateAgentConfig: TransactionDecorator.generateFakeTransaction(updateAgentConfig), - getAgentConfigChanges: TransactionDecorator.generateFakeTransaction(getAgentConfigChanges), - updateAgentStatus: TransactionDecorator.generateFakeTransaction(updateAgentStatus), - getAgentMicroservices: TransactionDecorator.generateFakeTransaction(getAgentMicroservices), - getAgentMicroservice: TransactionDecorator.generateFakeTransaction(getAgentMicroservice), - getAgentRegistries: TransactionDecorator.generateFakeTransaction(getAgentRegistries), - getAgentTunnel: TransactionDecorator.generateFakeTransaction(getAgentTunnel), - getAgentStrace: TransactionDecorator.generateFakeTransaction(getAgentStrace), - updateAgentStrace: TransactionDecorator.generateFakeTransaction(updateAgentStrace), - getAgentChangeVersionCommand: TransactionDecorator.generateFakeTransaction(getAgentChangeVersionCommand), - updateHalHardwareInfo: TransactionDecorator.generateFakeTransaction(updateHalHardwareInfo), - updateHalUsbInfo: TransactionDecorator.generateFakeTransaction(updateHalUsbInfo), - deleteNode: TransactionDecorator.generateFakeTransaction(deleteNode), - getImageSnapshot: TransactionDecorator.generateFakeTransaction(getImageSnapshot), - putImageSnapshot: TransactionDecorator.generateFakeTransaction(putImageSnapshot), - postTracking: TransactionDecorator.generateFakeTransaction(postTracking), + updateAgentConfig: TransactionDecorator.generateTransaction(updateAgentConfig), + getAgentConfigChanges: TransactionDecorator.generateTransaction(getAgentConfigChanges), + updateAgentStatus: TransactionDecorator.generateTransaction(updateAgentStatus), + getAgentMicroservices: TransactionDecorator.generateTransaction(getAgentMicroservices), + getAgentMicroservice: TransactionDecorator.generateTransaction(getAgentMicroservice), + getAgentRegistries: TransactionDecorator.generateTransaction(getAgentRegistries), + getAgentTunnel: TransactionDecorator.generateTransaction(getAgentTunnel), + getAgentStrace: TransactionDecorator.generateTransaction(getAgentStrace), + updateAgentStrace: TransactionDecorator.generateTransaction(updateAgentStrace), + getAgentChangeVersionCommand: TransactionDecorator.generateTransaction(getAgentChangeVersionCommand), + updateHalHardwareInfo: TransactionDecorator.generateTransaction(updateHalHardwareInfo), + updateHalUsbInfo: TransactionDecorator.generateTransaction(updateHalUsbInfo), + deleteNode: TransactionDecorator.generateTransaction(deleteNode), + getImageSnapshot: TransactionDecorator.generateTransaction(getImageSnapshot), + putImageSnapshot: TransactionDecorator.generateTransaction(putImageSnapshot), + postTracking: TransactionDecorator.generateTransaction(postTracking), } diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 79c276502..550e059ac 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -27,9 +27,9 @@ const MicroseriveStates = require('../enums/microservice-state') const TrackingDecorator = require('../decorators/tracking-decorator') const TrackingEventType = require('../enums/tracking-event-type') -const createCatalogItem = async function(data, user, transaction) { +const createCatalogItemEndPoint = async function(data, user, transaction) { await Validator.validate(data, Validator.schemas.catalogItemCreate) - await _checkForDuplicateName(data.name, {userId: user.id}, transaction) + await _checkForDuplicateName(data.name, { userId: user.id }, transaction) await _checkForRestrictedPublisher(data.publisher) const catalogItem = await _createCatalogItem(data, user, transaction) await _createCatalogImages(data, catalogItem, transaction) @@ -41,7 +41,7 @@ const createCatalogItem = async function(data, user, transaction) { } } -const updateCatalogItem = async function(id, data, user, isCLI, transaction) { +const updateCatalogItemEndPoint = async function(id, data, user, isCLI, transaction) { await Validator.validate(data, Validator.schemas.catalogItemUpdate) const where = isCLI @@ -59,17 +59,17 @@ const updateCatalogItem = async function(id, data, user, isCLI, transaction) { await _updateCatalogItemIOTypes(data, where, transaction) } -const listCatalogItems = async function(user, isCLI, transaction) { +const listCatalogItemsEndPoint = async function(user, isCLI, transaction) { const where = isCLI ? {} : { - [Op.or]: [{userId: user.id}, {userId: null}], - [Op.or]: [{category: {[Op.ne]: 'SYSTEM'}}, {category: null}], + [Op.or]: [{ userId: user.id }, { userId: null }], + [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }], } const attributes = isCLI ? {} - : {exclude: ['userId']} + : { exclude: ['userId'] } const catalogItems = await CatalogItemManager.findAllWithDependencies(where, attributes, transaction) return { @@ -77,18 +77,18 @@ const listCatalogItems = async function(user, isCLI, transaction) { } } -const getCatalogItem = async function(id, user, isCLI, transaction) { +async function getCatalogItem(id, user, isCLI, transaction) { const where = isCLI - ? {id: id} + ? { id: id } : { id: id, - [Op.or]: [{userId: user.id}, {userId: null}], - [Op.or]: [{category: {[Op.ne]: 'SYSTEM'}}, {category: null}], + [Op.or]: [{ userId: user.id }, { userId: null }], + [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }], } const attributes = isCLI ? {} - : {exclude: ['userId']} + : { exclude: ['userId'] } const item = await CatalogItemManager.findOneWithDependencies(where, attributes, transaction) if (!item) { @@ -97,7 +97,11 @@ const getCatalogItem = async function(id, user, isCLI, transaction) { return item } -const deleteCatalogItem = async function(id, user, isCLI, transaction) { +const getCatalogItemEndPoint = async function(id, user, isCLI, transaction) { + return await getCatalogItem(id, user, isCLI, transaction) +} + +const deleteCatalogItemEndPoint = async function(id, user, isCLI, transaction) { const where = isCLI ? { id: id, @@ -154,8 +158,8 @@ async function getHalCatalogItem(transaction) { const _checkForDuplicateName = async function(name, item, transaction) { if (name) { const where = item.id - ? {[Op.or]: [{userId: item.userId}, {userId: null}], name: name, id: {[Op.ne]: item.id}} - : {[Op.or]: [{userId: item.userId}, {userId: null}], name: name} + ? { [Op.or]: [{ userId: item.userId }, { userId: null }], name: name, id: { [Op.ne]: item.id } } + : { [Op.or]: [{ userId: item.userId }, { userId: null }], name: name } const result = await CatalogItemManager.findOne(where, transaction) if (result) { @@ -196,7 +200,7 @@ const _createCatalogItem = async function(data, user, transaction) { catalogItem = AppHelper.deleteUndefinedFields(catalogItem) if (catalogItem.registryId) { - const registry = await RegistryManager.findOne({id: catalogItem.registryId}, transaction) + const registry = await RegistryManager.findOne({ id: catalogItem.registryId }, transaction) if (!registry) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, data.registryId)) } @@ -282,7 +286,7 @@ const _updateCatalogItem = async function(data, where, transaction) { return } if (data.registryId) { - const registry = await RegistryManager.findOne({id: data.registryId}, transaction) + const registry = await RegistryManager.findOne({ id: data.registryId }, transaction) if (!registry) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, data.registryId)) } @@ -300,7 +304,7 @@ const _updateCatalogItem = async function(data, where, transaction) { const _updateCatalogItemImages = async function(data, transaction) { if (data.images) { - const microservices = await MicroserviceManager.findAllWithStatuses({catalogItemId: data.id}, transaction) + const microservices = await MicroserviceManager.findAllWithStatuses({ catalogItemId: data.id }, transaction) for (const ms of microservices) { if (ms.microserviceStatus.status === MicroseriveStates.RUNNING) { throw new Errors.ValidationError(ErrorMessages.CATALOG_ITEM_IMAGES_IS_FROZEN) @@ -328,7 +332,7 @@ const _updateCatalogItemIOTypes = async function(data, where, transaction) { infoFormat: data.inputType.infoFormat, } inputType = AppHelper.deleteUndefinedFields(inputType) - await CatalogItemInputTypeManager.updateOrCreate({catalogItemId: data.id}, inputType, transaction) + await CatalogItemInputTypeManager.updateOrCreate({ catalogItemId: data.id }, inputType, transaction) } if (data.outputType && data.outputType.length !== 0) { let outputType = { @@ -337,19 +341,20 @@ const _updateCatalogItemIOTypes = async function(data, where, transaction) { infoFormat: data.outputType.infoFormat, } outputType = AppHelper.deleteUndefinedFields(outputType) - await CatalogItemOutputTypeManager.updateOrCreate({catalogItemId: data.id}, outputType, transaction) + await CatalogItemOutputTypeManager.updateOrCreate({ catalogItemId: data.id }, outputType, transaction) } } // decorated functions -const createCatalogItemWithTracking = TrackingDecorator.trackEvent(createCatalogItem, TrackingEventType.CATALOG_CREATED) +const createCatalogItemWithTracking = TrackingDecorator.trackEvent(createCatalogItemEndPoint, TrackingEventType.CATALOG_CREATED) module.exports = { - createCatalogItem: TransactionDecorator.generateTransaction(createCatalogItemWithTracking), - listCatalogItems: TransactionDecorator.generateTransaction(listCatalogItems), - getCatalogItem: TransactionDecorator.generateTransaction(getCatalogItem), - deleteCatalogItem: TransactionDecorator.generateTransaction(deleteCatalogItem), - updateCatalogItem: TransactionDecorator.generateTransaction(updateCatalogItem), + createCatalogItemEndPoint: TransactionDecorator.generateTransaction(createCatalogItemWithTracking), + listCatalogItemsEndPoint: TransactionDecorator.generateTransaction(listCatalogItemsEndPoint), + getCatalogItemEndPoint: TransactionDecorator.generateTransaction(getCatalogItemEndPoint), + deleteCatalogItemEndPoint: TransactionDecorator.generateTransaction(deleteCatalogItemEndPoint), + updateCatalogItemEndPoint: TransactionDecorator.generateTransaction(updateCatalogItemEndPoint), + getCatalogItem: getCatalogItem, getNetworkCatalogItem: getNetworkCatalogItem, getBluetoothCatalogItem: getBluetoothCatalogItem, getHalCatalogItem: getHalCatalogItem, diff --git a/src/services/change-tracking-service.js b/src/services/change-tracking-service.js index 337ad1353..d8e2f283b 100644 --- a/src/services/change-tracking-service.js +++ b/src/services/change-tracking-service.js @@ -72,19 +72,19 @@ const events = Object.freeze({ }) async function create(ioFogUuid, transaction) { - await ChangeTrackingManager.create({iofogUuid: ioFogUuid}, transaction) + await ChangeTrackingManager.create({ iofogUuid: ioFogUuid }, transaction) } async function update(ioFogUuid, data, transaction) { - await ChangeTrackingManager.update({iofogUuid: ioFogUuid}, data, transaction) + await ChangeTrackingManager.update({ iofogUuid: ioFogUuid }, data, transaction) } async function updateIfChanged(ioFogUuid, data, transaction) { - await ChangeTrackingManager.updateIfChanged({iofogUuid: ioFogUuid}, data, transaction) + await ChangeTrackingManager.updateIfChanged({ iofogUuid: ioFogUuid }, data, transaction) } async function getByIoFogUuid(ioFogUuid, transaction) { - return await ChangeTrackingManager.findOne({iofogUuid: ioFogUuid}, transaction) + return await ChangeTrackingManager.findOne({ iofogUuid: ioFogUuid }, transaction) } module.exports = { diff --git a/src/services/connector-port-service.js b/src/services/connector-port-service.js index 29d841704..5083696ff 100644 --- a/src/services/connector-port-service.js +++ b/src/services/connector-port-service.js @@ -40,7 +40,7 @@ async function openPortOnRandomConnector(isPublicAccess, transaction) { throw new Error('Not able to open port on remote Connector. Gave up after 5 attempts.') } ports.connectorId = connector.id - return {ports: ports, connector: connector} + return { ports: ports, connector: connector } } async function _openPortsOnConnector(connector, isPublicAccess) { diff --git a/src/services/connector-service.js b/src/services/connector-service.js index 13defb83b..b50062c7e 100644 --- a/src/services/connector-service.js +++ b/src/services/connector-service.js @@ -22,7 +22,7 @@ const Op = require('sequelize').Op const ConnectorPortManager = require('../sequelize/managers/connector-port-manager') const MicroserviceService = require('../services/microservices-service') -async function createConnector(connectorData, transaction) { +async function createConnector (connectorData, transaction) { await Validator.validate(connectorData, Validator.schemas.connectorCreate) _validateConnectorData(connectorData) const connector = await ConnectorManager.findOne({ @@ -41,10 +41,10 @@ async function createConnector(connectorData, transaction) { if (connector) { throw new Errors.ValidationError(ErrorMessages.ALREADY_EXISTS) } - return await ConnectorManager.create(connectorData, transaction) + return ConnectorManager.create(connectorData, transaction) } -async function updateConnector(connectorData, transaction) { +async function updateConnector (connectorData, transaction) { await Validator.validate(connectorData, Validator.schemas.connectorUpdate) _validateConnectorData(connectorData) const queryConnectorData = { @@ -59,12 +59,13 @@ async function updateConnector(connectorData, transaction) { } await ConnectorManager.update(queryConnectorData, connectorData, transaction) - const updatedConnector = await ConnectorManager.findOne({publicIp: connectorData.publicIp}, transaction) + const updatedConnector = await ConnectorManager.findOne({ publicIp: connectorData.publicIp }, transaction) await MicroserviceService.updateRouteOverConnector(updatedConnector, transaction) await MicroserviceService.updatePortMappingOverConnector(updatedConnector, transaction) + return updatedConnector } -async function deleteConnector(connectorData, transaction) { +async function deleteConnector (connectorData, transaction) { await Validator.validate(connectorData, Validator.schemas.connectorDelete) const queryConnectorData = { publicIp: connectorData.publicIp, @@ -73,18 +74,18 @@ async function deleteConnector(connectorData, transaction) { if (!connector) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_CONNECTOR_IP, connectorData.publicIp)) } - const ports = await ConnectorPortManager.findAll({connectorId: connector.id}, transaction) + const ports = await ConnectorPortManager.findAll({ connectorId: connector.id }, transaction) if (ports && ports.length > 0) { throw new Errors.ValidationError(ErrorMessages.CONNECTOR_IS_IN_USE) } await ConnectorManager.delete(queryConnectorData, transaction) } -async function getConnectorList(transaction) { - return await ConnectorManager.findAll({}, transaction) +async function getConnectorList (transaction) { + return ConnectorManager.findAll({}, transaction) } -function _validateConnectorData(connectorData) { +function _validateConnectorData (connectorData) { if (connectorData.domain) { const validDomain = AppHelper.isValidDomain(connectorData.domain) || AppHelper.isValidPublicIP(connectorData.domain) if (!validDomain) { diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index bd560c0bc..f8dd29fce 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -29,7 +29,7 @@ const mime = require('mime') const changeMicroserviceStraceState = async function(uuid, data, user, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceStateUpdate) - const microservice = await MicroserviceService.getMicroservice(uuid, user, isCLI, transaction) + const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, user, isCLI, transaction) if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.STRACE_WITHOUT_FOG) } @@ -39,7 +39,7 @@ const changeMicroserviceStraceState = async function(uuid, data, user, isCLI, tr microserviceUuid: uuid, } - await StraceDiagnosticManager.updateOrCreate({microserviceUuid: uuid}, straceObj, transaction) + await StraceDiagnosticManager.updateOrCreate({ microserviceUuid: uuid }, straceObj, transaction) await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.diagnostics, transaction) } @@ -47,14 +47,14 @@ const getMicroserviceStraceData = async function(uuid, data, user, isCLI, transa await Validator.validate(data, Validator.schemas.straceGetData) const microserviceWhere = isCLI - ? {uuid: uuid} - : {uuid: uuid, userId: user.id} + ? { uuid: uuid } + : { uuid: uuid, userId: user.id } const microservice = await MicroserviceManager.findOne(microserviceWhere, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, uuid)) } - const straceData = await StraceDiagnosticManager.findOne({microserviceUuid: uuid}, transaction) + const straceData = await StraceDiagnosticManager.findOne({ microserviceUuid: uuid }, transaction) if (!straceData) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_STRACE, uuid)) } @@ -80,13 +80,13 @@ const postMicroserviceStraceDatatoFtp = async function(uuid, data, user, isCLI, await Validator.validate(data, Validator.schemas.stracePostToFtp) const microserviceWhere = isCLI - ? {uuid: uuid} - : {uuid: uuid, userId: user.id} + ? { uuid: uuid } + : { uuid: uuid, userId: user.id } const microservice = await MicroserviceManager.findOne(microserviceWhere, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, uuid)) } - const straceData = await StraceDiagnosticManager.findOne({microserviceUuid: uuid}, transaction) + const straceData = await StraceDiagnosticManager.findOne({ microserviceUuid: uuid }, transaction) if (!straceData) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_STRACE, uuid)) @@ -126,7 +126,7 @@ const postMicroserviceImageSnapshotCreate = async function(microserviceUuid, use imageSnapshot: 'get_image', } - await MicroserviceManager.update({uuid: microservice.uuid}, microserviceToUpdate, transaction) + await MicroserviceManager.update({ uuid: microservice.uuid }, microserviceToUpdate, transaction) await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.imageSnapshot, transaction) } @@ -156,7 +156,7 @@ const getMicroserviceImageSnapshot = async function(microserviceUuid, user, isCL throw new Errors.ValidationError(ErrorMessages.IMAGE_SNAPSHOT_NOT_AVAILABLE) } const _path = microservice.imageSnapshot - await MicroserviceManager.update({uuid: microservice.uuid}, microserviceToUpdate, transaction) + await MicroserviceManager.update({ uuid: microservice.uuid }, microserviceToUpdate, transaction) if (isCLI) { return _path } else { diff --git a/src/services/flow-service.js b/src/services/flow-service.js index f4bbee326..f17179e92 100644 --- a/src/services/flow-service.js +++ b/src/services/flow-service.js @@ -21,7 +21,7 @@ const ChangeTrackingService = require('./change-tracking-service') const Sequelize = require('sequelize') const Op = Sequelize.Op -const createFlow = async function(flowData, user, isCLI, transaction) { +const createFlowEndPoint = async function(flowData, user, isCLI, transaction) { await Validator.validate(flowData, Validator.schemas.flowCreate) await _checkForDuplicateName(flowData.name, null, user.id, transaction) @@ -42,7 +42,7 @@ const createFlow = async function(flowData, user, isCLI, transaction) { } } -const deleteFlow = async function(flowId, user, isCLI, transaction) { +const deleteFlowEndPoint = async function(flowId, user, isCLI, transaction) { const whereObj = { id: flowId, userId: user.id, @@ -54,10 +54,10 @@ const deleteFlow = async function(flowId, user, isCLI, transaction) { await FlowManager.delete(where, transaction) } -const updateFlow = async function(flowData, flowId, user, isCLI, transaction) { +const updateFlowEndPoint = async function(flowData, flowId, user, isCLI, transaction) { await Validator.validate(flowData, Validator.schemas.flowUpdate) - const oldFlow = await getFlow(flowId, user, isCLI, transaction) + const oldFlow = await getFlowEndPoint(flowId, user, isCLI, transaction) if (!oldFlow) { throw new Errors.NotFoundError(ErrorMessages.INVALID_FLOW_ID) } @@ -74,8 +74,8 @@ const updateFlow = async function(flowData, flowId, user, isCLI, transaction) { const updateFlowData = AppHelper.deleteUndefinedFields(flow) const where = isCLI - ? {id: flowId} - : {id: flowId, userId: user.id} + ? { id: flowId } + : { id: flowId, userId: user.id } await FlowManager.update(where, updateFlowData, transaction) @@ -84,32 +84,32 @@ const updateFlow = async function(flowData, flowId, user, isCLI, transaction) { } } -const getUserFlows = async function(user, isCLI, transaction) { +const getUserFlowsEndPoint = async function(user, isCLI, transaction) { const flow = { userId: user.id, } - const attributes = {exclude: ['created_at', 'updated_at']} + const attributes = { exclude: ['created_at', 'updated_at'] } const flows = await FlowManager.findAllWithAttributes(flow, attributes, transaction) return { flows: flows, } } -const getAllFlows = async function(isCLI, transaction) { - const attributes = {exclude: ['created_at', 'updated_at']} +const getAllFlowsEndPoint = async function(isCLI, transaction) { + const attributes = { exclude: ['created_at', 'updated_at'] } const flows = await FlowManager.findAllWithAttributes({}, attributes, transaction) return { flows: flows, } } -const getFlow = async function(flowId, user, isCLI, transaction) { +async function getFlow(flowId, user, isCLI, transaction) { const where = isCLI - ? {id: flowId} - : {id: flowId, userId: user.id} + ? { id: flowId } + : { id: flowId, userId: user.id } - const attributes = {exclude: ['created_at', 'updated_at']} + const attributes = { exclude: ['created_at', 'updated_at'] } const flow = await FlowManager.findOneWithAttributes(where, attributes, transaction) @@ -119,12 +119,30 @@ const getFlow = async function(flowId, user, isCLI, transaction) { return flow } +const getFlowByName = async function(flowName, user, isCLI, transaction) { + const where = isCLI + ? { name: flowName } + : { name: flowName, userId: user.id } + + const attributes = { exclude: ['created_at', 'updated_at'] } + + const flow = await FlowManager.findOneWithAttributes(where, attributes, transaction) + + if (!flow) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, flowId)) + } + return flow +} + +const getFlowEndPoint = async function(flowId, user, isCLI, transaction) { + return await getFlow(flowId, user, isCLI, transaction) +} const _checkForDuplicateName = async function(name, flowId, userId, transaction) { if (name) { const where = flowId - ? {name: name, userId: userId, id: {[Op.ne]: flowId}} - : {name: name, userId: userId} + ? { name: name, userId: userId, id: { [Op.ne]: flowId } } + : { name: name, userId: userId } const result = await FlowManager.findOne(where, transaction) if (result) { @@ -134,7 +152,7 @@ const _checkForDuplicateName = async function(name, flowId, userId, transaction) } async function _updateChangeTrackingsByFlowId(flowId, transaction) { - const flowWithMicroservices = await FlowManager.findFlowMicroservices({id: flowId}, transaction) + const flowWithMicroservices = await FlowManager.findFlowMicroservices({ id: flowId }, transaction) if (!flowWithMicroservices) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, flowId)) } @@ -149,11 +167,12 @@ async function _updateChangeTrackingsByFlowId(flowId, transaction) { } module.exports = { - createFlow: TransactionDecorator.generateTransaction(createFlow), - deleteFlow: TransactionDecorator.generateTransaction(deleteFlow), - updateFlow: TransactionDecorator.generateTransaction(updateFlow), - getUserFlows: TransactionDecorator.generateTransaction(getUserFlows), - getAllFlows: TransactionDecorator.generateTransaction(getAllFlows), - getFlowWithTransaction: TransactionDecorator.generateTransaction(getFlow), + createFlowEndPoint: TransactionDecorator.generateTransaction(createFlowEndPoint), + deleteFlowEndPoint: TransactionDecorator.generateTransaction(deleteFlowEndPoint), + updateFlowEndPoint: TransactionDecorator.generateTransaction(updateFlowEndPoint), + getUserFlowsEndPoint: TransactionDecorator.generateTransaction(getUserFlowsEndPoint), + getAllFlowsEndPoint: TransactionDecorator.generateTransaction(getAllFlowsEndPoint), + getFlowEndPoint: TransactionDecorator.generateTransaction(getFlowEndPoint), + getFlowByName: TransactionDecorator.generateTransaction(getFlowByName), getFlow: getFlow, } diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 3bb9983e9..bcd27339d 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -11,6 +11,8 @@ * */ +const request = require('request-promise') + const TransactionDecorator = require('../decorators/transaction-decorator') const AppHelper = require('../helpers/app-helper') const FogManager = require('../sequelize/managers/iofog-manager') @@ -27,8 +29,9 @@ const MicroserviceManager = require('../sequelize/managers/microservice-manager' const FogStates = require('../enums/fog-state') const TrackingDecorator = require('../decorators/tracking-decorator') const TrackingEventType = require('../enums/tracking-event-type') +const config = require('../config') -async function createFog(fogData, user, isCLI, transaction) { +async function createFogEndPoint(fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) let createFogData = { @@ -76,15 +79,19 @@ async function createFog(fogData, user, isCLI, transaction) { await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) + try { + await informKubelet(fog.uuid, 'POST') + } catch (e) {} + return res } -async function updateFog(fogData, user, isCLI, transaction) { +async function updateFogEndPoint(fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogUpdate) const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } let updateFogData = { name: fogData.name, @@ -144,90 +151,49 @@ async function updateFog(fogData, user, isCLI, transaction) { } } -async function deleteFog(fogData, user, isCLI, transaction) { +async function deleteFogEndPoint(fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogDelete) const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } const fog = await FogManager.findOne(queryFogData, transaction) if (!fog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } await _processDeleteCommand(fog, transaction) + + try { + await informKubelet(fog.uuid, 'DELETE') + } catch (e) {} } async function getFog(fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGet) const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } const fog = await FogManager.findOne(queryFogData, transaction) if (!fog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - return { - uuid: fog.uuid, - name: fog.name, - location: fog.location, - gpsMode: fog.gpsMode, - latitude: fog.latitude, - longitude: fog.longitude, - description: fog.description, - lastActive: fog.lastActive, - daemonStatus: fog.daemonStatus, - daemonOperatingDuration: fog.daemonOperatingDuration, - daemonLastStart: fog.daemonLastStart, - memoryUsage: fog.memoryUsage, - diskUsage: fog.diskUsage, - cpuUsage: fog.cpuUsage, - memoryViolation: fog.memoryViolation, - diskViolation: fog.diskViolation, - cpuViolation: fog.cpuViolation, - catalogItemStatus: fog.catalogItemStatus, - repositoryCount: fog.repositoryCount, - repositoryStatus: fog.repositoryStatus, - systemTime: fog.systemTime, - lastStatusTime: fog.lastStatusTime, - ipAddress: fog.ipAddress, - processedMessages: fog.processedMessages, - catalogItemMessageCounts: fog.catalogItemMessageCounts, - messageSpeed: fog.messageSpeed, - lastCommandTime: fog.lastCommandTime, - networkInterface: fog.networkInterface, - dockerUrl: fog.dockerUrl, - diskLimit: fog.diskLimit, - diskDirectory: fog.diskDirectory, - memoryLimit: fog.memoryLimit, - cpuLimit: fog.cpuLimit, - logLimit: fog.logLimit, - logDirectory: fog.logDirectory, - bluetoothEnabled: fog.bluetoothEnabled, - abstractedHardwareEnabled: fog.abstractedHardwareEnabled, - logFileCount: fog.logFileCount, - version: fog.version, - isReadyToUpgrade: fog.isReadyToUpgrade, - isReadyToRollback: fog.isReadyToRollback, - statusFrequency: fog.statusFrequency, - changeFrequency: fog.changeFrequency, - deviceScanFrequency: fog.deviceScanFrequency, - tunnel: fog.tunnel, - watchdogEnabled: fog.watchdogEnabled, - fogTypeId: fog.fogTypeId, - userId: fog.userId, - } + return fog } -async function getFogList(filters, user, isCLI, transaction) { +async function getFogEndPoint(fogData, user, isCLI, transaction) { + return await getFog(fogData, user, isCLI, transaction) +} + +async function getFogListEndPoint(filters, user, isCLI, transaction) { await Validator.validate(filters, Validator.schemas.iofogFilters) const queryFogData = isCLI ? {} - : {userId: user.id} + : { userId: user.id } let fogs = await FogManager.findAll(queryFogData, transaction) fogs = _filterFogs(fogs, filters) @@ -237,12 +203,12 @@ async function getFogList(filters, user, isCLI, transaction) { } } -async function generateProvisioningKey(fogData, user, isCLI, transaction) { +async function generateProvisioningKeyEndPoint(fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGenerateProvision) const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } const newProvision = { iofogUuid: fogData.uuid, @@ -254,7 +220,7 @@ async function generateProvisioningKey(fogData, user, isCLI, transaction) { if (!fog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({iofogUuid: fogData.uuid}, newProvision, transaction) + const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({ iofogUuid: fogData.uuid }, newProvision, transaction) return { key: provisioningKeyData.provisionKey, @@ -262,12 +228,12 @@ async function generateProvisioningKey(fogData, user, isCLI, transaction) { } } -async function setFogVersionCommand(fogVersionData, user, isCLI, transaction) { +async function setFogVersionCommandEndPoint(fogVersionData, user, isCLI, transaction) { await Validator.validate(fogVersionData, Validator.schemas.iofogSetVersionCommand) const queryFogData = isCLI - ? {uuid: fogVersionData.uuid} - : {uuid: fogVersionData.uuid, userId: user.id} + ? { uuid: fogVersionData.uuid } + : { uuid: fogVersionData.uuid, userId: user.id } const newVersionCommand = { iofogUuid: fogVersionData.uuid, @@ -286,17 +252,17 @@ async function setFogVersionCommand(fogVersionData, user, isCLI, transaction) { throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_UPGRADE) } - await generateProvisioningKey({uuid: fogVersionData.uuid}, user, isCLI, transaction) - await FogVersionCommandManager.updateOrCreate({iofogUuid: fogVersionData.uuid}, newVersionCommand, transaction) + await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, user, isCLI, transaction) + await FogVersionCommandManager.updateOrCreate({ iofogUuid: fogVersionData.uuid }, newVersionCommand, transaction) await ChangeTrackingService.update(fogVersionData.uuid, ChangeTrackingService.events.version, transaction) } -async function setFogRebootCommand(fogData, user, isCLI, transaction) { +async function setFogRebootCommandEndPoint(fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogReboot) const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } const fog = await FogManager.findOne(queryFogData, transaction) if (!fog) { @@ -306,7 +272,7 @@ async function setFogRebootCommand(fogData, user, isCLI, transaction) { await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) } -async function getHalHardwareInfo(uuidObj, user, isCLI, transaction) { +async function getHalHardwareInfoEndPoint(uuidObj, user, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -321,7 +287,7 @@ async function getHalHardwareInfo(uuidObj, user, isCLI, transaction) { }, transaction) } -async function getHalUsbInfo(uuidObj, user, isCLI, transaction) { +async function getHalUsbInfoEndPoint(uuidObj, user, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -364,7 +330,7 @@ function _filterFogs(fogs, filters) { async function _processDeleteCommand(fog, transaction) { if (!fog.daemonStatus || fog.daemonStatus === FogStates.UNKNOWN) { - await FogManager.delete({uuid: fog.uuid}, transaction) + await FogManager.delete({ uuid: fog.uuid }, transaction) } else { await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.deleteNode, transaction) } @@ -427,18 +393,31 @@ async function _deleteBluetoothMicroserviceByFog(fogData, transaction) { } // decorated functions -const createFogWithTracking = TrackingDecorator.trackEvent(createFog, TrackingEventType.IOFOG_CREATED) +const createFogWithTracking = TrackingDecorator.trackEvent(createFogEndPoint, TrackingEventType.IOFOG_CREATED) + +const informKubelet = function(iofogUuid, method) { + const kubeletUri = config.get('Kubelet:Uri') + const options = { + uri: kubeletUri + '/node', + qs: { + uuid: iofogUuid, + }, + method: method, + } + + return request(options) +} module.exports = { - createFog: TransactionDecorator.generateTransaction(createFogWithTracking), - updateFog: TransactionDecorator.generateTransaction(updateFog), - deleteFog: TransactionDecorator.generateTransaction(deleteFog), - getFogWithTransaction: TransactionDecorator.generateTransaction(getFog), - getFogList: TransactionDecorator.generateTransaction(getFogList), - generateProvisioningKey: TransactionDecorator.generateTransaction(generateProvisioningKey), - setFogVersionCommand: TransactionDecorator.generateTransaction(setFogVersionCommand), - setFogRebootCommand: TransactionDecorator.generateTransaction(setFogRebootCommand), - getHalHardwareInfo: TransactionDecorator.generateTransaction(getHalHardwareInfo), - getHalUsbInfo: TransactionDecorator.generateTransaction(getHalUsbInfo), + createFogEndPoint: TransactionDecorator.generateTransaction(createFogWithTracking), + updateFogEndPoint: TransactionDecorator.generateTransaction(updateFogEndPoint), + deleteFogEndPoint: TransactionDecorator.generateTransaction(deleteFogEndPoint), + getFogEndPoint: TransactionDecorator.generateTransaction(getFogEndPoint), + getFogListEndPoint: TransactionDecorator.generateTransaction(getFogListEndPoint), + generateProvisioningKeyEndPoint: TransactionDecorator.generateTransaction(generateProvisioningKeyEndPoint), + setFogVersionCommandEndPoint: TransactionDecorator.generateTransaction(setFogVersionCommandEndPoint), + setFogRebootCommandEndPoint: TransactionDecorator.generateTransaction(setFogRebootCommandEndPoint), + getHalHardwareInfoEndPoint: TransactionDecorator.generateTransaction(getHalHardwareInfoEndPoint), + getHalUsbInfoEndPoint: TransactionDecorator.generateTransaction(getHalUsbInfoEndPoint), getFog: getFog, } diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index 8c2623754..3a933d1c8 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -11,40 +11,330 @@ * */ +const moment = require('moment') + +const AppHelper = require('../helpers/app-helper') +const ErrorMessages = require('../helpers/error-messages') +const Errors = require('../helpers/errors') +const FlowService = require('./flow-service') +const FogManager = require('../sequelize/managers/iofog-manager') +const IOFogService = require('./iofog-service') const KubeletAccessTokenService = require('./kubelet-access-token-service') +const MicroservicesService = require('./microservices-service') +const MicroserviceStatusManager = require('../sequelize/managers/microservice-status-manager') +const SchedulerAccessTokenService = require('./scheduler-access-token-service') const TransactionDecorator = require('../decorators/transaction-decorator') -const kubeletCreatePod = async function(createPodData, fogNodeUuid, transaction) { - // TODO: to implement +const NODE_CAPACITY = 100 + +const processPodPayload = function (createPodData, fogNodeUuid) { + const msMetadata = JSON.parse(createPodData.metadata.annotations.microservices) + const flowDescription = { + metadata: createPodData, + node: fogNodeUuid, + } + + const flowData = { + name: createPodData.metadata.name, + isActivated: true, + description: Buffer.from(JSON.stringify(flowDescription)).toString('base64'), + } + + const microservices = microservicesTopologicalOrder(msMetadata) + + return { + flowData, + microservices, + } +} + +const kubeletCreatePod = async function (createPodData, fogNodeUuid, user, transaction) { + const podPayload = processPodPayload(createPodData, fogNodeUuid) + const { flowData, microservices } = podPayload + + const flows = await FlowService.getAllFlowsEndPoint(false, transaction) + let flow = flows.flows.find((flow) => flow.name === flowData.name) + if (!flow) { + flow = await FlowService.createFlowEndPoint(flowData, user, false, transaction) + } + + const existingMicroservices = await MicroservicesService.listMicroservicesEndPoint(flow.id, user, false, transaction) + + const microservicesIds = [] + for (const ms of microservices) { + const name = `${flowData.name}-${ms.name}` + const existingMicroservice = existingMicroservices.microservices.find((it) => it.name === name) + if (existingMicroservice) { + microservicesIds.push(existingMicroservice.uuid) + continue + } + + ms.routes = ms.routes || [] + ms.routes = ms.routes.map((route) => { + if (!route.startsWith('@')) { + return route + } + const routeId = route.substr(1) * 1 + const idx = microservices.findIndex((it) => it.originalIndex == routeId) + return microservicesIds[idx] + }) + + const microserviceData = { + name: name, + config: ms.config, + catalogItemId: ms['catalog-item-id'], + flowId: flow.id, + iofogUuid: fogNodeUuid, + rootHostAccess: ms['host-access'], + volumeMappings: ms['volume-mappings'] || [], + ports: ms.ports || [], + routes: ms.routes || [], + } + if (ms.env && ms.env.length > 0) { + microserviceData.env = ms.env + } + if (ms.cmd && ms.cmd.length > 0) { + microserviceData.cmd = ms.cmd + } + + microservice = await MicroservicesService.createMicroserviceEndPoint(microserviceData, user, false, transaction) + microservicesIds.push(microservice.uuid) + } +} + +const kubeletUpdatePod = async function (uploadPodData, fogNodeUuid, user, transaction) { + const podPayload = processPodPayload(createPodData, iofogUuid) + const { flowData, microservices } = podPayload + + const flows = await FlowService.getAllFlowsEndPoint(false, transaction) + const flow = flows.flows.find((flow) => flow.name === flowData.name) + if (!flow) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, flowData.name)) + } + + const existingMicroservices = await MicroservicesService.listMicroservicesEndPoint(flow.id, user, false, transaction) + const msDup = [].concat(microservices) + const toDelete = [] + existingMicroservices.forEach((ms) => { + const name = `${flowData.name}-${ms.name}` + const idx = msDup.findIndex((it) => it.name === name) + + if (!idx) { + toDelete.push(ms) + } else { + toUpdate.push(msDup[idx]) + msDup = msDup.splice(idx, 1) + } + }) + + msDup.map((ms) => { + const name = `${flowData.name}-${ms.name}` + + const microserviceData = { + name: name, + config: ms.config, + catalogItemId: ms['catalog-item-id'], + flowId: flow.id, + iofogUuid: fogNodeUuid, + rootHostAccess: ms['host-access'], + volumeMappings: ms['volume-mappings'] || [], + ports: ms.ports || [], + routes: ms.routes || [], + } + if (ms.env && ms.env.length > 0) { + microserviceData.env = ms.env + } + if (ms.cmd && ms.cmd.length > 0) { + microserviceData.cmd = ms.cmd + } + + return microserviceData + }) } -const kubeletUploadPod = async function(uploadPodData, fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletDeletePod = async function (podData, fogNodeUuid, user, transaction) { + const flowName = podData.metadata.name + + const flows = await FlowService.getAllFlowsEndPoint(false, transaction) + const flow = flows.flows.find((flow) => flow.name === flowName) + if (!flow) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogNodeUuid)) + } + + const existingMicroservices = await MicroservicesService.listMicroservicesEndPoint(flow.id, user, false, transaction) + existingMicroservices.microservices.forEach(async (ms) => { + await MicroservicesService.deleteMicroserviceEndPoint(ms.uuid, { withCleanup: true }, user, false, transaction) + }) + + await FlowService.deleteFlowEndPoint(flow.id, user, false, transaction) } -const kubeletDeletePod = async function(fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetPod = async function (namespace, name, fogNodeUuid, user, transaction) { + const flow = await FlowService.getFlowByName(name, user, false, transaction) + + return JSON.parse(Buffer.from(flow.description, 'base64').toString('utf8')).metadata } -const kubeletGetPod = async function(namespace, name, fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetContainerLogs = async function (namespace, podName, containerName, tail, fogNodeUuid, user, transaction) { + // Not supported yet } -const kubeletGetContainerLogs = async function(namespace, podName, containerName, tail, fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetPodStatus = async function (namespace, name, fogNodeUuid, user, transaction) { + const fog = await FogManager.findOne({ uuid: fogNodeUuid }, transaction) + const changeFrequency = (fog && fog.changeFrequency) || 60 + + const flow = await FlowService.getFlowByName(name, user, false, transaction) + const microservices = await MicroservicesService.listMicroservicesEndPoint(flow.id, user, false, transaction) + const pod = JSON.parse(Buffer.from(flow.description, 'base64').toString('utf8')).metadata + + for (const ms of microservices.microservices) { + const status = await MicroserviceStatusManager.findOne({ microserviceUuid: ms.uuid }, transaction) + ms.status = status.dataValues + ms.status.alive = moment().diff(moment(ms.status.updated_at), 'seconds') <= (changeFrequency * 2) + } + + const phase = microservices.microservices.every((ms) => ms.status.status === 'RUNNING') ? 'Running' : 'Pending' + const alive = microservices.microservices.every((ms) => ms.status.alive) + const status = { + phase: phase, + startTime: (alive && phase === 'Running') ? moment(microservices.microservices[0].startTime).utc().toISOString() : null, + conditions: [ + { + Type: 'PodInitialized', + Status: 'True', + }, + { + Type: 'PodReady', + Status: (alive && phase === 'Running') ? 'True' : 'False', + }, + { + Type: 'PodScheduled', + Status: 'True', + }, + ], + containerStatuses: [], + } + + status.containerStatuses = pod.spec.containers.map((c) => { + const microservice = microservices.microservices.find((ms) => ms.name === `${name}-${c.name}`) + + const containerState = {} + if (!microservice.status.alive) { + containerState.waiting = { reason: 'NOT_RESPONSIVE' } + } else if (microservice.status.status === 'RUNNING') { + containerState.running = { startedAt: moment(microservice.status.startTime).utc().toISOString() } + } else { + containerState.waiting = { reason: microservice.status.status } + } + + return { + name: c.name, + imageID: microservice.uuid, + ready: alive && microservice.status.status === 'RUNNING', + restartCount: 0, + state: containerState, + containerId: microservice.status.containerId, + } + }) + + return status } -const kubeletGetPodStatus = async function(namespace, name, fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetPods = async function (fogNodeUuid, user, transaction) { + const flows = await FlowService.getAllFlowsEndPoint(false, transaction) + const pods = flows.flows + .filter((flow) => JSON.parse(Buffer.from(flow.description, 'base64').toString('utf8')).node === fogNodeUuid) + .map((flow) => JSON.parse(Buffer.from(flow.description, 'base64').toString('utf8')).metadata) + + return pods } -const kubeletGetPods = async function(fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetCapacity = async function (fogNodeUuid, user, transaction) { + const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) + + return { + cpu: node.cpuLimit, + memory: `${(node.memoryLimit).toFixed(0)}Mi`, + pods: `${NODE_CAPACITY}`, + } } -const kubeletGetCapacity = async function(fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetAllocatable = async function (fogNodeUuid, user, transaction) { + const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) + + const pods = await kubeletGetPods(fogNodeUuid, user, transaction) + const allocatablePods = NODE_CAPACITY - pods.length + + return { + cpu: node.cpuLimit - node.cpuUsage, + memory: `${(node.memoryLimit - node.memoryUsage).toFixed(0)}Mi`, + pods: allocatablePods < 0 ? 0 : allocatablePods, + } } -const kubeletGetNodeConditions = async function(fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetNodeConditions = async function (fogNodeUuid, user, transaction) { + const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) + const now = moment().utc().toISOString() + const lastStatusTime = node.lastStatusTime ? moment(node.lastStatusTime).utc().toISOString() : null + return [ + { + type: 'Ready', + status: node.daemonStatus === 'RUNNING' ? 'True' : 'False', + lastHeartbeatTime: lastStatusTime, + lastTransitionTime: now, + reason: '', + message: node.daemonStatus, + }, + { + type: 'OutOfDisk', + status: node.diskUsage >= node.diskLimit ? 'True' : 'False', + lastHeartbeatTime: lastStatusTime, + lastTransitionTime: now, + reason: '', + message: `Usage: ${node.diskUsage}, Limit: ${node.diskLimit}`, + }, + { + type: 'MemoryPressure', + status: (node.memoryUsage / node.memoryLimit) >= 0.9 ? 'True' : 'False', + lastHeartbeatTime: lastStatusTime, + lastTransitionTime: now, + reason: '', + message: `Usage: ${node.memoryUsage}, Limit: ${node.memoryLimit}`, + }, + { + type: 'DiskPressure', + status: (node.diskUsage / node.diskLimit) >= 0.9 ? 'True' : 'False', + lastHeartbeatTime: lastStatusTime, + lastTransitionTime: now, + reason: '', + message: `Usage: ${node.diskUsage}, Limit: ${node.diskLimit}`, + }, + { + type: 'NetworkUnavailable', + status: 'False', + lastHeartbeatTime: lastStatusTime, + lastTransitionTime: now, + reason: '', + message: '', + }, + ] } -const kubeletGetNodeAddresses = async function(fogNodeUuid, transaction) { - // TODO: to implement + +const kubeletGetNodeAddresses = async function (fogNodeUuid, user, transaction) { + const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) + if (!node.ipAddress || node.ipAddress === '0.0.0.0') { + return [] + } + + return [ + { + type: 'InternalIP', + address: node.ipAddress, + }, + ] } -const kubeletGetVkToken = async function(userId, transaction) { + +const kubeletGetVkToken = async function (userId, transaction) { const newAccessToken = await KubeletAccessTokenService.generateAccessToken(transaction) await KubeletAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) @@ -53,21 +343,79 @@ const kubeletGetVkToken = async function(userId, transaction) { token: newAccessToken.token, } } -const kubeletGetSchedulerToken = async function(transaction) { - // TODO: to implement + +const kubeletGetSchedulerToken = async function (transaction) { + const newAccessToken = await SchedulerAccessTokenService.generateAccessToken(transaction) + await SchedulerAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) + + return { + userId: userId, + token: newAccessToken.token, + } +} + +const microservicesTopologicalOrder = function (msMetadata) { + const microservices = [] + const graph = [] + msMetadata.forEach((ms, i) => { + graph[i] = { + edges: [], + } + + if (!ms.routes) { + return + } + + ms.routes.forEach((route) => { + if (route.startsWith('@')) { + graph[i].edges.push(route.substr(1)) + } + }) + }) + + const stack = msMetadata.reduce((prev, ms, i) => { + if (graph[i].edges.length === 0) { + return prev.concat(i) + } + + return prev + }, []) + + while (stack.length > 0) { + const n = stack.pop() + microservices.push(n) + graph.forEach((node, i) => { + if (!node.edges.length) { + return + } + + node.edges = node.edges.filter((e) => e != n) + if (!node.edges.length) { + stack.push(i) + } + }) + } + + const hasCircuit = !!graph.filter((node) => !!node.edges.length).length + if (hasCircuit) { + throw new Error('Circular dependency!!!') + } + + return microservices.map((idx) => Object.assign({ originalIndex: idx }, msMetadata[idx])) } module.exports = { - kubeletCreatePod: TransactionDecorator.generateFakeTransaction(kubeletCreatePod), - kubeletUploadPod: TransactionDecorator.generateFakeTransaction(kubeletUploadPod), - kubeletDeletePod: TransactionDecorator.generateFakeTransaction(kubeletDeletePod), - kubeletGetPod: TransactionDecorator.generateFakeTransaction(kubeletGetPod), - kubeletGetContainerLogs: TransactionDecorator.generateFakeTransaction(kubeletGetContainerLogs), - kubeletGetPodStatus: TransactionDecorator.generateFakeTransaction(kubeletGetPodStatus), - kubeletGetPods: TransactionDecorator.generateFakeTransaction(kubeletGetPods), - kubeletGetCapacity: TransactionDecorator.generateFakeTransaction(kubeletGetCapacity), - kubeletGetNodeConditions: TransactionDecorator.generateFakeTransaction(kubeletGetNodeConditions), - kubeletGetNodeAddresses: TransactionDecorator.generateFakeTransaction(kubeletGetNodeAddresses), - kubeletGetVkToken: TransactionDecorator.generateFakeTransaction(kubeletGetVkToken), - kubeletGetSchedulerToken: TransactionDecorator.generateFakeTransaction(kubeletGetSchedulerToken), + kubeletCreatePod: TransactionDecorator.generateTransaction(kubeletCreatePod), + kubeletUpdatePod: TransactionDecorator.generateTransaction(kubeletUpdatePod), + kubeletDeletePod: TransactionDecorator.generateTransaction(kubeletDeletePod), + kubeletGetPod: TransactionDecorator.generateTransaction(kubeletGetPod), + kubeletGetContainerLogs: TransactionDecorator.generateTransaction(kubeletGetContainerLogs), + kubeletGetPodStatus: TransactionDecorator.generateTransaction(kubeletGetPodStatus), + kubeletGetPods: TransactionDecorator.generateTransaction(kubeletGetPods), + kubeletGetCapacity: TransactionDecorator.generateTransaction(kubeletGetCapacity), + kubeletGetAllocatable: TransactionDecorator.generateTransaction(kubeletGetAllocatable), + kubeletGetNodeConditions: TransactionDecorator.generateTransaction(kubeletGetNodeConditions), + kubeletGetNodeAddresses: TransactionDecorator.generateTransaction(kubeletGetNodeAddresses), + kubeletGetVkToken: TransactionDecorator.generateTransaction(kubeletGetVkToken), + kubeletGetSchedulerToken: TransactionDecorator.generateTransaction(kubeletGetSchedulerToken), } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 47235934a..6aae66b16 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -15,6 +15,8 @@ const logger = require('../logger') const TransactionDecorator = require('../decorators/transaction-decorator') const MicroserviceManager = require('../sequelize/managers/microservice-manager') const MicroserviceStatusManager = require('../sequelize/managers/microservice-status-manager') +const MicroserviceArgManager = require('../sequelize/managers/microservice-arg-manager') +const MicroserviceEnvManager = require('../sequelize/managers/microservice-env-manager') const MicroservicePortManager = require('../sequelize/managers/microservice-port-manager') const MicroserviceStates = require('../enums/microservice-state') const VolumeMappingManager = require('../sequelize/managers/volume-mapping-manager') @@ -37,35 +39,23 @@ const _ = require('underscore') const TrackingDecorator = require('../decorators/tracking-decorator') const TrackingEventType = require('../enums/tracking-event-type') -async function listMicroservices(flowId, user, isCLI, transaction) { +async function listMicroservicesEndPoint(flowId, user, isCLI, transaction) { if (!isCLI) { await FlowService.getFlow(flowId, user, isCLI, transaction) } - const where = isCLI ? {delete: false} : {flowId: flowId, delete: false} + const where = isCLI ? { delete: false } : { flowId: flowId, delete: false } const microservices = await MicroserviceManager.findAllExcludeFields(where, transaction) const res = await Promise.all(microservices.map(async (microservice) => { - const microserviceUuid = microservice.uuid - const portMappings = await MicroservicePortManager.findAll({microserviceUuid: microserviceUuid}, transaction) - const volumeMappings = await VolumeMappingManager.findAll({microserviceUuid: microserviceUuid}, transaction) - const routes = await RoutingManager.findAll({sourceMicroserviceUuid: microserviceUuid}, transaction) - - const fullMs = Object.assign({}, microservice.dataValues) - fullMs.ports = portMappings.map((pm) => { - return {internal: pm.portInternal, external: pm.portExternal, publicMode: pm.isPublic} - }) - fullMs.volumeMappings = volumeMappings.map((vm) => vm.dataValues) - fullMs.routes = routes.map((r) => r.destMicroserviceUuid) - - return fullMs + return _buildGetMicroserviceResponse(microservice, transaction) })) return { microservices: res, } } -async function getMicroservice(microserviceUuid, user, isCLI, transaction) { +async function getMicroserviceEndPoint(microserviceUuid, user, isCLI, transaction) { if (!isCLI) { await _validateMicroserviceOnGet(user.id, microserviceUuid, transaction) } @@ -78,49 +68,62 @@ async function getMicroservice(microserviceUuid, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } - const portMappings = await MicroservicePortManager.findAll({microserviceUuid: microserviceUuid}, transaction) - const volumeMappings = await VolumeMappingManager.findAll({microserviceUuid: microserviceUuid}, transaction) - const routes = await RoutingManager.findAll({sourceMicroserviceUuid: microserviceUuid}, transaction) - - const res = Object.assign({}, microservice.dataValues) - res.ports = portMappings.map((pm) => { - return {internal: pm.portInternal, external: pm.portExternal, publicMode: pm.isPublic} - }) - res.volumeMappings = volumeMappings.map((vm) => vm.dataValues) - res.routes = routes.map((r) => r.destMicroserviceUuid) - return res + return await _buildGetMicroserviceResponse(microservice, transaction) } -async function createMicroservice(microserviceData, user, isCLI, transaction) { +async function createMicroserviceEndPoint(microserviceData, user, isCLI, transaction) { await Validator.validate(microserviceData, Validator.schemas.microserviceCreate) const microservice = await _createMicroservice(microserviceData, user, isCLI, transaction) + const publicPorts = [] if (microserviceData.ports) { - for (const port of microserviceData.ports) { - await createPortMapping(microservice.uuid, port, user, isCLI, transaction) + for (const mapping of microserviceData.ports) { + const res = await _createPortMapping(microservice, mapping, user, transaction) + if (res && res.publicLink) { + publicPorts.push({ + internal: mapping.internal, + external: mapping.external, + publicLink: res.publicLink, + }) + } + } + } + if (microserviceData.env) { + for (const env of microserviceData.env) { + await _createEnv(microservice, env, user, transaction) + } + } + if (microserviceData.cmd) { + for (const arg of microserviceData.cmd) { + await _createArg(microservice, arg, user, transaction) } } if (microserviceData.volumeMappings) { - await _createVolumeMappings(microserviceData.volumeMappings, microservice.uuid, transaction) + await _createVolumeMappings(microservice, microserviceData.volumeMappings, transaction) } if (microserviceData.routes) { - await _createRoutes(microserviceData.routes, microservice.uuid, user, transaction) + await _createRoutes(microservice, microserviceData.routes, user, isCLI, transaction) } if (microserviceData.iofogUuid) { await _updateChangeTracking(false, microserviceData.iofogUuid, transaction) } - await _createMicroserviceStatus(microservice.uuid, transaction) + await _createMicroserviceStatus(microservice, transaction) - return { + const res = { uuid: microservice.uuid, } + if (publicPorts.length) { + res.publicPorts = publicPorts + } + + return res } -async function updateMicroservice(microserviceUuid, microserviceData, user, isCLI, transaction) { +async function updateMicroserviceEndPoint(microserviceUuid, microserviceData, user, isCLI, transaction) { await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) const query = isCLI @@ -144,6 +147,8 @@ async function updateMicroservice(microserviceUuid, microserviceData, user, isCL rootHostAccess: microserviceData.rootHostAccess, logSize: microserviceData.logLimit, volumeMappings: microserviceData.volumeMappings, + env: microserviceData.env, + cmd: microserviceData.cmd, } const microserviceDataUpdate = AppHelper.deleteUndefinedFields(microserviceToUpdate) @@ -157,43 +162,78 @@ async function updateMicroservice(microserviceUuid, microserviceData, user, isCL throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) } + const iofogUuid = microserviceDataUpdate.iofogUuid || microservice.iofogUuid + if (microserviceDataUpdate.name) { const userId = isCLI ? microservice.userId : user.id - await _checkForDuplicateName(microserviceDataUpdate.name, {id: microserviceUuid}, userId, transaction) + await _checkForDuplicateName(microserviceDataUpdate.name, { id: microserviceUuid }, userId, transaction) } // validate fog node - if (microserviceDataUpdate.iofogUuid) { - await IoFogService.getFog({uuid: microserviceDataUpdate.iofogUuid}, user, isCLI, transaction) + if (iofogUuid) { + await IoFogService.getFog({ uuid: iofogUuid }, user, isCLI, transaction) } - await MicroserviceManager.update(query, microserviceDataUpdate, transaction) + const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) if (microserviceDataUpdate.volumeMappings) { await _updateVolumeMappings(microserviceDataUpdate.volumeMappings, microserviceUuid, transaction) } + if (microserviceDataUpdate.env) { + await _updateEnv(microserviceDataUpdate.env, microserviceUuid, transaction) + } + + if (microserviceDataUpdate.cmd) { + await _updateArg(microserviceDataUpdate.cmd, microserviceUuid, transaction) + } + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { - const routes = await _getLogicalNetworkRoutesByFog(microservice.iofogUuid, transaction) - for (const route of routes) { - await deleteRoute(route.sourceMicroserviceUuid, route.destMicroserviceUuid, user, isCLI, transaction) - await createRoute(route.sourceMicroserviceUuid, route.destMicroserviceUuid, user, isCLI, transaction) - // update change tracking for another fog in route - if (microservice.iofogUuid === route.sourceIofogUuid) { - await _updateChangeTracking(false, route.destIofogUuid, transaction) - } else if (microservice.iofogUuid === route.destIofogUuid) { - await _updateChangeTracking(false, route.sourceIofogUuid, transaction) - } - } - // update change tracking for old fog - await _updateChangeTracking(false, microservice.iofogUuid, transaction) + await _moveRoutesToNewFog(updatedMicroservice, microservice.iofogUuid, user, transaction) + await _movePublicModesToNewFog(updatedMicroservice, microservice.iofogUuid, user, transaction) + await _updateChangeTracking(true, microservice.iofogUuid, transaction) } // update change tracking for new fog - await _updateChangeTracking(!!microserviceData.config, microserviceDataUpdate.iofogUuid, transaction) + await _updateChangeTracking(!!microserviceData.config, iofogUuid, transaction) +} + +async function _moveRoutesToNewFog(microservice, oldFogUuid, user, transaction) { + const routes = await _getLogicalNetworkRoutesByMicroservice(microservice.uuid, transaction) + + for (const route of routes.sourceRoutes) { + const sourceWhere = { uuid: route.sourceMicroserviceUuid, userId: user.id } + const sourceMicroservice = await MicroserviceManager.findOne(sourceWhere, transaction) + + await _recreateRoute(route, sourceMicroservice, microservice, user, transaction) + await _updateChangeTracking(false, route.sourceIofogUuid, transaction) + } + + for (const route of routes.destRoutes) { + const destWhere = { uuid: route.destMicroserviceUuid, userId: user.id } + const destMicroservice = await MicroserviceManager.findOne(destWhere, transaction) + + await _recreateRoute(route, microservice, destMicroservice, user, transaction) + await _updateChangeTracking(false, route.destIofogUuid, transaction) + } + + // update change tracking for old fog + await _updateChangeTracking(false, oldFogUuid, transaction) } -async function deleteMicroservice(microserviceUuid, microserviceData, user, isCLI, transaction) { +async function _movePublicModesToNewFog(microservice, oldIofogUuid, user, transaction) { + const publicModes = await _getPublicModesByMicroservice(microservice.uuid, transaction) + + for (const pub of publicModes) { + await _recreatePublicMode(microservice, pub, user, transaction) + await _updateChangeTracking(false, pub.iofogUuid, transaction) + } + + // update change tracking for old fog + await _updateChangeTracking(false, oldIofogUuid, transaction) +} + +async function deleteMicroserviceEndPoint(microserviceUuid, microserviceData, user, isCLI, transaction) { const where = isCLI ? { @@ -214,7 +254,7 @@ async function deleteMicroservice(microserviceUuid, microserviceData, user, isCL } if (!microservice.microserviceStatus || microservice.microserviceStatus.status === MicroserviceStates.NOT_RUNNING) { - await deleteMicroserviceWithRoutesAndPortMappings(microserviceUuid, transaction) + await deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) } else { await MicroserviceManager.update({ uuid: microserviceUuid, @@ -229,17 +269,17 @@ async function deleteMicroservice(microserviceUuid, microserviceData, user, isCL } async function deleteNotRunningMicroservices(fog, transaction) { - const microservices = await MicroserviceManager.findAllWithStatuses({iofogUuid: fog.uuid}, transaction) + const microservices = await MicroserviceManager.findAllWithStatuses({ iofogUuid: fog.uuid }, transaction) microservices .filter((microservice) => microservice.delete) .filter((microservice) => microservice.microserviceStatus.status === MicroserviceStates.NOT_RUNNING) - .forEach(async (microservice) => await deleteMicroserviceWithRoutesAndPortMappings(microservice.uuid, transaction)) + .forEach(async (microservice) => await deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction)) } -async function createRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { +async function createRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { const sourceWhere = isCLI - ? {uuid: sourceMicroserviceUuid} - : {uuid: sourceMicroserviceUuid, userId: user.id} + ? { uuid: sourceMicroserviceUuid } + : { uuid: sourceMicroserviceUuid, userId: user.id } const sourceMicroservice = await MicroserviceManager.findOne(sourceWhere, transaction) if (!sourceMicroservice) { @@ -247,14 +287,18 @@ async function createRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, i } const destWhere = isCLI - ? {uuid: destMicroserviceUuid} - : {uuid: destMicroserviceUuid, userId: user.id} + ? { uuid: destMicroserviceUuid } + : { uuid: destMicroserviceUuid, userId: user.id } const destMicroservice = await MicroserviceManager.findOne(destWhere, transaction) if (!destMicroservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_DEST_MICROSERVICE_UUID, destMicroserviceUuid)) } + await _createRoute(sourceMicroservice, destMicroservice, user, transaction) +} + +async function _createRoute(sourceMicroservice, destMicroservice, user, transaction) { if (!sourceMicroservice.iofogUuid || !destMicroservice.iofogUuid) { throw new Errors.ValidationError('fog not set') } @@ -263,8 +307,8 @@ async function createRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, i } const route = await RoutingManager.findOne({ - sourceMicroserviceUuid: sourceMicroserviceUuid, - destMicroserviceUuid: destMicroserviceUuid, + sourceMicroserviceUuid: sourceMicroservice.uuid, + destMicroserviceUuid: destMicroservice.uuid, }, transaction) if (route) { throw new Errors.ValidationError('route already exists') @@ -285,10 +329,10 @@ async function updateRouteOverConnector(connector, transaction) { await _updateNetworkMicroserviceConfigs(networkMicroserviceUuids, connector, transaction) } -async function deleteRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { +async function deleteRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { const sourceWhere = isCLI - ? {uuid: sourceMicroserviceUuid} - : {uuid: sourceMicroserviceUuid, userId: user.id} + ? { uuid: sourceMicroserviceUuid } + : { uuid: sourceMicroserviceUuid, userId: user.id } const sourceMicroservice = await MicroserviceManager.findOne(sourceWhere, transaction) if (!sourceMicroservice) { @@ -296,8 +340,8 @@ async function deleteRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, i } const destWhere = isCLI - ? {uuid: destMicroserviceUuid} - : {uuid: destMicroserviceUuid, userId: user.id} + ? { uuid: destMicroserviceUuid } + : { uuid: destMicroserviceUuid, userId: user.id } const destMicroservice = await MicroserviceManager.findOne(destWhere, transaction) if (!destMicroservice) { @@ -312,6 +356,10 @@ async function deleteRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, i throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.ROUTE_NOT_FOUND)) } + await _deleteRoute(route, transaction) +} + +async function _deleteRoute(route, transaction) { if (route.isNetworkConnection) { await _deleteRouteOverConnector(route, transaction) } else { @@ -319,25 +367,29 @@ async function deleteRoute(sourceMicroserviceUuid, destMicroserviceUuid, user, i } } -async function createPortMapping(microserviceUuid, portMappingData, user, isCLI, transaction) { +async function createPortMappingEndPoint(microserviceUuid, portMappingData, user, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) await _validatePorts(portMappingData.internal, portMappingData.external) const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } + return _createPortMapping(microservice, portMappingData, user, transaction) +} + +async function _createPortMapping(microservice, portMappingData, user, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } const msPorts = await MicroservicePortManager.findOne({ - microserviceUuid: microserviceUuid, + microserviceUuid: microservice.uuid, [Op.or]: [ { @@ -359,6 +411,36 @@ async function createPortMapping(microserviceUuid, portMappingData, user, isCLI, } } +async function _createEnv(microservice, envData, user, transaction) { + if (!microservice.iofogUuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) + } + + const msEnvData = { + key: envData.key, + value: envData.value, + userId: microservice.userId, + microserviceUuid: microservice.uuid, + } + + await MicroserviceEnvManager.create(msEnvData, transaction) + await _switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) +} + +async function _createArg(microservice, arg, user, transaction) { + if (!microservice.iofogUuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) + } + + const msArgData = { + cmd: arg, + microserviceUuid: microservice.uuid, + } + + await MicroserviceArgManager.create(msArgData, transaction) + await _switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) +} + async function updatePortMappingOverConnector(connector, transaction) { const microservicePublicModes = await MicroservicePublicModeManager.findAllMicroservicePublicModesByConnectorId(connector.id, transaction) @@ -366,55 +448,60 @@ async function updatePortMappingOverConnector(connector, transaction) { await _updateNetworkMicroserviceConfigs(networkMicroserviceUuids, connector, transaction) } -async function deletePortMapping(microserviceUuid, internalPort, user, isCLI, transaction) { +async function _deletePortMapping(microservice, portMapping, user, transaction) { + if (portMapping.isPublic) { + await _deletePortMappingOverConnector(microservice, portMapping, user, transaction) + } else { + await _deleteSimplePortMapping(microservice, portMapping, user, transaction) + } +} + +async function deletePortMappingEndPoint(microserviceUuid, internalPort, user, isCLI, transaction) { const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } - if (!internalPort) { - throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED) - } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } + if (!internalPort) { + throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED) + } + const msPorts = await MicroservicePortManager.findOne({ - microserviceUuid: microserviceUuid, + microserviceUuid: microservice.uuid, portInternal: internalPort, }, transaction) if (!msPorts) { throw new Errors.NotFoundError('port mapping not exists') } - if (msPorts.isPublic) { - await _deletePortMappingOverConnector(microservice, msPorts, user, transaction) - } else { - await _deleteSimplePortMapping(microservice, msPorts, user, transaction) - } + await _deletePortMapping(microservice, msPorts, user, transaction) } -async function listPortMappings(microserviceUuid, user, isCLI, transaction) { +async function listPortMappingsEndPoint(microserviceUuid, user, isCLI, transaction) { const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } - const portsPairs = await MicroservicePortManager.findAll({microserviceUuid: microserviceUuid}, transaction) + const portsPairs = await MicroservicePortManager.findAll({ microserviceUuid: microserviceUuid }, transaction) return await _buildPortsList(portsPairs, transaction) } async function getPhysicalConnections(microservice, transaction) { const res = [] - const pubModes = await MicroservicePublicModeManager.findAll({microserviceUuid: microservice.uuid}, transaction) + const pubModes = await MicroservicePublicModeManager.findAll({ microserviceUuid: microservice.uuid }, transaction) for (const pm of pubModes) { res.push(pm.networkMicroserviceUuid) } - const sourceRoutes = await RoutingManager.findAll({sourceMicroserviceUuid: microservice.uuid}, transaction) + const sourceRoutes = await RoutingManager.findAll({ sourceMicroserviceUuid: microservice.uuid }, transaction) for (const sr of sourceRoutes) { if (!sr.sourceIofogUuid || !sr.destIofogUuid) { continue @@ -425,7 +512,7 @@ async function getPhysicalConnections(microservice, transaction) { } } - const netwRoutes = await RoutingManager.findAll({destNetworkMicroserviceUuid: microservice.uuid}, transaction) + const netwRoutes = await RoutingManager.findAll({ destNetworkMicroserviceUuid: microservice.uuid }, transaction) for (const nr of netwRoutes) { res.push(nr.destMicroserviceUuid) } @@ -433,12 +520,12 @@ async function getPhysicalConnections(microservice, transaction) { return res } -async function createVolumeMapping(microserviceUuid, volumeMappingData, user, isCLI, transaction) { +async function createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, user, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -464,10 +551,10 @@ async function createVolumeMapping(microserviceUuid, volumeMappingData, user, is return await VolumeMappingManager.create(volumeMappingObj, transaction) } -async function deleteVolumeMapping(microserviceUuid, volumeMappingUuid, user, isCLI, transaction) { +async function deleteVolumeMappingEndPoint(microserviceUuid, volumeMappingUuid, user, isCLI, transaction) { const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -485,10 +572,10 @@ async function deleteVolumeMapping(microserviceUuid, volumeMappingUuid, user, is } } -async function listVolumeMappings(microserviceUuid, user, isCLI, transaction) { +async function listVolumeMappingsEndPoint(microserviceUuid, user, isCLI, transaction) { const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) @@ -503,11 +590,11 @@ async function listVolumeMappings(microserviceUuid, user, isCLI, transaction) { // this function works with escape and unescape config, in case of unescaped config, the first split will not work, // but the second will work function _validateMicroserviceConfig(config) { - if (config === undefined || config === '{}') { - return '{}' + let result + if (config) { + result = config.split('\\"').join('"').split('"').join('\"') } - - return config.split('\\"').join('"').split('"').join('\"') + return result } async function _createMicroservice(microserviceData, user, isCLI, transaction) { @@ -535,40 +622,86 @@ async function _createMicroservice(microserviceData, user, isCLI, transaction) { await FlowService.getFlow(newMicroservice.flowId, user, isCLI, transaction) // validate fog node if (newMicroservice.iofogUuid) { - await IoFogService.getFog({uuid: newMicroservice.iofogUuid}, user, isCLI, transaction) + await IoFogService.getFog({ uuid: newMicroservice.iofogUuid }, user, isCLI, transaction) } return await MicroserviceManager.create(newMicroservice, transaction) } -async function _createMicroserviceStatus(uuid, transaction) { +async function _createMicroserviceStatus(microservice, transaction) { return await MicroserviceStatusManager.create({ - microserviceUuid: uuid, + microserviceUuid: microservice.uuid, }, transaction) } -async function _createVolumeMappings(volumeMappings, microserviceUuid, transaction) { +async function _createVolumeMappings(microservice, volumeMappings, transaction) { const mappings = [] for (const volumeMapping of volumeMappings) { const mapping = Object.assign({}, volumeMapping) - mapping.microserviceUuid = microserviceUuid + mapping.microserviceUuid = microservice.uuid mappings.push(mapping) } await VolumeMappingManager.bulkCreate(mappings, transaction) } -async function _createRoutes(routes, microserviceUuid, user, transaction) { - for (const route of routes) { - await createRoute(microserviceUuid, route, user, false, transaction) +async function _createRoutes(sourceMicroservice, destMsUuidArr, user, isCLI, transaction) { + for (const destUuid of destMsUuidArr) { + const destWhere = isCLI + ? { uuid: destUuid } + : { uuid: destUuid, userId: user.id } + + const destMicroservice = await MicroserviceManager.findOne(destWhere, transaction) + if (!destMicroservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_DEST_MICROSERVICE_UUID, destMicroserviceUuid)) + } + + await _createRoute(sourceMicroservice, destMicroservice, user, transaction) } } async function _updateVolumeMappings(volumeMappings, microserviceUuid, transaction) { + await VolumeMappingManager.delete({ + microserviceUuid: microserviceUuid, + }, transaction) for (const volumeMapping of volumeMappings) { - await VolumeMappingManager.update({ + const volumeMappingObj = { + microserviceUuid: microserviceUuid, + hostDestination: volumeMapping.hostDestination, + containerDestination: volumeMapping.containerDestination, + accessMode: volumeMapping.accessMode, + } + + await VolumeMappingManager.create(volumeMappingObj, transaction) + } +} + +async function _updateEnv(env, microserviceUuid, transaction) { + await MicroserviceEnvManager.delete({ + microserviceUuid: microserviceUuid, + }, transaction) + for (const envData of env) { + const envObj = { microserviceUuid: microserviceUuid, - }, volumeMapping, transaction) + key: envData.key, + value: envData.value, + } + + await MicroserviceEnvManager.create(envObj, transaction) + } +} + +async function _updateArg(arg, microserviceUuid, transaction) { + await MicroserviceArgManager.delete({ + microserviceUuid: microserviceUuid, + }, transaction) + for (const argData of arg) { + const envObj = { + microserviceUuid: microserviceUuid, + cmd: argData, + } + + await MicroserviceArgManager.create(envObj, transaction) } } @@ -580,28 +713,13 @@ async function _updateChangeTracking(configUpdated, fogNodeUuid, transaction) { } } -/* TODO use in _deleteMicroserviceWithRoutesAndPortMappings -async function _deletePortMappings(microservice, user, transaction) { - const msPortMappings = await MicroservicePortManager.findAll({ - microserviceUuid: microservice.uuid, - }, transaction) - - for (const msPorts of msPortMappings) { - if (msPorts.isPublic) { - await _deletePortMappingOverConnector(microservice, msPorts, user, transaction) - } else { - await _deleteSimplePortMapping(microservice, msPorts, user, transaction) - } - } -}*/ - async function _checkForDuplicateName(name, item, userId, transaction) { if (name) { const where = item.id ? { name: name, - uuid: {[Op.ne]: item.id}, + uuid: { [Op.ne]: item.id }, userId: userId, } : @@ -644,7 +762,7 @@ async function _createSimpleRoute(sourceMicroservice, destMicroservice, transact async function _updateNetworkMicroserviceConfigs(networkMicroserviceUuids, connector, transaction) { - const microservices = await MicroserviceManager.findAll({uuid: networkMicroserviceUuids}, transaction) + const microservices = await MicroserviceManager.findAll({ uuid: networkMicroserviceUuids }, transaction) let cert if (!connector.devMode && connector.cert) { @@ -786,23 +904,23 @@ async function _switchOnUpdateFlagsForMicroservicesInRoute(sourceMicroservice, d const updateRebuildMs = { rebuild: true, } - await MicroserviceManager.update({uuid: sourceMicroservice.uuid}, updateRebuildMs, transaction) - await MicroserviceManager.update({uuid: destMicroservice.uuid}, updateRebuildMs, transaction) + await MicroserviceManager.update({ uuid: sourceMicroservice.uuid }, updateRebuildMs, transaction) + await MicroserviceManager.update({ uuid: destMicroservice.uuid }, updateRebuildMs, transaction) await ChangeTrackingService.update(sourceMicroservice.iofogUuid, ChangeTrackingService.events.microserviceFull, transaction) await ChangeTrackingService.update(destMicroservice.iofogUuid, ChangeTrackingService.events.microserviceFull, transaction) } async function _deleteSimpleRoute(route, transaction) { - await RoutingManager.delete({id: route.id}, transaction) + await RoutingManager.delete({ id: route.id }, transaction) await ChangeTrackingService.update(route.sourceIofogUuid, ChangeTrackingService.events.microserviceRouting, transaction) await ChangeTrackingService.update(route.destIofogUuid, ChangeTrackingService.events.microserviceRouting, transaction) } async function _deleteRouteOverConnector(route, transaction) { - const ports = await ConnectorPortManager.findOne({id: route.connectorPortId}, transaction) - const connector = await ConnectorManager.findOne({id: ports.connectorId}, transaction) + const ports = await ConnectorPortManager.findOne({ id: route.connectorPortId }, transaction) + const connector = await ConnectorManager.findOne({ id: ports.connectorId }, transaction) try { await ConnectorPortService.closePortOnConnector(connector, ports) @@ -810,10 +928,10 @@ async function _deleteRouteOverConnector(route, transaction) { logger.warn(`Can't close ports pair ${ports.mappingId} on connector ${connector.publicIp}. Delete manually if necessary`) } - await RoutingManager.delete({id: route.id}, transaction) - await ConnectorPortManager.delete({id: ports.id}, transaction) - await MicroserviceManager.delete({uuid: route.sourceNetworkMicroserviceUuid}, transaction) - await MicroserviceManager.delete({uuid: route.destNetworkMicroserviceUuid}, transaction) + await RoutingManager.delete({ id: route.id }, transaction) + await ConnectorPortManager.delete({ id: ports.id }, transaction) + await MicroserviceManager.delete({ uuid: route.sourceNetworkMicroserviceUuid }, transaction) + await MicroserviceManager.delete({ uuid: route.destNetworkMicroserviceUuid }, transaction) await ChangeTrackingService.update(route.sourceIofogUuid, ChangeTrackingService.events.microserviceFull, transaction) await ChangeTrackingService.update(route.destIofogUuid, ChangeTrackingService.events.microserviceFull, transaction) @@ -903,17 +1021,16 @@ async function _createPortMappingOverConnector(microservice, portMappingData, us } await MicroservicePublicModeManager.create(msPubModeData, transaction) - await _switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, true, transaction) - const publicLink = await _buildLink(connector.devMode ? 'http' : 'https', connector.publicIp, connectorPort.port2) - return {publicLink: publicLink} + const publicLink = _buildLink(connector.devMode ? 'http' : 'https', connector.publicIp, connectorPort.port2) + return { publicLink: publicLink } } async function _switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, isPublic, transaction) { const updateRebuildMs = { rebuild: true, } - await MicroserviceManager.update({uuid: microservice.uuid}, updateRebuildMs, transaction) + await MicroserviceManager.update({ uuid: microservice.uuid }, updateRebuildMs, transaction) if (isPublic) { await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceFull, transaction) @@ -924,35 +1041,35 @@ async function _switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, async function _deleteSimplePortMapping(microservice, msPorts, user, transaction) { - await MicroservicePortManager.delete({id: msPorts.id}, transaction) + await MicroservicePortManager.delete({ id: msPorts.id }, transaction) const updateRebuildMs = { rebuild: true, } - await MicroserviceManager.update({uuid: microservice.uuid}, updateRebuildMs, transaction) + await MicroserviceManager.update({ uuid: microservice.uuid }, updateRebuildMs, transaction) await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceCommon, transaction) } async function _deletePortMappingOverConnector(microservice, msPorts, user, transaction) { - const pubModeData = await MicroservicePublicModeManager.findOne({microservicePortId: msPorts.id}, transaction) + const pubModeData = await MicroservicePublicModeManager.findOne({ microservicePortId: msPorts.id }, transaction) - const ports = await ConnectorPortManager.findOne({id: pubModeData.connectorPortId}, transaction) - const connector = await ConnectorManager.findOne({id: ports.connectorId}, transaction) + const ports = await ConnectorPortManager.findOne({ id: pubModeData.connectorPortId }, transaction) + const connector = await ConnectorManager.findOne({ id: ports.connectorId }, transaction) try { await ConnectorPortService.closePortOnConnector(connector, ports) } catch (e) { logger.warn(`Can't close ports pair ${ports.mappingId} on connector ${connector.publicIp}. Delete manually if necessary`) } - await MicroservicePublicModeManager.delete({id: pubModeData.id}, transaction) - await MicroservicePortManager.delete({id: msPorts.id}, transaction) - await ConnectorPortManager.delete({id: ports.id}, transaction) - await MicroserviceManager.delete({uuid: pubModeData.networkMicroserviceUuid}, transaction) + await MicroservicePublicModeManager.delete({ id: pubModeData.id }, transaction) + await MicroservicePortManager.delete({ id: msPorts.id }, transaction) + await ConnectorPortManager.delete({ id: ports.id }, transaction) + await MicroserviceManager.delete({ uuid: pubModeData.networkMicroserviceUuid }, transaction) const updateRebuildMs = { rebuild: true, } - await MicroserviceManager.update({uuid: microservice.uuid}, updateRebuildMs, transaction) + await MicroserviceManager.update({ uuid: microservice.uuid }, updateRebuildMs, transaction) await ChangeTrackingService.update(pubModeData.iofogUuid, ChangeTrackingService.events.microserviceFull, transaction) } @@ -975,11 +1092,11 @@ async function _buildPortsList(portsPairs, transaction) { publicMode: ports.isPublic, } if (ports.isPublic) { - const pubMode = await MicroservicePublicModeManager.findOne({microservicePortId: ports.id}, transaction) - const connectorPorts = await ConnectorPortManager.findOne({id: pubMode.connectorPortId}, transaction) - const connector = await ConnectorManager.findOne({id: connectorPorts.connectorId}, transaction) + const pubMode = await MicroservicePublicModeManager.findOne({ microservicePortId: ports.id }, transaction) + const connectorPorts = await ConnectorPortManager.findOne({ id: pubMode.connectorPortId }, transaction) + const connector = await ConnectorManager.findOne({ id: connectorPorts.connectorId }, transaction) - portMappingResposeData.publicLink = await _buildLink(connector.devMode ? 'http' : 'https', + portMappingResposeData.publicLink = _buildLink(connector.devMode ? 'http' : 'https', connector.publicIp, connectorPorts.port2) } res.push(portMappingResposeData) @@ -987,28 +1104,56 @@ async function _buildPortsList(portsPairs, transaction) { return res } -async function _getLogicalNetworkRoutesByFog(iofogUuid, transaction) { - const res = [] +/** + * Get all microservices that connected (as source or destination) to microservice using network connection + * + * @param {string} microserviceUuid + * @param {Transaction} transaction + * @return {Promise<{sourceRoutes: Array, destRoutes: Array}>} + * @private + */ +async function _getLogicalNetworkRoutesByMicroservice(microserviceUuid, transaction) { + const res = { + sourceRoutes: [], + destRoutes: [], + } const query = { [Op.or]: [ { - sourceIofogUuid: iofogUuid, + sourceMicroserviceUuid: microserviceUuid, }, { - destIofogUuid: iofogUuid, + destMicroserviceUuid: microserviceUuid, }, ], } const routes = await RoutingManager.findAll(query, transaction) for (const route of routes) { if (route.sourceIofogUuid && route.destIofogUuid && route.isNetworkConnection) { - res.push(route) + if (microserviceUuid == route.sourceMicroserviceUuid) { + res.destRoutes.push(route) + } + if (microserviceUuid == route.destMicroserviceUuid) { + res.sourceRoutes.push(route) + } } } return res } +async function _getPublicModesByMicroservice(microserviceUuid, transaction) { + const res = [] + const query = { + microserviceUuid: microserviceUuid, + } + const pubMods = await MicroservicePublicModeManager.findAll(query, transaction) + for (const pub of pubMods) { + res.push(pub) + } + return res +} + async function _getLogicalRoutesByMicroservice(microserviceUuid, transaction) { const res = [] const query = { @@ -1031,55 +1176,101 @@ async function _getLogicalRoutesByMicroservice(microserviceUuid, transaction) { return res } -async function deleteMicroserviceWithRoutesAndPortMappings(microserviceUuid, transaction) { - const routes = await _getLogicalRoutesByMicroservice(microserviceUuid, transaction) +async function deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) { + const routes = await _getLogicalRoutesByMicroservice(microservice.uuid, transaction) for (const route of routes) { - // TODO: simplify after splitting all endpoints service functions to validation and request processing part - const userId = (await MicroserviceManager - .findOne({uuid: route.sourceMicroserviceUuid}, transaction)) - .userId - const user = { - id: userId, - } - await deleteRoute(route.sourceMicroserviceUuid, route.destMicroserviceUuid, user, false, transaction) + await _deleteRoute(route, transaction) } - const portMappings = await MicroservicePortManager.findAll({microserviceUuid: microserviceUuid}, transaction) + const portMappings = await MicroservicePortManager.findAll({ microserviceUuid: microservice.uuid }, transaction) for (const ports of portMappings) { - const userId = (await MicroserviceManager - .findOne({uuid: ports.microserviceUuid}, transaction)) - .userId const user = { - id: userId, + id: microservice.userId, } - await deletePortMapping(ports.microserviceUuid, ports.portInternal, user, false, transaction) + await _deletePortMapping(microservice, ports, user, transaction) } await MicroserviceManager.delete({ - uuid: microserviceUuid, + uuid: microservice.uuid, }, transaction) } -async function _buildLink(protocol, ip, port) { +function _buildLink(protocol, ip, port) { return `${protocol}://${ip}:${port}` } +async function _buildGetMicroserviceResponse(microservice, transaction) { + const microserviceUuid = microservice.uuid + + // get additional data + const portMappings = await MicroservicePortManager.findAll({ microserviceUuid: microserviceUuid }, transaction) + const publicPortMappings = await MicroservicePublicModeManager.findAll({ microserviceUuid: microserviceUuid }, transaction) + const volumeMappings = await VolumeMappingManager.findAll({ microserviceUuid: microserviceUuid }, transaction) + const routes = await RoutingManager.findAll({ sourceMicroserviceUuid: microserviceUuid }, transaction) + const env = await MicroserviceEnvManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const cmd = await MicroserviceArgManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const arg = cmd.map((it) => it.cmd) + + // build microservice response + const res = Object.assign({}, microservice.dataValues) + res.ports = [] + for (pm of portMappings) { + const mapping = { internal: pm.portInternal, external: pm.portExternal, publicMode: pm.isPublic } + if (pm.isPublic && publicPortMappings) { + const publicPortMapping = publicPortMappings.find((ppm) => ppm.microservicePortId == pm.id) + if (publicPortMapping) { + const connectorPort = await ConnectorPortManager.findOne({ id: publicPortMapping.connectorPortId }, transaction) + if (connectorPort) { + const connector = await ConnectorManager.findOne({ id: connectorPort.connectorId }, transaction) + if (connectorPort) { + mapping.publicLink = _buildLink(connector.devMode ? 'http' : 'https', connector.publicIp, connectorPort.port2) + } + } + } + } + res.ports.push(mapping) + } + res.volumeMappings = volumeMappings.map((vm) => vm.dataValues) + res.routes = routes.map((r) => r.destMicroserviceUuid) + res.env = env + res.cmd = arg + + return res +} + +async function _recreateRoute(route, sourceMicroservice, destMicroservice, user, transaction) { + await _deleteRoute(route, transaction) + await _createRoute(sourceMicroservice, destMicroservice, user, transaction) +} + +async function _recreatePublicMode(microservice, publicMode, user, transaction) { + const portMapping = await MicroservicePortManager.findOne({ id: publicMode.microservicePortId }, transaction) + const portMappingData = { + internal: portMapping.portInternal, + external: portMapping.portExternal, + publicMode: portMapping.isPublic, + } + await _deletePortMappingOverConnector(microservice, portMapping, user, transaction) + await _createPortMappingOverConnector(microservice, portMappingData, user, transaction) +} + // decorated functions -const createMicroserviceWithTracking = TrackingDecorator.trackEvent(createMicroservice, TrackingEventType.MICROSERVICE_CREATED) +const createMicroserviceWithTracking = TrackingDecorator.trackEvent(createMicroserviceEndPoint, + TrackingEventType.MICROSERVICE_CREATED) module.exports = { - createMicroservice: TransactionDecorator.generateTransaction(createMicroserviceWithTracking), - listMicroservices: TransactionDecorator.generateTransaction(listMicroservices), - getMicroservice: TransactionDecorator.generateTransaction(getMicroservice), - updateMicroservice: TransactionDecorator.generateTransaction(updateMicroservice), - deleteMicroservice: TransactionDecorator.generateTransaction(deleteMicroservice), - createRoute: TransactionDecorator.generateTransaction(createRoute), - deleteRoute: TransactionDecorator.generateTransaction(deleteRoute), - createPortMapping: TransactionDecorator.generateTransaction(createPortMapping), - listMicroservicePortMappings: TransactionDecorator.generateTransaction(listPortMappings), - deletePortMapping: TransactionDecorator.generateTransaction(deletePortMapping), - createVolumeMapping: TransactionDecorator.generateTransaction(createVolumeMapping), - deleteVolumeMapping: TransactionDecorator.generateTransaction(deleteVolumeMapping), - listVolumeMappings: TransactionDecorator.generateTransaction(listVolumeMappings), + createMicroserviceEndPoint: TransactionDecorator.generateTransaction(createMicroserviceWithTracking), + listMicroservicesEndPoint: TransactionDecorator.generateTransaction(listMicroservicesEndPoint), + getMicroserviceEndPoint: TransactionDecorator.generateTransaction(getMicroserviceEndPoint), + updateMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceEndPoint), + deleteMicroserviceEndPoint: TransactionDecorator.generateTransaction(deleteMicroserviceEndPoint), + createRouteEndPoint: TransactionDecorator.generateTransaction(createRouteEndPoint), + deleteRouteEndPoint: TransactionDecorator.generateTransaction(deleteRouteEndPoint), + createPortMappingEndPoint: TransactionDecorator.generateTransaction(createPortMappingEndPoint), + listMicroservicePortMappingsEndPoint: TransactionDecorator.generateTransaction(listPortMappingsEndPoint), + deletePortMappingEndPoint: TransactionDecorator.generateTransaction(deletePortMappingEndPoint), + createVolumeMappingEndPoint: TransactionDecorator.generateTransaction(createVolumeMappingEndPoint), + deleteVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteVolumeMappingEndPoint), + listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), getPhysicalConnections: getPhysicalConnections, deleteNotRunningMicroservices: deleteNotRunningMicroservices, updateRouteOverConnector: updateRouteOverConnector, diff --git a/src/services/registry-service.js b/src/services/registry-service.js index 6f6dd27b4..eae7163cd 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -66,7 +66,7 @@ const findRegistries = async function(user, isCLI, transaction) { ], } - const registries = await RegistryManager.findAllWithAttributes(queryRegistry, {exclude: ['password']}, transaction) + const registries = await RegistryManager.findAllWithAttributes(queryRegistry, { exclude: ['password'] }, transaction) return { registries: registries, } @@ -75,14 +75,14 @@ const findRegistries = async function(user, isCLI, transaction) { const deleteRegistry = async function(registryData, user, isCLI, transaction) { await Validator.validate(registryData, Validator.schemas.registryDelete) const queryData = isCLI - ? {id: registryData.id} - : {id: registryData.id, userId: user.id} + ? { id: registryData.id } + : { id: registryData.id, userId: user.id } const registry = await RegistryManager.findOne(queryData, transaction) if (!registry) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, registryData.id)) } if (isCLI) { - user = {id: registry.userId} + user = { id: registry.userId } } await RegistryManager.delete(queryData, transaction) await _updateChangeTracking(user, transaction) @@ -131,7 +131,7 @@ const updateRegistry = async function(registry, registryId, user, isCLI, transac const _updateChangeTracking = async function(user, transaction) { - const fogs = await FogManager.findAll({userId: user.id}, transaction) + const fogs = await FogManager.findAll({ userId: user.id }, transaction) for (fog of fogs) { await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.registries, transaction) } diff --git a/src/services/scheduler-access-token-service.js b/src/services/scheduler-access-token-service.js new file mode 100644 index 000000000..1360ef87a --- /dev/null +++ b/src/services/scheduler-access-token-service.js @@ -0,0 +1,48 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2019 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const AppHelper = require('../helpers/app-helper') +const SchedulerAccessTokenManager = require('../sequelize/managers/scheduler-access-token-manager') + +const Config = require('../config') + +const generateAccessToken = async function(transaction) { + while (true) { + const newAccessToken = AppHelper.generateAccessToken() + const exists = await SchedulerAccessTokenManager.findOne({ + token: newAccessToken, + }, transaction) + if (!exists) { + const accessTokenExpiryTime = Date.now() + Config.get('Settings:SchedulerTokenExpirationIntervalSeconds') * 99999 + return { + token: newAccessToken, + expirationTime: accessTokenExpiryTime, + } + } + } +} + +async function updateAccessToken(userId, newAccessToken, transaction) { + return SchedulerAccessTokenManager.updateOrCreate({ + userId: userId, + }, { + userId: userId, + token: newAccessToken.token, + expirationTime: newAccessToken.expirationTime, + }, transaction) +} + +module.exports = { + generateAccessToken, + updateAccessToken, +} diff --git a/src/services/tunnel-service.js b/src/services/tunnel-service.js index f02d05623..c0585f098 100644 --- a/src/services/tunnel-service.js +++ b/src/services/tunnel-service.js @@ -22,7 +22,7 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const ChangeTrackingService = require('./change-tracking-service') const openTunnel = async function(tunnelData, user, isCli, transaction) { - const iofog = await FogManager.findOne({uuid: tunnelData.iofogUuid}, transaction) + const iofog = await FogManager.findOne({ uuid: tunnelData.iofogUuid }, transaction) if (!iofog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, tunnelData.iofogUuid)) } @@ -62,7 +62,7 @@ const findTunnel = async function(tunnelData, user, transaction) { } const findAll = async function(transaction) { - const tunnels = await TunnelManager.findAllWithAttributes({}, {exclude: ['password']}, transaction) + const tunnels = await TunnelManager.findAllWithAttributes({}, { exclude: ['password'] }, transaction) return { tunnels: tunnels, } @@ -70,7 +70,7 @@ const findAll = async function(transaction) { const closeTunnel = async function(tunnelData, user, transaction) { await module.exports.findTunnel(tunnelData, user, transaction) - await TunnelManager.update(tunnelData, {closed: true}, transaction) + await TunnelManager.update(tunnelData, { closed: true }, transaction) await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } diff --git a/src/services/user-service.js b/src/services/user-service.js index 8dfc51344..2fbb98611 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -218,7 +218,7 @@ const resetUserPassword = async function(emailObj, isCLI, transaction) { } const list = async function(isCLI, transaction) { - return await UserManager.findAllWithAttributes({}, {exclude: ['password']}, transaction) + return await UserManager.findAllWithAttributes({}, { exclude: ['password'] }, transaction) } const suspendUser = async function(user, isCLI, transaction) { diff --git a/src/tracking/index.js b/src/tracking/index.js index 43c7ff647..b90cdd7c9 100644 --- a/src/tracking/index.js +++ b/src/tracking/index.js @@ -11,19 +11,21 @@ * */ -const {isOnline} = require('../helpers/app-helper') -const https = require('https') -const EventTypes = require('../enums/tracking-event-type') -const os = require('os') -const AppHelper = require('../helpers/app-helper') -const crypto = require('crypto') +const fs = require('fs') +const request = require('request-promise') +const { isOnline } = require('../helpers/app-helper') +const AppHelper = require('../helpers/app-helper') +const Constants = require('../helpers/constants') +const EventTypes = require('../enums/tracking-event-type') +const logger = require('../logger') const TrackingEventManager = require('../sequelize/managers/tracking-event-manager') const Transaction = require('sequelize/lib/transaction') -const fakeTransactionObject = {fakeTransaction: true} -const trackingUuid = getUniqueTrackingUuid() +const fakeTransactionObject = { fakeTransaction: true } + +const trackingUuid = initTrackingUuid() function buildEvent(eventType, res, args, functionName) { const eventInfo = { @@ -34,13 +36,13 @@ function buildEvent(eventType, res, args, functionName) { } switch (eventType) { case EventTypes.INIT: - eventInfo.data = {event: 'controller inited'} + eventInfo.data = { event: 'controller inited' } break case EventTypes.START: - eventInfo.data = {event: `controller started: ${res}`} + eventInfo.data = { event: `controller started: ${res}` } break case EventTypes.USER_CREATED: - eventInfo.data = {event: 'user created'} + eventInfo.data = { event: 'user created' } break case EventTypes.RUNNING_TIME: eventInfo.data = { @@ -49,77 +51,75 @@ function buildEvent(eventType, res, args, functionName) { } break case EventTypes.IOFOG_CREATED: - eventInfo.data = {event: 'iofog agent created'} + eventInfo.data = { event: 'iofog agent created' } break case EventTypes.IOFOG_PROVISION: - eventInfo.data = {event: 'iofog agent provisioned'} + eventInfo.data = { event: 'iofog agent provisioned' } break case EventTypes.CATALOG_CREATED: - eventInfo.data = {event: 'catalog item was created'} + eventInfo.data = { event: 'catalog item was created' } break case EventTypes.MICROSERVICE_CREATED: - eventInfo.data = {event: 'microservice created'} + eventInfo.data = { event: 'microservice created' } break case EventTypes.CONFIG_CHANGED: - eventInfo.data = {event: `new config property '${res}'`} + eventInfo.data = { event: `new config property '${res}'` } break case EventTypes.OTHER: - eventInfo.data = {event: `function ${functionName} was executed`} + eventInfo.data = { event: `function ${functionName} was executed` } break } return eventInfo } function sendEvents(events) { + if (process.env.NODE_ENV != 'test') { + return + } + for (const event of events) { event.data = JSON.parse(event.data) } const body = { events: events, } - const data = JSON.stringify(body) + const options = { - host: 'analytics.iofog.org', - path: '/post', + uri: 'https://analytics.iofog.org/post', method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(data), - }, + body, + json: true, } - const request = https.request(options) - request.write(data) - request.end() + request(options).catch((e) => {}) } -function getUniqueTrackingUuid() { +function initTrackingUuid() { let uuid - + const path = `${Constants.ROOT_DIR}/src/config/tracking-uuid` try { - let allMacs = '' - const interfaces = os.networkInterfaces() - for (const i in interfaces) { - if (interfaces.hasOwnProperty(i)) { - let networkInterface = interfaces[i] - if (Array.isArray(networkInterface)) { - networkInterface = networkInterface.length > 0 ? networkInterface[0] : null - } - - if (!networkInterface || networkInterface.internal) { - continue - } - - allMacs += networkInterface.mac + '-' - } + if (!fs.existsSync(path)) { + return createTrackingUuidFile(path) + } + + uuid = fs.readFileSync(path).toString('utf8') + if (uuid.length < 32) { + return createTrackingUuidFile(path) } - uuid = crypto.createHash('md5').update(allMacs).digest('hex') } catch (e) { - uuid = 'random_' + AppHelper.generateRandomString(32) + logger.silly('Error while getting tracking UUID') + uuid = `temp_${AppHelper.generateRandomString(32)}` } return uuid } +function createTrackingUuidFile(path) { + const uuid = AppHelper.generateRandomString(32) + fs.writeFileSync(path, uuid) + + return uuid +} + async function processEvent(event, fArgs) { event.data = JSON.stringify(event.data) if (isOnline()) { @@ -140,7 +140,6 @@ async function processEvent(event, fArgs) { } module.exports = { - trackingUuid: trackingUuid, buildEvent: buildEvent, sendEvents: sendEvents, processEvent: processEvent, diff --git a/test/postman_collection.json b/test/postman_collection.json index c2f8548c2..d62b867a0 100644 --- a/test/postman_collection.json +++ b/test/postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "f6f55915-03c9-4758-afb2-80734c2e9e01", + "_postman_id": "b729b57d-2b43-4f3e-a4ce-3e98b534baba", "name": "Controller Testing", "description": "iofog-controller collection", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" @@ -676,6 +676,367 @@ } ] }, + { + "name": "Connector", + "item": [ + { + "name": "Create user", + "event": [ + { + "listen": "test", + "script": { + "id": "954febdd-1a16-4db0-bdff-bd13fc50a451", + "exec": [ + "tests[\"Status code is 201\"] = responseCode.code === 201;", + "", + "var data = JSON.parse(responseBody);", + "", + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + }, + "url": { + "raw": "{{host}}/api/v3/user/signup", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "user", + "signup" + ] + } + }, + "response": [] + }, + { + "name": "Login", + "event": [ + { + "listen": "test", + "script": { + "id": "4f7a9f52-12cc-49d0-9e2f-147b6f5cb6fa", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "", + "var data = JSON.parse(responseBody);", + "", + "tests[\"Response validation passed\"] = data.accessToken;", + "", + "", + "postman.setGlobalVariable(\"user-token\", data.accessToken);", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + }, + "url": { + "raw": "{{host}}/api/v3/user/login", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "user", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Add connector", + "event": [ + { + "listen": "test", + "script": { + "id": "4f7a9f52-12cc-49d0-9e2f-147b6f5cb6fa", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "", + "var data = JSON.parse(responseBody);", + "", + "tests[\"Response validation passed\"] = data.hasOwnProperty('id');", + "", + "postman.setGlobalVariable(\"connector-ip\", data.publicIp);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "{{user-token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"MyConnector\",\n \"domain\": \"ConnectorDomain\",\n \"publicIp\": \"1.2.3.4\", \"devMode\": true\n}" + }, + "url": { + "raw": "{{host}}/api/v3/connector", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "connector" + ] + } + }, + "response": [] + }, + { + "name": "Get Connectors", + "event": [ + { + "listen": "test", + "script": { + "id": "4f7a9f52-12cc-49d0-9e2f-147b6f5cb6fa", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "", + "var data = JSON.parse(responseBody);", + "", + "tests[\"Response validation passed\"] = data.hasOwnProperty('connectors') && data.connectors.length === 1" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "{{user-token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{host}}/api/v3/connector", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "connector" + ] + } + }, + "response": [] + }, + { + "name": "Update Connector", + "event": [ + { + "listen": "test", + "script": { + "id": "4f7a9f52-12cc-49d0-9e2f-147b6f5cb6fa", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "", + "var data = JSON.parse(responseBody);", + "", + "tests[\"Response validation passed\"] = data.hasOwnProperty('name') && data.name === 'updatedName';" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "{{user-token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"updatedName\",\n \"publicIp\": \"{{connector-ip}}\" \n}" + }, + "url": { + "raw": "{{host}}/api/v3/connector", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "connector" + ] + } + }, + "response": [] + }, + { + "name": "Delete Connector", + "event": [ + { + "listen": "test", + "script": { + "id": "4f7a9f52-12cc-49d0-9e2f-147b6f5cb6fa", + "exec": [ + "tests[\"Status code is 204\"] = responseCode.code === 204;" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "{{user-token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"publicIp\": \"{{connector-ip}}\"\n}" + }, + "url": { + "raw": "{{host}}/api/v3/connector", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "connector" + ] + } + }, + "response": [] + }, + { + "name": "Delete user", + "event": [ + { + "listen": "test", + "script": { + "id": "954febdd-1a16-4db0-bdff-bd13fc50a451", + "exec": [ + "tests[\"Status code is 204\"] = responseCode.code === 204;" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Authorization", + "value": "{{user-token}}" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{host}}/api/v3/user/profile", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "user", + "profile" + ] + } + }, + "response": [] + } + ], + "description": "Connector collection", + "event": [ + { + "listen": "prerequest", + "script": { + "id": "9bbd4e2b-52b4-459e-b897-da7c1b23bb67", + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "id": "b7c4da7e-1045-4b10-9512-01aa7a49939f", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ] + }, { "name": "Agent", "item": [ @@ -1672,6 +2033,54 @@ }, "response": [] }, + { + "name": "Tracking", + "event": [ + { + "listen": "test", + "script": { + "id": "8774bfa2-c3f6-46e1-8965-cedd4322ccf2", + "exec": [ + "tests[\"Status code is 204\"] = responseCode.code === 204;" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{agent-token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"events\": [\n {\n \"uuid\": \"test_tracking\",\n \"sourceType\": \"agent\",\n \"timestamp\": 1551694999,\n \"type\": \"test\",\n \"data\": {\n \"event\":\"test\"\n }\n }\n ]\n}" + }, + "url": { + "raw": "{{host}}/api/v3/agent/tracking", + "host": [ + "{{host}}" + ], + "path": [ + "api", + "v3", + "agent", + "tracking" + ] + } + }, + "response": [] + }, { "name": "Delete agent node", "event": [ @@ -3263,7 +3672,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ]\n}\n" + "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { "raw": "{{host}}/api/v3/microservices", @@ -3346,7 +3755,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.uuid && data.config && data.name && data.hasOwnProperty('rootHostAccess') && data.hasOwnProperty('logSize');" + "tests[\"Response validation passed\"] = data.uuid && data.config && data.name && data.hasOwnProperty('rootHostAccess') && data.hasOwnProperty('logSize') && data.hasOwnProperty('env') && data.env.length === 2 && data.hasOwnProperty('cmd') && data.cmd.length === 3;" ], "type": "text/javascript" } diff --git a/test/src/controllers/agent-controller.test.js b/test/src/controllers/agent-controller.test.js index e8ff593a4..34eed949f 100644 --- a/test/src/controllers/agent-controller.test.js +++ b/test/src/controllers/agent-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const AgentController = require('../../../src/controllers/agent-controller') @@ -55,7 +55,7 @@ describe('Agent Controller', () => { describe('.agentDeprovisionEndPoint()', () => { def('fog', () => 'fog!') - const deprovisionData = {microserviceUuids: ['uuid']} + const deprovisionData = { microserviceUuids: ['uuid'] } def('req', () => ({ body: deprovisionData, @@ -805,7 +805,7 @@ describe('Agent Controller', () => { def('fog', () => 'fog!') def('req', () => ({ - body: {events: []}, + body: { events: [] }, })) def('response', () => Promise.resolve()) def('subject', () => $subject.postTrackingEndPoint($req, $fog)) diff --git a/test/src/controllers/catalog-controller.test.js b/test/src/controllers/catalog-controller.test.js index d808d8379..de5298578 100644 --- a/test/src/controllers/catalog-controller.test.js +++ b/test/src/controllers/catalog-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const CatalogController = require('../../../src/controllers/catalog-controller') @@ -64,12 +64,12 @@ describe('Catalog Controller', () => { def('subject', () => $subject.createCatalogItemEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(CatalogService, 'createCatalogItem').returns($response) + $sandbox.stub(CatalogService, 'createCatalogItemEndPoint').returns($response) }) - it('calls CatalogService.createCatalogItem with correct args', async () => { + it('calls CatalogService.createCatalogItemEndPoint with correct args', async () => { await $subject - expect(CatalogService.createCatalogItem).to.have.been.calledWith({ + expect(CatalogService.createCatalogItemEndPoint).to.have.been.calledWith({ name: $name, description: $description, category: $category, @@ -86,7 +86,7 @@ describe('Catalog Controller', () => { }, $user) }) - context('when CatalogService#createCatalogItem fails', () => { + context('when CatalogService#createCatalogItemEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -96,7 +96,7 @@ describe('Catalog Controller', () => { }) }) - context('when CatalogService#createCatalogItem succeeds', () => { + context('when CatalogService#createCatalogItemEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -113,15 +113,15 @@ describe('Catalog Controller', () => { def('subject', () => $subject.listCatalogItemsEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(CatalogService, 'listCatalogItems').returns($response) + $sandbox.stub(CatalogService, 'listCatalogItemsEndPoint').returns($response) }) - it('calls CatalogService.listCatalogItems with correct args', async () => { + it('calls CatalogService.listCatalogItemsEndPoint with correct args', async () => { await $subject - expect(CatalogService.listCatalogItems).to.have.been.calledWith($user, false) + expect(CatalogService.listCatalogItemsEndPoint).to.have.been.calledWith($user, false) }) - context('when CatalogService#listCatalogItems fails', () => { + context('when CatalogService#listCatalogItemsEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -131,7 +131,7 @@ describe('Catalog Controller', () => { }) }) - context('when CatalogService#listCatalogItems succeeds', () => { + context('when CatalogService#listCatalogItemsEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -153,15 +153,15 @@ describe('Catalog Controller', () => { def('subject', () => $subject.listCatalogItemEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(CatalogService, 'getCatalogItem').returns($response) + $sandbox.stub(CatalogService, 'getCatalogItemEndPoint').returns($response) }) - it('calls CatalogService.getCatalogItem with correct args', async () => { + it('calls CatalogService.getCatalogItemEndPoint with correct args', async () => { await $subject - expect(CatalogService.getCatalogItem).to.have.been.calledWith($id, $user, false) + expect(CatalogService.getCatalogItemEndPoint).to.have.been.calledWith($id, $user, false) }) - context('when CatalogService#getCatalogItem fails', () => { + context('when CatalogService#getCatalogItemEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -171,7 +171,7 @@ describe('Catalog Controller', () => { }) }) - context('when CatalogService#getCatalogItem succeeds', () => { + context('when CatalogService#getCatalogItemEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -192,15 +192,15 @@ describe('Catalog Controller', () => { def('subject', () => $subject.deleteCatalogItemEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(CatalogService, 'deleteCatalogItem').returns($response) + $sandbox.stub(CatalogService, 'deleteCatalogItemEndPoint').returns($response) }) - it('calls CatalogService.deleteCatalogItem with correct args', async () => { + it('calls CatalogService.deleteCatalogItemEndPoint with correct args', async () => { await $subject - expect(CatalogService.deleteCatalogItem).to.have.been.calledWith($id, $user, false) + expect(CatalogService.deleteCatalogItemEndPoint).to.have.been.calledWith($id, $user, false) }) - context('when CatalogService#deleteCatalogItem fails', () => { + context('when CatalogService#deleteCatalogItemEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -210,7 +210,7 @@ describe('Catalog Controller', () => { }) }) - context('when CatalogService#deleteCatalogItem succeeds', () => { + context('when CatalogService#deleteCatalogItemEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -275,12 +275,12 @@ describe('Catalog Controller', () => { def('subject', () => $subject.updateCatalogItemEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(CatalogService, 'updateCatalogItem').returns($response) + $sandbox.stub(CatalogService, 'updateCatalogItemEndPoint').returns($response) }) - it('calls CatalogService.updateCatalogItem with correct args', async () => { + it('calls CatalogService.updateCatalogItemEndPoint with correct args', async () => { await $subject - expect(CatalogService.updateCatalogItem).to.have.been.calledWith($id, { + expect(CatalogService.updateCatalogItemEndPoint).to.have.been.calledWith($id, { name: $name, description: $description, category: $category, @@ -297,7 +297,7 @@ describe('Catalog Controller', () => { }, $user, false) }) - context('when CatalogService.updateCatalogItem fails', () => { + context('when CatalogService.updateCatalogItemEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -307,7 +307,7 @@ describe('Catalog Controller', () => { }) }) - context('when CatalogService.updateCatalogItem succeeds', () => { + context('when CatalogService.updateCatalogItemEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) diff --git a/test/src/controllers/controller-controller.test.js b/test/src/controllers/controller-controller.test.js index a7b4e5386..fa4f664cd 100644 --- a/test/src/controllers/controller-controller.test.js +++ b/test/src/controllers/controller-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const Controller = require('../../../src/controllers/controller') diff --git a/test/src/controllers/diagnostics-controller.test.js b/test/src/controllers/diagnostics-controller.test.js index df8dba453..f90382621 100644 --- a/test/src/controllers/diagnostics-controller.test.js +++ b/test/src/controllers/diagnostics-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const DiagnosticController = require('../../../src/controllers/diagnostic-controller') diff --git a/test/src/controllers/flow-controller.test.js b/test/src/controllers/flow-controller.test.js index 91fd73aed..4a04ecfab 100644 --- a/test/src/controllers/flow-controller.test.js +++ b/test/src/controllers/flow-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const FlowController = require('../../../src/controllers/flow-controller') @@ -29,19 +29,19 @@ describe('Flow Controller', () => { def('subject', () => $subject.createFlowEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(FlowService, 'createFlow').returns($response) + $sandbox.stub(FlowService, 'createFlowEndPoint').returns($response) }) - it('calls FlowService.createFlow with correct args', async () => { + it('calls FlowService.createFlowEndPoint with correct args', async () => { await $subject - expect(FlowService.createFlow).to.have.been.calledWith({ + expect(FlowService.createFlowEndPoint).to.have.been.calledWith({ name: $name, description: $description, isActivated: $isActivated, }, $user, false) }) - context('when FlowService#createFlow fails', () => { + context('when FlowService#createFlowEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -51,7 +51,7 @@ describe('Flow Controller', () => { }) }) - context('when FlowService#createFlow succeeds', () => { + context('when FlowService#createFlowEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -68,15 +68,15 @@ describe('Flow Controller', () => { def('subject', () => $subject.getFlowsByUserEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(FlowService, 'getUserFlows').returns($response) + $sandbox.stub(FlowService, 'getUserFlowsEndPoint').returns($response) }) - it('calls FlowService.getUserFlows with correct args', async () => { + it('calls FlowService.getUserFlowsEndPoint with correct args', async () => { await $subject - expect(FlowService.getUserFlows).to.have.been.calledWith($user, false) + expect(FlowService.getUserFlowsEndPoint).to.have.been.calledWith($user, false) }) - context('when FlowService#getUserFlows fails', () => { + context('when FlowService#getUserFlowsEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -86,7 +86,7 @@ describe('Flow Controller', () => { }) }) - context('when FlowService#getUserFlows succeeds', () => { + context('when FlowService#getUserFlowsEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -107,15 +107,15 @@ describe('Flow Controller', () => { def('subject', () => $subject.getFlowEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(FlowService, 'getFlowWithTransaction').returns($response) + $sandbox.stub(FlowService, 'getFlowEndPoint').returns($response) }) - it('calls FlowService.getFlowWithTransaction with correct args', async () => { + it('calls FlowService.getFlowEndPoint with correct args', async () => { await $subject - expect(FlowService.getFlowWithTransaction).to.have.been.calledWith($id, $user, false) + expect(FlowService.getFlowEndPoint).to.have.been.calledWith($id, $user, false) }) - context('when FlowService#getFlowWithTransaction fails', () => { + context('when FlowService#getFlowEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -125,7 +125,7 @@ describe('Flow Controller', () => { }) }) - context('when FlowService#getFlowWithTransaction succeeds', () => { + context('when FlowService#getFlowEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -155,19 +155,19 @@ describe('Flow Controller', () => { def('subject', () => $subject.updateFlowEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(FlowService, 'updateFlow').returns($response) + $sandbox.stub(FlowService, 'updateFlowEndPoint').returns($response) }) - it('calls FlowService.updateFlow with correct args', async () => { + it('calls FlowService.updateFlowEndPoint with correct args', async () => { await $subject - expect(FlowService.updateFlow).to.have.been.calledWith({ + expect(FlowService.updateFlowEndPoint).to.have.been.calledWith({ name: $name, description: $description, isActivated: $isActivated, }, $id, $user, false) }) - context('when FlowService#updateFlow fails', () => { + context('when FlowService#updateFlowEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -177,7 +177,7 @@ describe('Flow Controller', () => { }) }) - context('when FlowService#updateFlow succeeds', () => { + context('when FlowService#updateFlowEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -198,15 +198,15 @@ describe('Flow Controller', () => { def('subject', () => $subject.deleteFlowEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(FlowService, 'deleteFlow').returns($response) + $sandbox.stub(FlowService, 'deleteFlowEndPoint').returns($response) }) - it('calls FlowService.deleteFlow with correct args', async () => { + it('calls FlowService.deleteFlowEndPoint with correct args', async () => { await $subject - expect(FlowService.deleteFlow).to.have.been.calledWith($id, $user, false) + expect(FlowService.deleteFlowEndPoint).to.have.been.calledWith($id, $user, false) }) - context('when FlowService.deleteFlow fails', () => { + context('when FlowService.deleteFlowEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -216,7 +216,7 @@ describe('Flow Controller', () => { }) }) - context('when FlowService.deleteFlow succeeds', () => { + context('when FlowService.deleteFlowEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) diff --git a/test/src/controllers/iofog-controller.test.js b/test/src/controllers/iofog-controller.test.js index 5a74fb5c6..1e8ad85db 100644 --- a/test/src/controllers/iofog-controller.test.js +++ b/test/src/controllers/iofog-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const ioFogController = require('../../../src/controllers/iofog-controller') @@ -65,12 +65,12 @@ describe('ioFog Controller', () => { def('subject', () => $subject.createFogEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'createFog').returns($response) + $sandbox.stub(ioFogService, 'createFogEndPoint').returns($response) }) - it('calls ioFogService.createFog with correct args', async () => { + it('calls ioFogService.createFogEndPoint with correct args', async () => { await $subject - expect(ioFogService.createFog).to.have.been.calledWith({ + expect(ioFogService.createFogEndPoint).to.have.been.calledWith({ name: $name, location: $location, latitude: $latitude, @@ -94,7 +94,7 @@ describe('ioFog Controller', () => { }, $user, false) }) - context('when ioFogService#createFog fails', () => { + context('when ioFogService#createFogEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -104,7 +104,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#createFog succeeds', () => { + context('when ioFogService#createFogEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -167,12 +167,12 @@ describe('ioFog Controller', () => { def('subject', () => $subject.updateFogEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'updateFog').returns($response) + $sandbox.stub(ioFogService, 'updateFogEndPoint').returns($response) }) - it('calls ioFogService.updateFog with correct args', async () => { + it('calls ioFogService.updateFogEndPoint with correct args', async () => { await $subject - expect(ioFogService.updateFog).to.have.been.calledWith({ + expect(ioFogService.updateFogEndPoint).to.have.been.calledWith({ uuid: $uuid, name: $name, location: $location, @@ -197,7 +197,7 @@ describe('ioFog Controller', () => { }, $user, false) }) - context('when ioFogService#updateFog fails', () => { + context('when ioFogService#updateFogEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -207,7 +207,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#updateFog succeeds', () => { + context('when ioFogService#updateFogEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -228,15 +228,15 @@ describe('ioFog Controller', () => { def('subject', () => $subject.deleteFogEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'deleteFog').returns($response) + $sandbox.stub(ioFogService, 'deleteFogEndPoint').returns($response) }) - it('calls ioFogService.deleteFog with correct args', async () => { + it('calls ioFogService.deleteFogEndPoint with correct args', async () => { await $subject - expect(ioFogService.deleteFog).to.have.been.calledWith({uuid: $uuid}, $user, false) + expect(ioFogService.deleteFogEndPoint).to.have.been.calledWith({ uuid: $uuid }, $user, false) }) - context('when ioFogService#deleteFog fails', () => { + context('when ioFogService#deleteFogEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -246,7 +246,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#deleteFog succeeds', () => { + context('when ioFogService#deleteFogEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -266,15 +266,15 @@ describe('ioFog Controller', () => { def('subject', () => $subject.getFogEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'getFogWithTransaction').returns($response) + $sandbox.stub(ioFogService, 'getFogEndPoint').returns($response) }) - it('calls ioFogService.getFogWithTransaction with correct args', async () => { + it('calls ioFogService.getFogEndPoint with correct args', async () => { await $subject - expect(ioFogService.getFogWithTransaction).to.have.been.calledWith({uuid: $uuid}, $user, false) + expect(ioFogService.getFogEndPoint).to.have.been.calledWith({ uuid: $uuid }, $user, false) }) - context('when ioFogService#getFogWithTransaction fails', () => { + context('when ioFogService#getFogEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -284,7 +284,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#getFogWithTransaction succeeds', () => { + context('when ioFogService#getFogEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -308,7 +308,7 @@ describe('ioFog Controller', () => { beforeEach(() => { $sandbox.stub(qs, 'parse').returns($queryParseResponse) - $sandbox.stub(ioFogService, 'getFogList').returns($response) + $sandbox.stub(ioFogService, 'getFogListEndPoint').returns($response) }) it('calls qs.parse with correct args', async () => { @@ -327,12 +327,12 @@ describe('ioFog Controller', () => { }) context('when qs.parse succeeds', () => { - it('calls ioFogService.getFogList with correct args', async () => { + it('calls ioFogService.getFogListEndPoint with correct args', async () => { await $subject - expect(ioFogService.getFogList).to.have.been.calledWith($filters, $user, false) + expect(ioFogService.getFogListEndPoint).to.have.been.calledWith($filters, $user, false) }) - context('when ioFogService.getFogList fails', () => { + context('when ioFogService.getFogListEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -342,7 +342,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService.getFogList succeeds', () => { + context('when ioFogService.getFogListEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -363,15 +363,15 @@ describe('ioFog Controller', () => { def('subject', () => $subject.generateProvisioningKeyEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'generateProvisioningKey').returns($response) + $sandbox.stub(ioFogService, 'generateProvisioningKeyEndPoint').returns($response) }) - it('calls ioFogService.generateProvisioningKey with correct args', async () => { + it('calls ioFogService.generateProvisioningKeyEndPoint with correct args', async () => { await $subject - expect(ioFogService.generateProvisioningKey).to.have.been.calledWith({uuid: $uuid}, $user, false) + expect(ioFogService.generateProvisioningKeyEndPoint).to.have.been.calledWith({ uuid: $uuid }, $user, false) }) - context('when ioFogService#generateProvisioningKey fails', () => { + context('when ioFogService#generateProvisioningKeyEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -381,7 +381,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#generateProvisioningKey succeeds', () => { + context('when ioFogService#generateProvisioningKeyEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -403,18 +403,18 @@ describe('ioFog Controller', () => { def('subject', () => $subject.setFogVersionCommandEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'setFogVersionCommand').returns($response) + $sandbox.stub(ioFogService, 'setFogVersionCommandEndPoint').returns($response) }) - it('calls ioFogService.setFogVersionCommand with correct args', async () => { + it('calls ioFogService.setFogVersionCommandEndPoint with correct args', async () => { await $subject - expect(ioFogService.setFogVersionCommand).to.have.been.calledWith({ + expect(ioFogService.setFogVersionCommandEndPoint).to.have.been.calledWith({ uuid: $uuid, versionCommand: $versionCommand, }, $user, false) }) - context('when ioFogService#setFogVersionCommand fails', () => { + context('when ioFogService#setFogVersionCommandEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -424,7 +424,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#setFogVersionCommand succeeds', () => { + context('when ioFogService#setFogVersionCommandEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -444,15 +444,15 @@ describe('ioFog Controller', () => { def('subject', () => $subject.setFogRebootCommandEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'setFogRebootCommand').returns($response) + $sandbox.stub(ioFogService, 'setFogRebootCommandEndPoint').returns($response) }) - it('calls ioFogService.setFogRebootCommand with correct args', async () => { + it('calls ioFogService.setFogRebootCommandEndPoint with correct args', async () => { await $subject - expect(ioFogService.setFogRebootCommand).to.have.been.calledWith({uuid: $uuid}, $user, false) + expect(ioFogService.setFogRebootCommandEndPoint).to.have.been.calledWith({ uuid: $uuid }, $user, false) }) - context('when ioFogService#setFogRebootCommand fails', () => { + context('when ioFogService#setFogRebootCommandEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -462,7 +462,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#setFogRebootCommand succeeds', () => { + context('when ioFogService#setFogRebootCommandEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -482,15 +482,15 @@ describe('ioFog Controller', () => { def('subject', () => $subject.getHalHardwareInfoEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'getHalHardwareInfo').returns($response) + $sandbox.stub(ioFogService, 'getHalHardwareInfoEndPoint').returns($response) }) - it('calls ioFogService.getHalHardwareInfo with correct args', async () => { + it('calls ioFogService.getHalHardwareInfoEndPoint with correct args', async () => { await $subject - expect(ioFogService.getHalHardwareInfo).to.have.been.calledWith({uuid: $uuid}, $user, false) + expect(ioFogService.getHalHardwareInfoEndPoint).to.have.been.calledWith({ uuid: $uuid }, $user, false) }) - context('when ioFogService#getHalHardwareInfo fails', () => { + context('when ioFogService#getHalHardwareInfoEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -500,7 +500,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#getHalHardwareInfo succeeds', () => { + context('when ioFogService#getHalHardwareInfoEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -516,19 +516,19 @@ describe('ioFog Controller', () => { uuid: $uuid, }, })) - def('response', () => Promise.resolve({info: undefined})) + def('response', () => Promise.resolve({ info: undefined })) def('subject', () => $subject.getHalUsbInfoEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(ioFogService, 'getHalUsbInfo').returns($response) + $sandbox.stub(ioFogService, 'getHalUsbInfoEndPoint').returns($response) }) - it('calls ioFogService.getHalUsbInfo with correct args', async () => { + it('calls ioFogService.getHalUsbInfoEndPoint with correct args', async () => { await $subject - expect(ioFogService.getHalUsbInfo).to.have.been.calledWith({uuid: $uuid}, $user, false) + expect(ioFogService.getHalUsbInfoEndPoint).to.have.been.calledWith({ uuid: $uuid }, $user, false) }) - context('when ioFogService#getHalUsbInfo fails', () => { + context('when ioFogService#getHalUsbInfoEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -538,7 +538,7 @@ describe('ioFog Controller', () => { }) }) - context('when ioFogService#getHalUsbInfo succeeds', () => { + context('when ioFogService#getHalUsbInfoEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.have.property('info') }) diff --git a/test/src/controllers/microservices-controller.test.js b/test/src/controllers/microservices-controller.test.js index 261c476ac..829752880 100644 --- a/test/src/controllers/microservices-controller.test.js +++ b/test/src/controllers/microservices-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const MicroservicesController = require('../../../src/controllers/microservices-controller') @@ -55,12 +55,12 @@ describe('Microservices Controller', () => { def('subject', () => $subject.createMicroserviceOnFogEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'createMicroservice').returns($response) + $sandbox.stub(MicroservicesService, 'createMicroserviceEndPoint').returns($response) }) - it('calls MicroservicesService.createMicroservice with correct args', async () => { + it('calls MicroservicesService.createMicroserviceEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.createMicroservice).to.have.been.calledWith({ + expect(MicroservicesService.createMicroserviceEndPoint).to.have.been.calledWith({ name: $name, config: $config, catalogItemId: $catalogItemId, @@ -74,7 +74,7 @@ describe('Microservices Controller', () => { }, $user, false) }) - context('when MicroservicesService#createMicroservice fails', () => { + context('when MicroservicesService#createMicroserviceEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -84,7 +84,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#createMicroservice succeeds', () => { + context('when MicroservicesService#createMicroserviceEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -105,15 +105,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.getMicroserviceEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'getMicroservice').returns($response) + $sandbox.stub(MicroservicesService, 'getMicroserviceEndPoint').returns($response) }) - it('calls MicroservicesService.getMicroservice with correct args', async () => { + it('calls MicroservicesService.getMicroserviceEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.getMicroservice).to.have.been.calledWith($uuid, $user, false) + expect(MicroservicesService.getMicroserviceEndPoint).to.have.been.calledWith($uuid, $user, false) }) - context('when MicroservicesService#getMicroservice fails', () => { + context('when MicroservicesService#getMicroserviceEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -123,7 +123,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#getMicroservice succeeds', () => { + context('when MicroservicesService#getMicroserviceEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -165,12 +165,12 @@ describe('Microservices Controller', () => { def('subject', () => $subject.updateMicroserviceEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'updateMicroservice').returns($response) + $sandbox.stub(MicroservicesService, 'updateMicroserviceEndPoint').returns($response) }) - it('calls MicroservicesService.updateMicroservice with correct args', async () => { + it('calls MicroservicesService.updateMicroserviceEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.updateMicroservice).to.have.been.calledWith($uuid, { + expect(MicroservicesService.updateMicroserviceEndPoint).to.have.been.calledWith($uuid, { name: $name, config: $config, rebuild: $rebuild, @@ -181,7 +181,7 @@ describe('Microservices Controller', () => { }, $user, false) }) - context('when MicroservicesService#updateMicroservice fails', () => { + context('when MicroservicesService#updateMicroserviceEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -191,7 +191,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#updateMicroservice succeeds', () => { + context('when MicroservicesService#updateMicroserviceEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -216,17 +216,17 @@ describe('Microservices Controller', () => { def('subject', () => $subject.deleteMicroserviceEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'deleteMicroservice').returns($response) + $sandbox.stub(MicroservicesService, 'deleteMicroserviceEndPoint').returns($response) }) - it('calls MicroservicesService.deleteMicroservice with correct args', async () => { + it('calls MicroservicesService.deleteMicroserviceEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.deleteMicroservice).to.have.been.calledWith($uuid, { + expect(MicroservicesService.deleteMicroserviceEndPoint).to.have.been.calledWith($uuid, { withCleanup: $withCleanup, }, $user, false) }) - context('when MicroservicesService#deleteMicroservice fails', () => { + context('when MicroservicesService#deleteMicroserviceEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -236,7 +236,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#deleteMicroservice succeeds', () => { + context('when MicroservicesService#deleteMicroserviceEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -256,15 +256,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.getMicroservicesByFlowEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'listMicroservices').returns($response) + $sandbox.stub(MicroservicesService, 'listMicroservicesEndPoint').returns($response) }) - it('calls MicroservicesService.listMicroservices with correct args', async () => { + it('calls MicroservicesService.listMicroservicesEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.listMicroservices).to.have.been.calledWith($flowId, $user, false) + expect(MicroservicesService.listMicroservicesEndPoint).to.have.been.calledWith($flowId, $user, false) }) - context('when MicroservicesService#listMicroservices fails', () => { + context('when MicroservicesService#listMicroservicesEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -274,7 +274,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#listMicroservices succeeds', () => { + context('when MicroservicesService#listMicroservicesEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -296,15 +296,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.createMicroserviceRouteEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'createRoute').returns($response) + $sandbox.stub(MicroservicesService, 'createRouteEndPoint').returns($response) }) - it('calls MicroservicesService.createRoute with correct args', async () => { + it('calls MicroservicesService.createRouteEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.createRoute).to.have.been.calledWith($uuid, $receiverUuid, $user, false) + expect(MicroservicesService.createRouteEndPoint).to.have.been.calledWith($uuid, $receiverUuid, $user, false) }) - context('when MicroservicesService#createRoute fails', () => { + context('when MicroservicesService#createRouteEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -314,7 +314,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#createRoute succeeds', () => { + context('when MicroservicesService#createRouteEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -336,15 +336,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.deleteMicroserviceRouteEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'deleteRoute').returns($response) + $sandbox.stub(MicroservicesService, 'deleteRouteEndPoint').returns($response) }) - it('calls MicroservicesService.deleteRoute with correct args', async () => { + it('calls MicroservicesService.deleteRouteEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.deleteRoute).to.have.been.calledWith($uuid, $receiverUuid, $user, false) + expect(MicroservicesService.deleteRouteEndPoint).to.have.been.calledWith($uuid, $receiverUuid, $user, false) }) - context('when MicroservicesService#deleteRoute fails', () => { + context('when MicroservicesService#deleteRouteEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -354,7 +354,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#deleteRoute succeeds', () => { + context('when MicroservicesService#deleteRouteEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -382,19 +382,19 @@ describe('Microservices Controller', () => { def('subject', () => $subject.createMicroservicePortMappingEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'createPortMapping').returns($response) + $sandbox.stub(MicroservicesService, 'createPortMappingEndPoint').returns($response) }) - it('calls MicroservicesService.createPortMapping with correct args', async () => { + it('calls MicroservicesService.createPortMappingEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.createPortMapping).to.have.been.calledWith($uuid, { + expect(MicroservicesService.createPortMappingEndPoint).to.have.been.calledWith($uuid, { internal: $internal, external: $external, publicMode: $publicMode, }, $user, false) }) - context('when MicroservicesService#createPortMapping fails', () => { + context('when MicroservicesService#createPortMappingEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -404,7 +404,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#createPortMapping succeeds', () => { + context('when MicroservicesService#createPortMappingEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -426,15 +426,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.deleteMicroservicePortMappingEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'deletePortMapping').returns($response) + $sandbox.stub(MicroservicesService, 'deletePortMappingEndPoint').returns($response) }) - it('calls MicroservicesService.deletePortMapping with correct args', async () => { + it('calls MicroservicesService.deletePortMappingEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.deletePortMapping).to.have.been.calledWith($uuid, $internalPort, $user, false) + expect(MicroservicesService.deletePortMappingEndPoint).to.have.been.calledWith($uuid, $internalPort, $user, false) }) - context('when MicroservicesService#deletePortMapping fails', () => { + context('when MicroservicesService#deletePortMappingEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -444,7 +444,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#deletePortMapping succeeds', () => { + context('when MicroservicesService#deletePortMappingEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) @@ -464,15 +464,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.getMicroservicePortMappingListEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'listMicroservicePortMappings').returns($response) + $sandbox.stub(MicroservicesService, 'listMicroservicePortMappingsEndPoint').returns($response) }) - it('calls MicroservicesService.listMicroservicePortMappings with correct args', async () => { + it('calls MicroservicesService.listMicroservicePortMappingsEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.listMicroservicePortMappings).to.have.been.calledWith($uuid, $user, false) + expect(MicroservicesService.listMicroservicePortMappingsEndPoint).to.have.been.calledWith($uuid, $user, false) }) - context('when MicroservicesService#listMicroservicePortMappings fails', () => { + context('when MicroservicesService#listMicroservicePortMappingsEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -482,7 +482,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#listMicroservicePortMappings succeeds', () => { + context('when MicroservicesService#listMicroservicePortMappingsEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.have.property('ports') }) @@ -507,23 +507,23 @@ describe('Microservices Controller', () => { accessMode: $accessMode, }, })) - def('response', () => Promise.resolve({id: 15})) + def('response', () => Promise.resolve({ id: 15 })) def('subject', () => $subject.createMicroserviceVolumeMappingEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'createVolumeMapping').returns($response) + $sandbox.stub(MicroservicesService, 'createVolumeMappingEndPoint').returns($response) }) - it('calls MicroservicesService.createVolumeMapping with correct args', async () => { + it('calls MicroservicesService.createVolumeMappingEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.createVolumeMapping).to.have.been.calledWith($uuid, { + expect(MicroservicesService.createVolumeMappingEndPoint).to.have.been.calledWith($uuid, { hostDestination: $hostDestination, containerDestination: $containerDestination, accessMode: $accessMode, }, $user, false) }) - context('when MicroservicesService#createVolumeMapping fails', () => { + context('when MicroservicesService#createVolumeMappingEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -533,7 +533,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#createVolumeMapping succeeds', () => { + context('when MicroservicesService#createVolumeMappingEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.have.property('id') }) @@ -553,15 +553,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.listMicroserviceVolumeMappingsEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'listVolumeMappings').returns($response) + $sandbox.stub(MicroservicesService, 'listVolumeMappingsEndPoint').returns($response) }) - it('calls MicroservicesService.listVolumeMappings with correct args', async () => { + it('calls MicroservicesService.listVolumeMappingsEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.listVolumeMappings).to.have.been.calledWith($uuid, $user, false) + expect(MicroservicesService.listVolumeMappingsEndPoint).to.have.been.calledWith($uuid, $user, false) }) - context('when MicroservicesService#listVolumeMappings fails', () => { + context('when MicroservicesService#listVolumeMappingsEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -571,7 +571,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#listVolumeMappings succeeds', () => { + context('when MicroservicesService#listVolumeMappingsEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.have.property('volumeMappings') }) @@ -593,15 +593,15 @@ describe('Microservices Controller', () => { def('subject', () => $subject.deleteMicroserviceVolumeMappingEndPoint($req, $user)) beforeEach(() => { - $sandbox.stub(MicroservicesService, 'deleteVolumeMapping').returns($response) + $sandbox.stub(MicroservicesService, 'deleteVolumeMappingEndPoint').returns($response) }) - it('calls MicroservicesService.deleteVolumeMapping with correct args', async () => { + it('calls MicroservicesService.deleteVolumeMappingEndPoint with correct args', async () => { await $subject - expect(MicroservicesService.deleteVolumeMapping).to.have.been.calledWith($uuid, $id, $user, false) + expect(MicroservicesService.deleteVolumeMappingEndPoint).to.have.been.calledWith($uuid, $id, $user, false) }) - context('when MicroservicesService#deleteVolumeMapping fails', () => { + context('when MicroservicesService#deleteVolumeMappingEndPoint fails', () => { const error = 'Error!' def('response', () => Promise.reject(error)) @@ -611,7 +611,7 @@ describe('Microservices Controller', () => { }) }) - context('when MicroservicesService#deleteVolumeMapping succeeds', () => { + context('when MicroservicesService#deleteVolumeMappingEndPoint succeeds', () => { it(`succeeds`, () => { return expect($subject).to.eventually.equal(undefined) }) diff --git a/test/src/controllers/registry-controller.test.js b/test/src/controllers/registry-controller.test.js index 2cc4328af..56dc46d91 100644 --- a/test/src/controllers/registry-controller.test.js +++ b/test/src/controllers/registry-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const RegistryController = require('../../../src/controllers/registry-controller') diff --git a/test/src/controllers/tunnel-controller.test.js b/test/src/controllers/tunnel-controller.test.js index 6841ffd52..ca204db8e 100644 --- a/test/src/controllers/tunnel-controller.test.js +++ b/test/src/controllers/tunnel-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const TunnelController = require('../../../src/controllers/tunnel-controller') @@ -33,7 +33,7 @@ describe('Tunnel Controller', () => { context('when action is "open"', async () => { it('calls TunnelService#openTunnel with correct args', async () => { await $subject - expect(TunnelService.openTunnel).to.have.been.calledWith({iofogUuid: $id}, $user, false) + expect(TunnelService.openTunnel).to.have.been.calledWith({ iofogUuid: $id }, $user, false) }) context('when TunnelService#openTunnel fails', () => { @@ -58,7 +58,7 @@ describe('Tunnel Controller', () => { it('calls TunnelService#closeTunnel with correct args', async () => { await $subject - expect(TunnelService.closeTunnel).to.have.been.calledWith({iofogUuid: $id}, $user) + expect(TunnelService.closeTunnel).to.have.been.calledWith({ iofogUuid: $id }, $user) }) context('when TunnelService#closeTunnel fails', () => { @@ -107,7 +107,7 @@ describe('Tunnel Controller', () => { it('calls TunnelService#findTunnel with correct args', async () => { await $subject - expect(TunnelService.findTunnel).to.have.been.calledWith({iofogUuid: $id}, $user) + expect(TunnelService.findTunnel).to.have.been.calledWith({ iofogUuid: $id }, $user) }) context('when TunnelService#findTunnel fails', () => { diff --git a/test/src/controllers/user-controller.test.js b/test/src/controllers/user-controller.test.js index 435c7d062..508659ca2 100644 --- a/test/src/controllers/user-controller.test.js +++ b/test/src/controllers/user-controller.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const UserController = require('../../../src/controllers/user-controller') diff --git a/test/src/helpers/app-helpers.test.js b/test/src/helpers/app-helpers.test.js index e12956ce0..5d906a54e 100644 --- a/test/src/helpers/app-helpers.test.js +++ b/test/src/helpers/app-helpers.test.js @@ -1,5 +1,5 @@ const crypto = require('crypto') -const {expect} = require('chai') +const { expect } = require('chai') const fs = require('fs') const path = require('path') const portscanner = require('portscanner') diff --git a/test/src/services/access-token-service.test.js b/test/src/services/access-token-service.test.js index e24b01620..6f3107a0b 100644 --- a/test/src/services/access-token-service.test.js +++ b/test/src/services/access-token-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const AccessTokenManager = require('../../../src/sequelize/managers/access-token-manager') diff --git a/test/src/services/agent-service.test.js b/test/src/services/agent-service.test.js index 4a47cbb86..f1a56fc09 100644 --- a/test/src/services/agent-service.test.js +++ b/test/src/services/agent-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const AgentService = require('../../../src/services/agent-service') @@ -232,8 +232,8 @@ describe('Agent Service', () => { describe('.agentDeprovision()', () => { - const deprovisionData = {microserviceUuids: ['uuid']} - const fogManagerUpdateData = {daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0'} + const deprovisionData = { microserviceUuids: ['uuid'] } + const fogManagerUpdateData = { daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0' } const transaction = {} const error = 'Error!' @@ -273,8 +273,8 @@ describe('Agent Service', () => { it('calls MicroserviceStatusManager.update with correct args', async () => { await $subject expect(MicroserviceStatusManager.update).to.have.been.calledWith( - {microserviceUuid: deprovisionData.microserviceUuids}, - {status: MicroserviceStates.NOT_RUNNING}, + { microserviceUuid: deprovisionData.microserviceUuids }, + { status: MicroserviceStates.NOT_RUNNING }, transaction ) }) @@ -517,6 +517,11 @@ describe('Agent Service', () => { memoryViolation: false, diskViolation: false, cpuViolation: false, + systemAvailableDisk: 1, + systemAvailableMemory: 1, + systemTotalCpu: 1.1, + securityStatus: 'OK', + securityViolationInfo: '', repositoryCount: 5, repositoryStatus: 'testStatus', systemTime: 15325235253, @@ -543,6 +548,11 @@ describe('Agent Service', () => { memoryViolation: false, diskViolation: false, cpuViolation: false, + systemAvailableDisk: 1, + systemAvailableMemory: 1, + systemTotalCpu: 1.1, + securityStatus: 'OK', + securityViolationInfo: '', repositoryCount: 5, repositoryStatus: 'testStatus', systemTime: 15325235253, @@ -746,6 +756,22 @@ describe('Agent Service', () => { }, }, routes: routes, + env: [ + { + key: 'ENV_VAR1', + value: 'value1', + }, + ], + cmd: [ + { + id: 1, + cmd: 'ls', + }, + { + id: 1, + cmd: '-l', + }, + ], } const microserviceWithInvalidImage = { @@ -789,6 +815,16 @@ describe('Agent Service', () => { deleteWithCleanup: false, routes: routes, registryId: 10, + env: [ + { + key: 'ENV_VAR1', + value: 'value1', + }, + ], + cmd: [ + 'ls', + '-l', + ], }], } @@ -1471,7 +1507,7 @@ describe('Agent Service', () => { def('fog', () => 'fog!') def('events', () => []) - def('transaction', () => {}) + def('transaction', () => { }) def('subject', () => $subject.postTracking($events, $fog, $transaction)) diff --git a/test/src/services/catalog-service.test.js b/test/src/services/catalog-service.test.js index 78b611b68..80a3cf9ca 100644 --- a/test/src/services/catalog-service.test.js +++ b/test/src/services/catalog-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const CatalogItemManager = require('../../../src/sequelize/managers/catalog-item-manager') @@ -19,7 +19,7 @@ describe('Catalog Service', () => { afterEach(() => $sandbox.restore()) - describe('.createCatalogItem()', () => { + describe('.createCatalogItemEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -113,7 +113,7 @@ describe('Catalog Service', () => { catalogItemOutputType.infoFormat = data.outputType.infoFormat } - def('subject', () => $subject.createCatalogItem(data, user, transaction)) + def('subject', () => $subject.createCatalogItemEndPoint(data, user, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('catalogItemFindResponse', () => Promise.resolve()) @@ -158,8 +158,8 @@ describe('Catalog Service', () => { it('calls CatalogItemManager#findOne() with correct args', async () => { await $subject const where = catalogItem.id - ? {[Op.or]: [{userId: catalogItem.userId}, {userId: null}], name: data.name, id: {[Op.ne]: catalogItem.id}} - : {[Op.or]: [{userId: catalogItem.userId}, {userId: null}], name: data.name} + ? { [Op.or]: [{ userId: catalogItem.userId }, { userId: null }], name: data.name, id: { [Op.ne]: catalogItem.id } } + : { [Op.or]: [{ userId: catalogItem.userId }, { userId: null }], name: data.name } expect(CatalogItemManager.findOne).to.have.been.calledWith(where, transaction) }) @@ -301,7 +301,7 @@ describe('Catalog Service', () => { }) }) - describe('.updateCatalogItem()', () => { + describe('.updateCatalogItemEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -344,8 +344,8 @@ describe('Catalog Service', () => { const isCLI = false const where = isCLI - ? {id: id} - : {id: id, userId: user.id} + ? { id: id } + : { id: id, userId: user.id } data.id = id @@ -416,7 +416,7 @@ describe('Catalog Service', () => { catalogItemOutputType.infoFormat = data.outputType.infoFormat } - def('subject', () => $subject.updateCatalogItem(id, data, user, isCLI, transaction)) + def('subject', () => $subject.updateCatalogItemEndPoint(id, data, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('deleteUndefinedFieldsResponse1', () => catalogItem) @@ -516,11 +516,11 @@ describe('Catalog Service', () => { await $subject const whereFind = catalogItem.id ? { - [Op.or]: [{userId: catalogItem.userId}, {userId: null}], + [Op.or]: [{ userId: catalogItem.userId }, { userId: null }], name: data.name, - id: {[Op.ne]: catalogItem.id}, + id: { [Op.ne]: catalogItem.id }, } - : {[Op.or]: [{userId: catalogItem.userId}, {userId: null}], name: data.name} + : { [Op.or]: [{ userId: catalogItem.userId }, { userId: null }], name: data.name } expect(CatalogItemManager.findOne).to.have.been.calledWith(whereFind, transaction) }) @@ -529,11 +529,11 @@ describe('Catalog Service', () => { await $subject const whereFind = catalogItem.id ? { - [Op.or]: [{userId: catalogItem.userId}, {userId: null}], + [Op.or]: [{ userId: catalogItem.userId }, { userId: null }], name: data.name, - id: {[Op.ne]: catalogItem.id}, + id: { [Op.ne]: catalogItem.id }, } - : {[Op.or]: [{userId: catalogItem.userId}, {userId: null}], name: data.name} + : { [Op.or]: [{ userId: catalogItem.userId }, { userId: null }], name: data.name } expect(CatalogItemManager.findOne).to.have.been.calledWith(whereFind, transaction) }) @@ -672,7 +672,7 @@ describe('Catalog Service', () => { }) }) - describe('.listCatalogItems()', () => { + describe('.listCatalogItemsEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -683,17 +683,17 @@ describe('Catalog Service', () => { const isCLI = false const where = isCLI - ? {[Op.or]: [{category: {[Op.ne]: 'SYSTEM'}}, {category: null}]} + ? { [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] } : { - [Op.or]: [{userId: user.id}, {userId: null}], - [Op.or]: [{category: {[Op.ne]: 'SYSTEM'}}, {category: null}], + [Op.or]: [{ userId: user.id }, { userId: null }], + [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }], } const attributes = isCLI ? {} - : {exclude: ['userId']} + : { exclude: ['userId'] } - def('subject', () => $subject.listCatalogItems(user, isCLI, transaction)) + def('subject', () => $subject.listCatalogItemsEndPoint(user, isCLI, transaction)) def('catalogItemsFindResponse', () => Promise.resolve()) @@ -721,7 +721,7 @@ describe('Catalog Service', () => { }) }) - describe('.getCatalogItem()', () => { + describe('.getCatalogItemEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -734,18 +734,18 @@ describe('Catalog Service', () => { const id = 5 const where = isCLI - ? {id: id} + ? { id: id } : { id: id, - [Op.or]: [{userId: user.id}, {userId: null}], - [Op.or]: [{category: {[Op.ne]: 'SYSTEM'}}, {category: null}], + [Op.or]: [{ userId: user.id }, { userId: null }], + [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }], } const attributes = isCLI ? {} - : {exclude: ['userId']} + : { exclude: ['userId'] } - def('subject', () => $subject.getCatalogItem(id, user, isCLI, transaction)) + def('subject', () => $subject.getCatalogItemEndPoint(id, user, isCLI, transaction)) def('catalogItemFindResponse', () => Promise.resolve({})) @@ -773,7 +773,7 @@ describe('Catalog Service', () => { }) }) - describe('.deleteCatalogItem()', () => { + describe('.deleteCatalogItemEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -786,10 +786,10 @@ describe('Catalog Service', () => { const id = 5 const where = isCLI - ? {id: id} - : {userId: user.id, id: id} + ? { id: id } + : { userId: user.id, id: id } - def('subject', () => $subject.deleteCatalogItem(id, user, isCLI, transaction)) + def('subject', () => $subject.deleteCatalogItemEndPoint(id, user, isCLI, transaction)) def('catalogItemFindResponse', () => Promise.resolve({})) def('response', () => 1) diff --git a/test/src/services/change-tracking-service.test.js b/test/src/services/change-tracking-service.test.js index 7538174d8..226dcd038 100644 --- a/test/src/services/change-tracking-service.test.js +++ b/test/src/services/change-tracking-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const ChangeTrackingManager = require('../../../src/sequelize/managers/change-tracking-manager') diff --git a/test/src/services/connector-service.test.js b/test/src/services/connector-service.test.js index 198fa859c..af123deba 100644 --- a/test/src/services/connector-service.test.js +++ b/test/src/services/connector-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const ConnectorManager = require('../../../src/sequelize/managers/connector-manager') @@ -174,7 +174,7 @@ describe('Connector Service', () => { def('isValidDomainResponse', () => false) def('isValidPublicIpResponse', () => true) def('isValidPublicIpResponse2', () => true) - def('updateConnectorResponse', () => Promise.resolve()) + def('updateConnectorResponse', () => Promise.resolve(connectorData)) def('findOneConnectorResponse', () => Promise.resolve(connector)) def('updateRouteOverConnectorResponse', () => Promise.resolve()) def('updatePortMappingOverConnectorResponse', () => Promise.resolve()) @@ -218,7 +218,7 @@ describe('Connector Service', () => { def('isValidDomainResponse', () => error) it(`fails with ${error}`, () => { - return expect($subject).to.eventually.equal(undefined) + return expect($subject).to.eventually.equal(connector) }) }) @@ -232,7 +232,7 @@ describe('Connector Service', () => { def('isValidPublicIpResponse', () => error) it(`fails with ${error}`, () => { - return expect($subject).to.eventually.equal(undefined) + return expect($subject).to.eventually.equal(connector) }) }) @@ -246,7 +246,7 @@ describe('Connector Service', () => { def('isValidPublicIpResponse2', () => error) it(`fails with ${error}`, () => { - return expect($subject).to.eventually.equal(undefined) + return expect($subject).to.eventually.equal(connector) }) }) @@ -310,7 +310,7 @@ describe('Connector Service', () => { context('when MicroserviceService#updatePortMappingOverConnector() succeeds', () => { it('fulfills the promise', () => { - return expect($subject).to.eventually.equal(undefined) + return expect($subject).to.eventually.equal(connector) }) }) }) diff --git a/test/src/services/controller-service.test.js b/test/src/services/controller-service.test.js index add6e044e..21eaf1027 100644 --- a/test/src/services/controller-service.test.js +++ b/test/src/services/controller-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const ControllerService = require('../../../src/services/controller-service') diff --git a/test/src/services/diagnostic-service.test.js b/test/src/services/diagnostic-service.test.js index 38e882d87..7b3818cf1 100644 --- a/test/src/services/diagnostic-service.test.js +++ b/test/src/services/diagnostic-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const StraceDiagnosticManager = require('../../../src/sequelize/managers/strace-diagnostics-manager') const DiagnosticService = require('../../../src/services/diagnostic-service') @@ -48,7 +48,7 @@ describe('DiagnosticService Service', () => { beforeEach(() => { $sandbox.stub(Validator, 'validate').returns($validatorResponse) - $sandbox.stub(MicroserviceService, 'getMicroservice').returns($getMicroserviceResponse) + $sandbox.stub(MicroserviceService, 'getMicroserviceEndPoint').returns($getMicroserviceResponse) $sandbox.stub(StraceDiagnosticManager, 'updateOrCreate').returns($updateOrCreateDiagnosticResponse) $sandbox.stub(ChangeTrackingService, 'update').returns($updateChangeTrackingResponse) }) @@ -67,12 +67,12 @@ describe('DiagnosticService Service', () => { }) context('when Validator#validate() succeeds', () => { - it('calls MicroserviceService#getMicroservice() with correct args', async () => { + it('calls MicroserviceService#getMicroserviceEndPoint() with correct args', async () => { await $subject - expect(MicroserviceService.getMicroservice).to.have.been.calledWith(uuid, user, isCLI, transaction) + expect(MicroserviceService.getMicroserviceEndPoint).to.have.been.calledWith(uuid, user, isCLI, transaction) }) - context('when MicroserviceService#getMicroservice() fails', () => { + context('when MicroserviceService#getMicroserviceEndPoint() fails', () => { def('getMicroserviceResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { @@ -80,7 +80,7 @@ describe('DiagnosticService Service', () => { }) }) - context('when MicroserviceService#getMicroservice() succeeds', () => { + context('when MicroserviceService#getMicroserviceEndPoint() succeeds', () => { it('calls StraceDiagnosticManager#updateOrCreate() with correct args', async () => { await $subject expect(StraceDiagnosticManager.updateOrCreate).to.have.been.calledWith({ @@ -170,8 +170,8 @@ describe('DiagnosticService Service', () => { it('calls MicroserviceManager#findOne() with correct args', async () => { await $subject const microserviceWhere = isCLI - ? {uuid: uuid} - : {uuid: uuid, userId: user.id} + ? { uuid: uuid } + : { uuid: uuid, userId: user.id } expect(MicroserviceManager.findOne).to.have.been.calledWith(microserviceWhere, transaction) }) @@ -300,8 +300,8 @@ describe('DiagnosticService Service', () => { it('calls MicroserviceManager#findOne() with correct args', async () => { await $subject const microserviceWhere = isCLI - ? {uuid: uuid} - : {uuid: uuid, userId: user.id} + ? { uuid: uuid } + : { uuid: uuid, userId: user.id } expect(MicroserviceManager.findOne).to.have.been.calledWith(microserviceWhere, transaction) }) diff --git a/test/src/services/email-activation-code-service.test.js b/test/src/services/email-activation-code-service.test.js index c55bb49ae..d1f4cc33b 100644 --- a/test/src/services/email-activation-code-service.test.js +++ b/test/src/services/email-activation-code-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const EmailActivationCodeManager = require('../../../src/sequelize/managers/email-activation-code-manager') diff --git a/test/src/services/flow-service.test.js b/test/src/services/flow-service.test.js index 9c049380f..3585ccaa4 100644 --- a/test/src/services/flow-service.test.js +++ b/test/src/services/flow-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const FlowManager = require('../../../src/sequelize/managers/flow-manager') @@ -18,7 +18,7 @@ describe('Flow Service', () => { afterEach(() => $sandbox.restore()) - describe('.createFlow()', () => { + describe('.createFlowEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -45,7 +45,7 @@ describe('Flow Service', () => { id: 25, } - def('subject', () => $subject.createFlow(flowData, user, isCLI, transaction)) + def('subject', () => $subject.createFlowEndPoint(flowData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findFlowResponse', () => Promise.resolve()) def('deleteUndefinedFieldsResponse', () => flowToCreate) @@ -76,8 +76,8 @@ describe('Flow Service', () => { it('calls FlowManager#findOne() with correct args', async () => { await $subject const where = flowId - ? {name: flowData.name, id: {[Op.ne]: flowId, userId: user.id}} - : {name: flowData.name, userId: user.id} + ? { name: flowData.name, id: { [Op.ne]: flowId, userId: user.id } } + : { name: flowData.name, userId: user.id } expect(FlowManager.findOne).to.have.been.calledWith(where, transaction) }) @@ -130,7 +130,7 @@ describe('Flow Service', () => { }) }) - describe('.deleteFlow()', () => { + describe('.deleteFlowEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -153,7 +153,7 @@ describe('Flow Service', () => { ], } - def('subject', () => $subject.deleteFlow(flowId, user, isCLI, transaction)) + def('subject', () => $subject.deleteFlowEndPoint(flowId, user, isCLI, transaction)) def('deleteUndefinedFieldsResponse', () => whereObj) def('findFlowMicroservicesResponse', () => Promise.resolve(flowWithMicroservices)) def('updateChangeTrackingResponse', () => Promise.resolve()) @@ -238,7 +238,7 @@ describe('Flow Service', () => { }) - describe('.updateFlow()', () => { + describe('.updateFlowEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -268,7 +268,7 @@ describe('Flow Service', () => { ], } - def('subject', () => $subject.updateFlow(flowData, flowId, user, isCLI, transaction)) + def('subject', () => $subject.updateFlowEndPoint(flowData, flowId, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findExcludedFlowResponse', () => Promise.resolve(oldFlowData)) def('findFlowResponse', () => Promise.resolve()) @@ -305,9 +305,9 @@ describe('Flow Service', () => { await $subject const where = isCLI - ? {id: flowId} - : {id: flowId, userId: user.id} - const attributes = {exclude: ['created_at', 'updated_at']} + ? { id: flowId } + : { id: flowId, userId: user.id } + const attributes = { exclude: ['created_at', 'updated_at'] } expect(FlowManager.findOneWithAttributes).to.have.been.calledWith(where, attributes, transaction) }) @@ -324,8 +324,8 @@ describe('Flow Service', () => { await $subject const where = flowId - ? {name: flowData.name, userId: user.id, id: {[Op.ne]: flowId}} - : {name: flowData.name, userId: user.id} + ? { name: flowData.name, userId: user.id, id: { [Op.ne]: flowId } } + : { name: flowData.name, userId: user.id } expect(FlowManager.findOne).to.have.been.calledWith(where, transaction) }) @@ -359,8 +359,8 @@ describe('Flow Service', () => { await $subject const where = isCLI - ? {id: flowId} - : {id: flowId, userId: user.id} + ? { id: flowId } + : { id: flowId, userId: user.id } expect(FlowManager.update).to.have.been.calledWith(where, flowData, transaction) }) @@ -418,7 +418,7 @@ describe('Flow Service', () => { }) }) - describe('.getUserFlows()', () => { + describe('.getUserFlowsEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -430,7 +430,7 @@ describe('Flow Service', () => { userId: user.id, } - def('subject', () => $subject.getUserFlows(user, isCLI, transaction)) + def('subject', () => $subject.getUserFlowsEndPoint(user, isCLI, transaction)) def('findExcludedFlowResponse', () => Promise.resolve()) beforeEach(() => { @@ -439,7 +439,7 @@ describe('Flow Service', () => { it('calls FlowManager#findAllWithAttributes() with correct args', async () => { await $subject - const attributes = {exclude: ['created_at', 'updated_at']} + const attributes = { exclude: ['created_at', 'updated_at'] } expect(FlowManager.findAllWithAttributes).to.have.been.calledWith(flow, attributes, transaction) }) @@ -459,11 +459,11 @@ describe('Flow Service', () => { }) - describe('.getAllFlows()', () => { + describe('.getAllFlowsEndPoint()', () => { const transaction = {} const error = 'Error!' - def('subject', () => $subject.getAllFlows(isCLI, transaction)) + def('subject', () => $subject.getAllFlowsEndPoint(isCLI, transaction)) def('findAllFlowsResponse', () => Promise.resolve()) beforeEach(() => { @@ -472,7 +472,7 @@ describe('Flow Service', () => { it('calls FlowManager#findAllWithAttributes() with correct args', async () => { await $subject - const attributes = {exclude: ['created_at', 'updated_at']} + const attributes = { exclude: ['created_at', 'updated_at'] } expect(FlowManager.findAllWithAttributes).to.have.been.calledWith({}, attributes, transaction) }) @@ -511,9 +511,9 @@ describe('Flow Service', () => { it('calls FlowManager#findOneWithAttributes() with correct args', async () => { await $subject const where = isCLI - ? {id: flowId} - : {id: flowId, userId: user.id} - const attributes = {exclude: ['created_at', 'updated_at']} + ? { id: flowId } + : { id: flowId, userId: user.id } + const attributes = { exclude: ['created_at', 'updated_at'] } expect(FlowManager.findOneWithAttributes).to.have.been.calledWith(where, attributes, transaction) }) diff --git a/test/src/services/iofog-service.test.js b/test/src/services/iofog-service.test.js index ef6c2415c..fd7f00b63 100644 --- a/test/src/services/iofog-service.test.js +++ b/test/src/services/iofog-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const ioFogManager = require('../../../src/sequelize/managers/iofog-manager') @@ -21,7 +21,7 @@ describe('ioFog Service', () => { afterEach(() => $sandbox.restore()) - describe('.createFog()', () => { + describe('.createFogEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -122,7 +122,7 @@ describe('ioFog Service', () => { uuid: uuid, } - def('subject', () => $subject.createFog(fogData, user, isCLI, transaction)) + def('subject', () => $subject.createFogEndPoint(fogData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('generateRandomStringResponse', () => uuid) def('generateRandomStringResponse2', () => uuid2) @@ -353,7 +353,7 @@ describe('ioFog Service', () => { }) }) - describe('.updateFog()', () => { + describe('.updateFogEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -416,8 +416,8 @@ describe('ioFog Service', () => { } const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } const updateFogData = { name: fogData.name, @@ -474,7 +474,7 @@ describe('ioFog Service', () => { configLastUpdated: date, } - def('subject', () => $subject.updateFog(fogData, user, isCLI, transaction)) + def('subject', () => $subject.updateFogEndPoint(fogData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('deleteUndefinedFieldsResponse', () => updateFogData) def('findIoFogResponse', () => Promise.resolve(oldFog)) @@ -709,7 +709,7 @@ describe('ioFog Service', () => { }) }) - describe('.deleteFog()', () => { + describe('.deleteFogEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -751,10 +751,10 @@ describe('ioFog Service', () => { } const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } - def('subject', () => $subject.deleteFog(fogData, user, isCLI, transaction)) + def('subject', () => $subject.deleteFogEndPoint(fogData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findIoFogResponse', () => Promise.resolve(fog)) def('updateChangeTrackingResponse', () => Promise.resolve()) @@ -858,59 +858,9 @@ describe('ioFog Service', () => { } const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} - - const fogResponse = { - uuid: fog.uuid, - name: fog.name, - location: fog.location, - gpsMode: fog.gpsMode, - latitude: fog.latitude, - longitude: fog.longitude, - description: fog.description, - lastActive: fog.lastActive, - daemonStatus: fog.daemonStatus, - daemonOperatingDuration: fog.daemonOperatingDuration, - daemonLastStart: fog.daemonLastStart, - memoryUsage: fog.memoryUsage, - diskUsage: fog.diskUsage, - cpuUsage: fog.cpuUsage, - memoryViolation: fog.memoryViolation, - diskViolation: fog.diskViolation, - cpuViolation: fog.cpuViolation, - catalogItemStatus: fog.catalogItemStatus, - repositoryCount: fog.repositoryCount, - repositoryStatus: fog.repositoryStatus, - systemTime: fog.systemTime, - lastStatusTime: fog.lastStatusTime, - ipAddress: fog.ipAddress, - processedMessages: fog.processedMessages, - catalogItemMessageCounts: fog.catalogItemMessageCounts, - messageSpeed: fog.messageSpeed, - lastCommandTime: fog.lastCommandTime, - networkInterface: fog.networkInterface, - dockerUrl: fog.dockerUrl, - diskLimit: fog.diskLimit, - diskDirectory: fog.diskDirectory, - memoryLimit: fog.memoryLimit, - cpuLimit: fog.cpuLimit, - logLimit: fog.logLimit, - logDirectory: fog.logDirectory, - bluetoothEnabled: fog.bluetoothEnabled, - abstractedHardwareEnabled: fog.abstractedHardwareEnabled, - logFileCount: fog.logFileCount, - version: fog.version, - isReadyToUpgrade: fog.isReadyToUpgrade, - isReadyToRollback: fog.isReadyToRollback, - statusFrequency: fog.statusFrequency, - changeFrequency: fog.changeFrequency, - deviceScanFrequency: fog.deviceScanFrequency, - tunnel: fog.tunnel, - watchdogEnabled: fog.watchdogEnabled, - fogTypeId: fog.fogTypeId, - userId: fog.userId, - } + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } + def('subject', () => $subject.getFog(fogData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) @@ -951,13 +901,13 @@ describe('ioFog Service', () => { context('when ioFogManager#findOne() succeeds', () => { it('fulfills the promise', () => { - return expect($subject).to.eventually.deep.equal(fogResponse) + return expect($subject).to.eventually.deep.equal(fog) }) }) }) }) - describe('.getFogList()', () => { + describe('.getFogListEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -998,11 +948,11 @@ describe('ioFog Service', () => { const queryFogData = isCLI ? {} - : {userId: user.id} + : { userId: user.id } const filters = [] - def('subject', () => $subject.getFogList(filters, user, isCLI, transaction)) + def('subject', () => $subject.getFogListEndPoint(filters, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findAllIoFogResponse', () => Promise.resolve(fogs)) @@ -1047,7 +997,7 @@ describe('ioFog Service', () => { }) }) - describe('.generateProvisioningKey()', () => { + describe('.generateProvisioningKeyEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -1064,8 +1014,8 @@ describe('ioFog Service', () => { } const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } const provisionKey = 'tttttttt' const expirationTime = date + (20 * 60 * 1000) @@ -1076,7 +1026,7 @@ describe('ioFog Service', () => { expirationTime: expirationTime, } - def('subject', () => $subject.generateProvisioningKey(fogData, user, isCLI, transaction)) + def('subject', () => $subject.generateProvisioningKeyEndPoint(fogData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('generateRandomStringResponse', () => provisionKey) def('findIoFogResponse', () => Promise.resolve({})) @@ -1164,7 +1114,7 @@ describe('ioFog Service', () => { }) }) - describe('.setFogVersionCommand()', () => { + describe('.setFogVersionCommandEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -1182,8 +1132,8 @@ describe('ioFog Service', () => { } const queryFogData = isCLI - ? {uuid: fogVersionData.uuid} - : {uuid: fogVersionData.uuid, userId: user.id} + ? { uuid: fogVersionData.uuid } + : { uuid: fogVersionData.uuid, userId: user.id } const ioFog = { uuid: uuid, @@ -1205,7 +1155,7 @@ describe('ioFog Service', () => { expirationTime: expirationTime, } - def('subject', () => $subject.setFogVersionCommand(fogVersionData, user, isCLI, transaction)) + def('subject', () => $subject.setFogVersionCommandEndPoint(fogVersionData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findIoFogResponse', () => Promise.resolve(ioFog)) def('generateRandomStringResponse', () => provisionKey) @@ -1359,7 +1309,7 @@ describe('ioFog Service', () => { }) }) - describe('.setFogRebootCommand()', () => { + describe('.setFogRebootCommandEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -1376,10 +1326,10 @@ describe('ioFog Service', () => { } const queryFogData = isCLI - ? {uuid: fogData.uuid} - : {uuid: fogData.uuid, userId: user.id} + ? { uuid: fogData.uuid } + : { uuid: fogData.uuid, userId: user.id } - def('subject', () => $subject.setFogRebootCommand(fogData, user, isCLI, transaction)) + def('subject', () => $subject.setFogRebootCommandEndPoint(fogData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findIoFogResponse', () => Promise.resolve({})) def('updateChangeTrackingResponse', () => Promise.resolve()) @@ -1443,7 +1393,7 @@ describe('ioFog Service', () => { }) }) - describe('.getHalHardwareInfo()', () => { + describe('.getHalHardwareInfoEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -1459,7 +1409,7 @@ describe('ioFog Service', () => { uuid: uuid, } - def('subject', () => $subject.getHalHardwareInfo(uuidObj, user, isCLI, transaction)) + def('subject', () => $subject.getHalHardwareInfoEndPoint(uuidObj, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findIoFogResponse', () => Promise.resolve({})) def('findHalHardwareResponse', () => Promise.resolve()) @@ -1526,7 +1476,7 @@ describe('ioFog Service', () => { }) }) - describe('.getHalUsbInfo()', () => { + describe('.getHalUsbInfoEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -1542,7 +1492,7 @@ describe('ioFog Service', () => { uuid: uuid, } - def('subject', () => $subject.getHalUsbInfo(uuidObj, user, isCLI, transaction)) + def('subject', () => $subject.getHalUsbInfoEndPoint(uuidObj, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findIoFogResponse', () => Promise.resolve({})) def('findHalUsbResponse', () => Promise.resolve()) diff --git a/test/src/services/microservices-service.test.js b/test/src/services/microservices-service.test.js index c1dce1bcc..bba4e0e92 100644 --- a/test/src/services/microservices-service.test.js +++ b/test/src/services/microservices-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const MicroserviceManager = require('../../../src/sequelize/managers/microservice-manager') @@ -13,7 +13,12 @@ const MicroservicePortManager = require('../../../src/sequelize/managers/microse const VolumeMappingManager = require('../../../src/sequelize/managers/volume-mapping-manager') const MicroserviceStatusManager = require('../../../src/sequelize/managers/microservice-status-manager') const RoutingManager = require('../../../src/sequelize/managers/routing-manager') +const MicroserviceEnvManager = require('../../../src/sequelize/managers/microservice-env-manager') +const MicroserviceArgManager = require('../../../src/sequelize/managers/microservice-arg-manager') const Op = require('sequelize').Op +const ConnectorManager = require('../../../src/sequelize/managers/connector-manager') +const ConnectorPortManager = require('../../../src/sequelize/managers/connector-port-manager') +const MicroservicePublicModeManager = require('../../../src/sequelize/managers/microservice-public-mode-manager') describe('Microservices Service', () => { def('subject', () => MicroservicesService) @@ -23,7 +28,7 @@ describe('Microservices Service', () => { afterEach(() => $sandbox.restore()) - describe('.listMicroservices()', () => { + describe('.listMicroservicesEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -39,22 +44,32 @@ describe('Microservices Service', () => { }, ] - def('subject', () => $subject.listMicroservices(flowId, user, isCLI, transaction)) + def('subject', () => $subject.listMicroservicesEndPoint(flowId, user, isCLI, transaction)) def('findMicroservicesResponse', () => Promise.resolve(response)) def('findPortMappingsResponse', () => Promise.resolve([])) def('findVolumeMappingsResponse', () => Promise.resolve([])) def('findRoutesResponse', () => Promise.resolve([])) + def('publicModeResponse', () => Promise.resolve([])) + def('connectorPortResponse', () => Promise.resolve({})) + def('connectorResponse', () => Promise.resolve({})) + def('envResponse', () => Promise.resolve([])) + def('cmdResponse', () => Promise.resolve([])) beforeEach(() => { $sandbox.stub(MicroserviceManager, 'findAllExcludeFields').returns($findMicroservicesResponse) $sandbox.stub(MicroservicePortManager, 'findAll').returns($findPortMappingsResponse) $sandbox.stub(VolumeMappingManager, 'findAll').returns($findVolumeMappingsResponse) $sandbox.stub(RoutingManager, 'findAll').returns($findRoutesResponse) + $sandbox.stub(MicroserviceEnvManager, 'findAllExcludeFields').returns($envResponse) + $sandbox.stub(MicroserviceArgManager, 'findAllExcludeFields').returns($cmdResponse) + $sandbox.stub(MicroservicePublicModeManager, 'findAll').returns($publicModeResponse) + $sandbox.stub(ConnectorPortManager, 'findOne').returns($connectorPortResponse) + $sandbox.stub(ConnectorManager, 'findOne').returns($connectorResponse) }) it('calls MicroserviceManager#findAllExcludeFields() with correct args', async () => { await $subject - const where = isCLI ? {delete: false} : {flowId: flowId, delete: false} + const where = isCLI ? { delete: false } : { flowId: flowId, delete: false } expect(MicroserviceManager.findAllExcludeFields).to.have.been.calledWith(where, transaction) }) @@ -74,7 +89,7 @@ describe('Microservices Service', () => { }) }) - describe('.getMicroservice()', () => { + describe('.getMicroserviceEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -90,17 +105,27 @@ describe('Microservices Service', () => { }, } - def('subject', () => $subject.getMicroservice(microserviceUuid, user, isCLI, transaction)) + def('subject', () => $subject.getMicroserviceEndPoint(microserviceUuid, user, isCLI, transaction)) def('findMicroserviceResponse', () => Promise.resolve(response)) def('findPortMappingsResponse', () => Promise.resolve([])) def('findVolumeMappingsResponse', () => Promise.resolve([])) def('findRoutesResponse', () => Promise.resolve([])) + def('publicModeResponse', () => Promise.resolve([])) + def('connectorPortResponse', () => Promise.resolve({})) + def('connectorResponse', () => Promise.resolve({})) + def('envResponse', () => Promise.resolve([])) + def('cmdResponse', () => Promise.resolve([])) beforeEach(() => { $sandbox.stub(MicroserviceManager, 'findOneExcludeFields').returns($findMicroserviceResponse) $sandbox.stub(MicroservicePortManager, 'findAll').returns($findPortMappingsResponse) $sandbox.stub(VolumeMappingManager, 'findAll').returns($findVolumeMappingsResponse) $sandbox.stub(RoutingManager, 'findAll').returns($findRoutesResponse) + $sandbox.stub(MicroserviceEnvManager, 'findAllExcludeFields').returns($envResponse) + $sandbox.stub(MicroserviceArgManager, 'findAllExcludeFields').returns($cmdResponse) + $sandbox.stub(MicroservicePublicModeManager, 'findAll').returns($publicModeResponse) + $sandbox.stub(ConnectorPortManager, 'findOne').returns($connectorPortResponse) + $sandbox.stub(ConnectorManager, 'findOne').returns($connectorResponse) }) it('calls MicroserviceManager#findOneExcludeFields() with correct args', async () => { @@ -123,9 +148,34 @@ describe('Microservices Service', () => { return expect($subject).to.eventually.have.property('uuid') }) }) + + context('when microservice has public ports', () => { + def('findPortMappingsResponse', () => Promise.resolve([ + { + id: 1, + portInternal: 80, + portInternal: 8080, + isPublic: true, + }, + ])) + def('publicModeResponse', () => Promise.resolve([{ microservicePortId: 1, connectorPortId: 1 }])) + def('connectorPortResponse', () => Promise.resolve({ connectorPortId: 1, port2: 1234 })) + def('connectorResponse', () => Promise.resolve({ + publicIp: '1.2.3.4', + devMode: true, + })) + + it('returns public link', async () => { + const ms = await $subject + expect(ms).to.have.property('ports') + expect(ms.ports).to.have.length(1) + expect(ms.ports[0]).to.have.property('publicLink') + expect(ms.ports[0].publicLink).to.equal('http://1.2.3.4:1234') + }) + }) }) - describe('.createMicroservice()', () => { + describe('.createMicroserviceEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -195,7 +245,7 @@ describe('Microservices Service', () => { microserviceUuid: microserviceData.uuid, } - def('subject', () => $subject.createMicroservice(microserviceData, user, isCLI, transaction)) + def('subject', () => $subject.createMicroserviceEndPoint(microserviceData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('validatorResponse2', () => Promise.resolve(true)) def('generateRandomStringResponse', () => newMicroserviceUuid) @@ -273,7 +323,7 @@ describe('Microservices Service', () => { def('deleteUndefinedFieldsResponse', () => Promise.reject(err)) it(`fails with ${error}`, () => { - return expect($subject).to.be.rejectedWith(err) + return expect($subject).to.eventually.have.property('uuid') }) }) @@ -284,7 +334,7 @@ describe('Microservices Service', () => { ? { name: microserviceData.name, - uuid: {[Op.ne]: item.id}, + uuid: { [Op.ne]: item.id }, userId: user.id, } : @@ -365,99 +415,97 @@ describe('Microservices Service', () => { }) context('when MicroserviceManager#create() succeeds', () => { - it('calls Validator#validate() with correct args', async () => { + it('calls MicroservicePortManager#findOne() with correct args', async () => { await $subject - expect(Validator.validate).to.have.been.calledWith(portMappingData, Validator.schemas.portsCreate) + expect(MicroservicePortManager.findOne).to.have.been.calledWith({ + microserviceUuid: microserviceData.uuid, + [Op.or]: + [ + { + portInternal: portMappingData.internal, + }, + { + portExternal: portMappingData.external, + }, + ], + }, transaction) }) - - context('when Validator#validate() fails', () => { - def('validatorResponse2', () => Promise.reject(error)) + context('when MicroservicePortManager#findOne() fails', () => { + def('findMicroservicePortResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { return expect($subject).to.be.rejectedWith(error) }) }) - context('when Validator#validate() succeeds', () => { - it('calls MicroserviceManager#findOne() with correct args', async () => { + context('when MicroservicePortManager#findOne() succeeds', () => { + it('calls MicroservicePortManager#create() with correct args', async () => { await $subject - const where = isCLI - ? {uuid: microserviceData.uuid} - : {uuid: microserviceData.uuid, userId: user.id} - expect(MicroserviceManager.findOne).to.have.been.calledWith(where, transaction) + expect(MicroservicePortManager.create).to.have.been.calledWith(mappingData, transaction) }) - context('when MicroserviceManager#findOne() fails', () => { - def('findMicroserviceResponse', () => Promise.reject(error)) + context('when MicroservicePortManager#create() fails', () => { + def('createMicroservicePortResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { return expect($subject).to.be.rejectedWith(error) }) }) - context('when MicroserviceManager#findOne() succeeds', () => { - it('calls MicroservicePortManager#findOne() with correct args', async () => { + context('when MicroservicePortManager#create() succeeds', () => { + it('calls MicroserviceManager#update() with correct args', async () => { await $subject - expect(MicroservicePortManager.findOne).to.have.been.calledWith({ - microserviceUuid: microserviceData.uuid, - [Op.or]: - [ - { - portInternal: portMappingData.internal, - }, - { - portExternal: portMappingData.external, - }, - ], - }, transaction) + const updateRebuildMs = { + rebuild: true, + } + expect(MicroserviceManager.update).to.have.been.calledWith({ + uuid: microserviceData.uuid, + }, updateRebuildMs, transaction) }) - context('when MicroservicePortManager#findOne() fails', () => { - def('findMicroservicePortResponse', () => Promise.reject(error)) + context('when MicroserviceManager#update() fails', () => { + def('updateMicroserviceResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { return expect($subject).to.be.rejectedWith(error) }) }) - context('when MicroservicePortManager#findOne() succeeds', () => { - it('calls MicroservicePortManager#create() with correct args', async () => { + context('when MicroserviceManager#update() succeeds', () => { + it('calls ChangeTrackingService#update() with correct args', async () => { await $subject - expect(MicroservicePortManager.create).to.have.been.calledWith(mappingData, transaction) + expect(ChangeTrackingService.update).to.have.been.calledWith(microserviceData.iofogUuid, + ChangeTrackingService.events.microserviceConfig, transaction) }) - context('when MicroservicePortManager#create() fails', () => { - def('createMicroservicePortResponse', () => Promise.reject(error)) + context('when ChangeTrackingService#update() fails', () => { + def('updateChangeTrackingResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { return expect($subject).to.be.rejectedWith(error) }) }) - context('when MicroservicePortManager#create() succeeds', () => { - it('calls MicroserviceManager#update() with correct args', async () => { + context('when ChangeTrackingService#update() succeeds', () => { + it('calls VolumeMappingManager#bulkCreate() with correct args', async () => { await $subject - const updateRebuildMs = { - rebuild: true, - } - expect(MicroserviceManager.update).to.have.been.calledWith({ - uuid: microserviceData.uuid, - }, updateRebuildMs, transaction) + expect(VolumeMappingManager.bulkCreate).to.have.been.calledWith(mappings, + transaction) }) - context('when MicroserviceManager#update() fails', () => { - def('updateMicroserviceResponse', () => Promise.reject(error)) + context('when VolumeMappingManager#bulkCreate() fails', () => { + def('createVolumeMappingResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { return expect($subject).to.be.rejectedWith(error) }) }) - context('when MicroserviceManager#update() succeeds', () => { + context('when VolumeMappingManager#bulkCreate() succeeds', () => { it('calls ChangeTrackingService#update() with correct args', async () => { await $subject expect(ChangeTrackingService.update).to.have.been.calledWith(microserviceData.iofogUuid, - ChangeTrackingService.events.microserviceConfig, transaction) + ChangeTrackingService.events.microserviceList, transaction) }) context('when ChangeTrackingService#update() fails', () => { @@ -469,56 +517,24 @@ describe('Microservices Service', () => { }) context('when ChangeTrackingService#update() succeeds', () => { - it('calls VolumeMappingManager#bulkCreate() with correct args', async () => { + it('calls MicroserviceStatusManager#create() with correct args', async () => { await $subject - expect(VolumeMappingManager.bulkCreate).to.have.been.calledWith(mappings, - transaction) + expect(MicroserviceStatusManager.create).to.have.been.calledWith({ + microserviceUuid: microserviceData.uuid, + }, transaction) }) - context('when VolumeMappingManager#bulkCreate() fails', () => { - def('createVolumeMappingResponse', () => Promise.reject(error)) + context('when MicroserviceStatusManager#create() fails', () => { + def('createMicroserviceStatusResponse', () => Promise.reject(error)) it(`fails with ${error}`, () => { return expect($subject).to.be.rejectedWith(error) }) }) - context('when VolumeMappingManager#bulkCreate() succeeds', () => { - it('calls ChangeTrackingService#update() with correct args', async () => { - await $subject - expect(ChangeTrackingService.update).to.have.been.calledWith(microserviceData.iofogUuid, - ChangeTrackingService.events.microserviceList, transaction) - }) - - context('when ChangeTrackingService#update() fails', () => { - def('updateChangeTrackingResponse', () => Promise.reject(error)) - - it(`fails with ${error}`, () => { - return expect($subject).to.be.rejectedWith(error) - }) - }) - - context('when ChangeTrackingService#update() succeeds', () => { - it('calls MicroserviceStatusManager#create() with correct args', async () => { - await $subject - expect(MicroserviceStatusManager.create).to.have.been.calledWith({ - microserviceUuid: microserviceData.uuid, - }, transaction) - }) - - context('when MicroserviceStatusManager#create() fails', () => { - def('createMicroserviceStatusResponse', () => Promise.reject(error)) - - it(`fails with ${error}`, () => { - return expect($subject).to.be.rejectedWith(error) - }) - }) - - context('when MicroserviceStatusManager#create() succeeds', () => { - it('fulfills the promise', () => { - return expect($subject).to.eventually.have.property('uuid') - }) - }) + context('when MicroserviceStatusManager#create() succeeds', () => { + it('fulfills the promise', () => { + return expect($subject).to.eventually.have.property('uuid') }) }) }) @@ -536,8 +552,9 @@ describe('Microservices Service', () => { }) }) }) + // - // describe('.updateMicroservice()', () => { + // describe('.updateMicroserviceEndPoint()', () => { // const transaction = {}; // const error = 'Error!'; // @@ -630,7 +647,7 @@ describe('Microservices Service', () => { // microserviceUuid: microserviceData.uuid // }; // - // def('subject', () => $subject.updateMicroservice(microserviceUuid, microserviceData, user, isCLI, transaction)); + // def('subject', () => $subject.updateMicroserviceEndPoint(microserviceUuid, microserviceData, user, isCLI, transaction)); // def('validatorResponse', () => Promise.resolve(true)); // def('deleteUndefinedFieldsResponse', () => newMicroservice); // def('findMicroserviceResponse', () => Promise.resolve()); @@ -968,7 +985,7 @@ describe('Microservices Service', () => { // }); // // - // describe('.deleteMicroservice()', () => { + // describe('.deleteMicroserviceEndPoint()', () => { // const transaction = {}; // const error = 'Error!'; // @@ -1031,7 +1048,7 @@ describe('Microservices Service', () => { // microserviceUuid: microserviceData.uuid // }; // - // def('subject', () => $subject.deleteMicroservice(microserviceUuid, microserviceData, user, isCLI, transaction)); + // def('subject', () => $subject.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, user, isCLI, transaction)); // def('findMicroserviceResponse', () => Promise.resolve(microserviceData)); // def('findMicroservicePortResponse', () => Promise.resolve()); // def('deleteMicroservicePortResponse', () => Promise.resolve()); @@ -1161,7 +1178,7 @@ describe('Microservices Service', () => { // }); // - describe('.createPortMapping()', () => { + describe('.createPortMappingEndPoint()', () => { const transaction = {} const error = 'Error!' @@ -1172,6 +1189,7 @@ describe('Microservices Service', () => { const microserviceUuid = 'testMicroserviceUuid' const microserviceData = { + 'uuid': microserviceUuid, 'name': 'name2', 'config': 'string', 'catalogItemId': 15, @@ -1205,8 +1223,8 @@ describe('Microservices Service', () => { ] const where = isCLI - ? {uuid: microserviceUuid} - : {uuid: microserviceUuid, userId: user.id} + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid, userId: user.id } const mappingData = { isPublic: false, @@ -1216,7 +1234,7 @@ describe('Microservices Service', () => { microserviceUuid: microserviceData.uuid, } - def('subject', () => $subject.createPortMapping(microserviceUuid, portMappingData, user, isCLI, transaction)) + def('subject', () => $subject.createPortMappingEndPoint(microserviceUuid, portMappingData, user, isCLI, transaction)) def('validatorResponse', () => Promise.resolve(true)) def('findMicroserviceResponse', () => Promise.resolve(microserviceData)) def('findMicroservicePortResponse', () => Promise.resolve()) diff --git a/test/src/services/registry-service.test.js b/test/src/services/registry-service.test.js index c272356c1..cfb297eb2 100644 --- a/test/src/services/registry-service.test.js +++ b/test/src/services/registry-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const RegistryManager = require('../../../src/sequelize/managers/registry-manager') @@ -173,7 +173,7 @@ describe('Registry Service', () => { }, ], } - const attributes = {exclude: ['password']} + const attributes = { exclude: ['password'] } def('subject', () => $subject.findRegistries(user, isCLI, transaction)) def('findRegistriesResponse', () => Promise.resolve([])) @@ -214,8 +214,8 @@ describe('Registry Service', () => { } const queryData = isCLI - ? {id: registryData.id} - : {id: registryData.id, userId: user.id} + ? { id: registryData.id } + : { id: registryData.id, userId: user.id } const ioFogs = [{ uuid: 'testUuid', diff --git a/test/src/services/tunnel-service.test.js b/test/src/services/tunnel-service.test.js index 17c5b7b9c..b70d27a7b 100644 --- a/test/src/services/tunnel-service.test.js +++ b/test/src/services/tunnel-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const AppHelper = require('../../../src/helpers/app-helper') @@ -30,7 +30,7 @@ describe('Tunnel Service', () => { })) def('user', () => 'user') def('cli', () => false) - def('fog', () => ({uuid})) + def('fog', () => ({ uuid })) def('fogResponse', () => Promise.resolve($fog)) def('portResponse', () => Promise.resolve(port)) def('validatorResponse', () => Promise.resolve(true)) @@ -48,7 +48,7 @@ describe('Tunnel Service', () => { it('calls FogManager#findOne() with correct args', async () => { await $subject - expect(FogManager.findOne).to.have.been.calledWith({uuid}, transaction) + expect(FogManager.findOne).to.have.been.calledWith({ uuid }, transaction) }) context('when FogManager#findOne() fails', () => { @@ -228,7 +228,7 @@ describe('Tunnel Service', () => { const tunnel = [{}] const transaction = {} const error = 'Error!' - const attributes = {exclude: ['password']} + const attributes = { exclude: ['password'] } def('subject', () => $subject.findAll(transaction)) def('tunnelManagerResponse', () => Promise.resolve(tunnel)) @@ -252,7 +252,7 @@ describe('Tunnel Service', () => { context('when tunnelManagerResponse#findAllWithAttributes() succeeds', () => { it('resolves with tunnel info', () => { - return expect($subject).to.eventually.eql({tunnels: tunnel}) + return expect($subject).to.eventually.eql({ tunnels: tunnel }) }) }) }) @@ -296,7 +296,7 @@ describe('Tunnel Service', () => { context('when TunnelService#findTunnel() succeeds', () => { it('calls TunnelManager#update() with correct args', async () => { await $subject - expect(TunnelManager.update).to.have.been.calledWith($tunnelData, {closed: true}, transaction) + expect(TunnelManager.update).to.have.been.calledWith($tunnelData, { closed: true }, transaction) }) context('when TunnelManager#updateOrCreate() fails', () => { diff --git a/test/src/services/user-service.test.js b/test/src/services/user-service.test.js index 421616959..82ff1cabe 100644 --- a/test/src/services/user-service.test.js +++ b/test/src/services/user-service.test.js @@ -1,4 +1,4 @@ -const {expect} = require('chai') +const { expect } = require('chai') const sinon = require('sinon') const UserManager = require('../../../src/sequelize/managers/user-manager') @@ -725,7 +725,7 @@ describe('User Service', () => { id: user.id, }] - const attributes = {exclude: ['password']} + const attributes = { exclude: ['password'] } def('subject', () => $subject.list(isCLI, transaction)) def('findAllResponse', () => Promise.resolve(response))