├── .github └── workflows │ ├── ci-tests.yml │ └── gh-action-test.yml ├── .gitignore ├── .mocharc.json ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── SECURITY.md ├── action.yml ├── ado-extension.json ├── azure-devops ├── ado-task-test.yml ├── release.yml ├── security-checks.yml └── templates │ ├── component-governance.yml │ └── credscan.yml ├── bumpVersion.ts ├── copyFiles.ts ├── dist_gh_action ├── index.js └── lib.json ├── package-lock.json ├── package.json ├── src ├── ado-index.ts ├── adoTask │ └── adoTaskRunner.ts ├── apkAnalyzer │ ├── ApkAnalyzer.ts │ ├── CiRunner.ts │ ├── ComparisionReportGenerator.ts │ ├── FilesSizeCalculator.ts │ ├── MetaMfParser.ts │ ├── ThresholdChecker.ts │ ├── model │ │ ├── ApkSizeSummary.ts │ │ └── ComparisionReport.ts │ └── reporter │ │ ├── IReporter.ts │ │ └── MarkdownReporter.ts ├── assets │ ├── appSizeChangesIcon.png │ └── overview.md ├── gh-action-index.ts ├── githubAction │ └── GithubActionRunner.ts ├── task.json └── typings │ └── typings.d.ts ├── test ├── adoTask │ ├── _suite.ts │ └── success.ts └── assets │ └── test.apk ├── threat_model ├── android_appsize_diff.tm7 ├── azure_devops.png └── github_ci.png └── tsconfig.json /.github/workflows/ci-tests.yml: -------------------------------------------------------------------------------- 1 | name: CI Tests 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [ubuntu-latest, macos-latest] # also include windows-latest once npm install is fixed 12 | 13 | steps: 14 | - uses: actions/checkout@v1 15 | name: Checkout repo 16 | 17 | - name: Setup node 18 | uses: actions/setup-node@v1 19 | with: 20 | node-version: 10.x 21 | 22 | - name: Install dependencies 23 | run: | 24 | npm install -g typescript 25 | npm install -g ts-node 26 | npm install -g mocha 27 | npm install 28 | 29 | - name: Build code 30 | run: npm run build 31 | 32 | - name: Run all tests 33 | run: npm run test 34 | 35 | -------------------------------------------------------------------------------- /.github/workflows/gh-action-test.yml: -------------------------------------------------------------------------------- 1 | name: Github Action Test 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [ubuntu-latest, macos-latest, windows-latest] 12 | 13 | steps: 14 | - uses: actions/checkout@v1 15 | name: Checkout repo 16 | 17 | - name: Run App size diff 18 | uses: ./ 19 | with: 20 | baseAppPath: test/assets/test.apk 21 | baseAppLabel: Base app 22 | targetAppPath: test/assets/test.apk 23 | targetAppLabel: Target app 24 | summaryOutputPath: summary.md 25 | metrics: apkSize, installSize, arscFile, nativeLibs, dexFiles 26 | thresholds: 10, 10, 10, 10, 10 27 | 28 | - name: Print summary 29 | run: cat summary.md 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *.vsix 4 | .taskkey 5 | **/.taskkey 6 | .DS_Store 7 | **/.DS_Store 8 | test/assets/extracted/ 9 | dist_gh_action/package.json 10 | 11 | -------------------------------------------------------------------------------- /.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "diff": true, 3 | "extension": ["js"], 4 | "opts": false, 5 | "package": "./package.json", 6 | "reporter": "spec", 7 | "slow": 75, 8 | "timeout": 15000, 9 | "watch-files": ["dist/test/**/*.js"] 10 | } 11 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | This repository contains an [Azure DevOps Task](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/tasks?view=azure-devops&tabs=yaml) and a [GitHub Workflow Action](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idsteps). See below usage examples to start using this in your CI. 4 | 5 | These are the minimal checks we run on our own PRs for [SwiftKey](https://play.google.com/store/apps/details?id=com.touchtype.swiftkey), however we're happy to accept contributions. See [contributing section](#contributing) below if you would like to expand this action's features. 6 | 7 | ## Usage examples 8 | 9 | - In a Azure DevOps Pipeline 10 | 11 | ```yml 12 | - task: android-app-size-diff@1 13 | inputs: 14 | baseAppPath: test/assets/test.apk 15 | targetAppPath: test/assets/test.apk 16 | summaryOutputPath: summary.md 17 | displayName: Run APK size comparision 18 | ``` 19 | 20 | - In a GitHub Workflow 21 | 22 | ```yml 23 | - uses: microsoft/android-app-size-diff@v1 24 | name: Run APK size comparision 25 | with: 26 | baseAppPath: test/assets/test.apk 27 | targetAppPath: test/assets/test.apk 28 | summaryOutputPath: summary.md 29 | ``` 30 | 31 | ## Usage API 32 | The API to use the GitHub action or Azure DevOps task is similar 33 | 34 | ### Inputs 35 | 36 | - `baseAppPath`: Path to base apk. This is the app before changes 37 | - required: true 38 | - default: 'base.apk' 39 | - `baseAppLabel`: Label to use for the base app in the report 40 | - required: false 41 | - default: 'Base APK' 42 | - `targetAppPath`: Path to target apk. This is the app after changes 43 | - required: true 44 | - default: 'target.apk' 45 | - `targetAppLabel`: Label to use for the base app in the report 46 | - required: false 47 | - default: 'Target APK' 48 | - `summaryOutputPath`: Output file where comparision summary should be written to 49 | - required: true 50 | - default: 'summary.md' 51 | - `metrics`: A comma seperated list of size metrics to include in the summary. Possible values are `apkSize`, `installSize`, `dexFiles`, `arscFile`, `nativeLibs` 52 | - required: false 53 | - default: 'apkSize, installSize, dexFiles, arscFile, nativeLibs' 54 | - `thresholds`: A comma seperated list of thresholds for each of the metrics in bytes. If this is empty, no thresholding will apply. When this is not empty, the task will fail when any of the given thresholds are crossed 55 | - required: false 56 | - default: '' 57 | - `telemetryEnabled`: Set to `false` to disable telemetry 58 | - required: false 59 | - default: 'true' 60 | 61 | # Data Collection 62 | 63 | The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. 64 | 65 | To disable data collection when using this extension, set the `telemetryEnabled` input to `false` 66 | 67 | # Contributing 68 | 69 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 70 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 71 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 72 | 73 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 74 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 75 | provided by the bot. You will only need to do this once across all repos using our CLA. 76 | 77 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 78 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 79 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 80 | 81 | ## Setting up development 82 | 83 | Starting by cloning the repository. If your changes are small, feel free to open a PR with changes and the CI will take care of testing that everything still works with your changes. For something more long term or local testing, read on. 84 | 85 | ### Installations 86 | - Install all global dependencies 87 | ```shell 88 | npm install -g typescript 89 | npm install -g ts-node 90 | npm install -g mocha 91 | 92 | # Only if you are compiling the GitHub plugin 93 | npm install -g @zeit/ncc 94 | 95 | # Only if you are publishing to ADO. Not required for most scenarios 96 | npm install -g tfx-cli 97 | ``` 98 | - Install all project dependencies 99 | `npm install` 100 | 101 | ### Running 102 | 103 | See `package.json` for full list of npm tasks. The below should be sufficient to get you started 104 | 105 | - Build code `npm run build` 106 | - Run ADO plugin locally `npm run adoTask` 107 | - See [ADO Custom Task docs](https://docs.microsoft.com/en-us/azure/devops/extend/develop/add-build-task?view=azure-devops#run-the-task) to understand what variables to set - basically all task inputs 108 | - Run all tests `npm run test` 109 | - Likely a better way to test your changes 110 | - Bundle all plugins `npm run bundle` 111 | 112 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: 'Android App size difference' 2 | description: 'Compares the size of 2 APKs' 3 | branding: 4 | icon: 'smartphone' 5 | color: 'green' 6 | inputs: 7 | baseAppPath: 8 | description: 'Path to base apk. This is the app before changes' 9 | required: true 10 | default: 'base.apk' 11 | baseAppLabel: 12 | description: 'Label to use for the base app in the report' 13 | required: false 14 | default: 'Base APK' 15 | targetAppPath: 16 | description: 'Path to target apk. This is the app after changes' 17 | required: true 18 | default: 'target.apk' 19 | targetAppLabel: 20 | description: 'Label to use for the target app in the report' 21 | required: false 22 | default: 'Target APK' 23 | summaryOutputPath: 24 | description: 'Output file where comparision summary should be written to' 25 | required: true 26 | default: 'summary.md' 27 | metrics: 28 | description: 'A comma seperated list of size metrics to include in the summary. Possible values are `apkSize`, `installSize`, `dexFiles`, `arscFile`, `nativeLibs`' 29 | required: false 30 | default: 'apkSize, installSize, dexFiles, arscFile, nativeLibs' 31 | thresholds: 32 | description: 'A comma seperated list of thresholds for each of the metrics in bytes. If this is empty, no thresholding will apply. When this is not empty, the task will fail when any of the given thresholds are crossed' 33 | required: false 34 | default: '' 35 | telemetryEnabled: 36 | description: 'Set to `false` to disable telemetry' 37 | required: false 38 | default: 'true' 39 | runs: 40 | using: 'node12' 41 | main: 'dist_gh_action/index.js' 42 | -------------------------------------------------------------------------------- /ado-extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifestVersion": 1, 3 | "id": "android-app-size-diff-utils", 4 | "name": "Android app size changes", 5 | "version": "1.0.5", 6 | "publisher": "MSSwiftKey", 7 | "targets": [ 8 | { 9 | "id": "Microsoft.VisualStudio.Services" 10 | } 11 | ], 12 | "description": "Tools for Android app size changes", 13 | "tags": [ 14 | "Android", 15 | "App size", 16 | "Developer tools" 17 | ], 18 | "categories": [ 19 | "Azure Pipelines" 20 | ], 21 | "icons": { 22 | "default": "src/assets/appSizeChangesIcon.png" 23 | }, 24 | "files": [ 25 | { 26 | "path": "dist/src" 27 | } 28 | ], 29 | "repository": { 30 | "type": "git", 31 | "uri": "https://github.com/microsoft/android-app-size-diff" 32 | }, 33 | "content": { 34 | "details": { 35 | "path": "src/assets/overview.md" 36 | } 37 | }, 38 | "contributions": [ 39 | { 40 | "id": "android-app-size-diff", 41 | "type": "ms.vss-distributed-task.task", 42 | "targets": [ 43 | "ms.vss-distributed-task.tasks" 44 | ], 45 | "properties": { 46 | "name": "dist/src" 47 | } 48 | } 49 | ], 50 | "galleryFlags": [ 51 | "Public" 52 | ] 53 | } -------------------------------------------------------------------------------- /azure-devops/ado-task-test.yml: -------------------------------------------------------------------------------- 1 | trigger: 2 | - main 3 | 4 | pool: 5 | vmImage: 'ubuntu-latest' 6 | 7 | steps: 8 | - task: android-app-size-diff@0 9 | inputs: 10 | baseAppPath: test/assets/test.apk 11 | baseAppLabel: Base app 12 | targetAppPath: test/assets/test.apk 13 | targetAppLabel: Target app 14 | summaryOutputPath: summary.md 15 | metrics: apkSize, installSize, arscFile, nativeLibs, dexFiles 16 | thresholds: 10, 10, 10, 10, 10 17 | displayName: 'Run APK size comparision' 18 | 19 | - script: cat summary.md 20 | displayName: 'Print generated summary' 21 | -------------------------------------------------------------------------------- /azure-devops/release.yml: -------------------------------------------------------------------------------- 1 | # Build all packages required for a new release. At the moment only the ADO extension is packaged. GitHub action is checked in to the repo 2 | 3 | trigger: 4 | - main 5 | 6 | pool: 7 | vmImage: ubuntu-18.04 8 | demands: 9 | - msbuild 10 | - npm 11 | 12 | variables: 13 | GDN_VERSION: '0.110.0-linux' 14 | GDNP_VERSION: '1.61.0-linux' 15 | 16 | steps: 17 | - task: NodeTool@0 18 | inputs: 19 | versionSpec: '10.x' 20 | displayName: 'Install Node.js' 21 | 22 | - script: | 23 | npm install -g typescript 24 | npm install -g ts-node 25 | npm install -g mocha 26 | npm install -g @zeit/ncc 27 | npm install -g tfx-cli 28 | npm install 29 | displayName: 'Install dependencies' 30 | 31 | - script: | 32 | npm run build 33 | npm run bundle 34 | displayName: "Bundle ADO and GitHub extensions" 35 | 36 | - script: | 37 | # Copy APKs 38 | cp -r $(build.sourcesdirectory)/dist_gh_action $(build.artifactstagingdirectory)/ 39 | cp -r $(build.sourcesdirectory)/*.vsix $(build.artifactstagingdirectory)/ 40 | displayName: 'Copy extensions to artifacts' 41 | 42 | - script: | 43 | PackageVersion=$(node -e "console.log(require('./package.json').version);") 44 | echo "##vso[task.setVariable variable=PackageVersion;isOutput=true]$(PackageVersion)" 45 | displayName: Find bundle version 46 | 47 | - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 48 | displayName: 'SBOM Manifest Generator' 49 | inputs: 50 | BuildDropPath: '$(build.artifactstagingdirectory)' 51 | Verbosity: Information 52 | PackageName: 'Microsoft Android App Size Diff CI' 53 | PackageVersion: '$(PackageVersion)' 54 | 55 | - template: templates/credscan.yml 56 | parameters: 57 | isShipped: true 58 | buildName: 'android-app-size-diff-release' 59 | 60 | - template: templates/component-governance.yml 61 | 62 | - publish: $(build.artifactstagingdirectory) 63 | artifact: app-size-diff 64 | displayName: 'Publish artifacts to pipeline' -------------------------------------------------------------------------------- /azure-devops/security-checks.yml: -------------------------------------------------------------------------------- 1 | # Checks for Component Governance and CredScan 2 | trigger: 3 | - main 4 | 5 | pool: 6 | vmImage: ubuntu-18.04 7 | demands: 8 | - msbuild 9 | - npm 10 | 11 | variables: 12 | GDN_VERSION: '0.110.0-linux' 13 | GDNP_VERSION: '1.61.0-linux' 14 | 15 | steps: 16 | - template: templates/credscan.yml 17 | parameters: 18 | buildName: 'android-app-size-diff-$(Build.SourceBranch)' 19 | 20 | - template: templates/component-governance.yml 21 | -------------------------------------------------------------------------------- /azure-devops/templates/component-governance.yml: -------------------------------------------------------------------------------- 1 | steps: 2 | - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 3 | displayName: 'Component Detection' 4 | inputs: 5 | failOnAlert: true -------------------------------------------------------------------------------- /azure-devops/templates/credscan.yml: -------------------------------------------------------------------------------- 1 | # Run the Credential Scanner check for security compliance. This then also 2 | # publishes the artifacts in a Microsoft compliant way. 3 | parameters: 4 | isShipped: false 5 | # This will be used for the Asset group name and should not have spaces as it may cause problems with ARROW processing. 6 | buildName: 'android-app-size-diff' 7 | 8 | steps: 9 | - task: securedevelopmentteam.vss-secure-development-tools.build-task-credscan.CredScan@3 10 | displayName: 'Run Credential Scanner' 11 | inputs: 12 | debugMode: false 13 | 14 | - task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@3 15 | displayName: 'Publish Guardian Artifacts' 16 | inputs: 17 | ArtifactType: M365 18 | 19 | - task: dikalya.AssetRetention.asset-retention-task.AssetRetention@3 20 | displayName: 'ARtifact Retention Orchestrator Workflow (ARROW)' 21 | inputs: 22 | ArrowServiceConnection: 'Arrow_msresearch_JAVTUN' 23 | AssetGroupName: '$(System.TeamProject)_${{ parameters.buildName }}' 24 | AssetNumber: '$(Build.BuildId)' 25 | IsShipped: ${{ parameters.isShipped }} 26 | DropsToRetain: 'CodeAnalysisLogs' 27 | condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/')) 28 | 29 | - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@2 30 | displayName: 'Guardian Break' 31 | inputs: 32 | GdnBreakPolicyMinSev: Warning 33 | GdnBreakAllTools: true 34 | GdnBreakGdnToolCredScan: true 35 | GdnBreakGdnToolCredScanSeverity: Warning 36 | GdnBreakPolicy: M365 -------------------------------------------------------------------------------- /bumpVersion.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | 3 | const bumpMetric = process.argv[2]; 4 | const supportedBumps = ["major", "minor", "patch"] 5 | 6 | const nodePackagJsonPath = 'package.json'; 7 | const adoExtensionJsonPath = 'ado-extension.json'; 8 | const adoTaskJsonPath = 'src/task.json'; 9 | 10 | if (process.argv.length != 3) { 11 | throw "Need exactly one argument!" 12 | } 13 | 14 | if (!supportedBumps.includes(bumpMetric)) { 15 | console.error("Cannot bump `" + bumpMetric + "`. Can only bump one of " + supportedBumps.join("/")) 16 | throw "Invalid bump requested!" 17 | } 18 | 19 | var nodePackageJson = JSON.parse(fs.readFileSync(nodePackagJsonPath,'utf8')); 20 | var adoExtensionJson = JSON.parse(fs.readFileSync(adoExtensionJsonPath,'utf8')); 21 | var adoTaskJson = JSON.parse(fs.readFileSync(adoTaskJsonPath,'utf8')); 22 | 23 | const versions = nodePackageJson['version'].split("."); 24 | var major = Number(versions[0]); 25 | var minor = Number(versions[1]); 26 | var patch = Number(versions[2]); 27 | 28 | if (bumpMetric == 'major') { 29 | major += 1; 30 | minor = 0; 31 | patch = 0; 32 | } else if (bumpMetric == 'minor') { 33 | minor += 1; 34 | patch = 0; 35 | } else { 36 | patch += 1; 37 | } 38 | 39 | const newVersion = major + "." + minor + "." + patch; 40 | 41 | // Update each jsons 42 | nodePackageJson['version'] = newVersion; 43 | adoExtensionJson['version'] = newVersion; 44 | adoTaskJson['version']['Major'] = major; 45 | adoTaskJson['version']['Minor'] = minor; 46 | adoTaskJson['version']['Patch'] = patch; 47 | 48 | fs.writeFileSync(nodePackagJsonPath, JSON.stringify(nodePackageJson, null, 4)); 49 | fs.writeFileSync(adoExtensionJsonPath, JSON.stringify(adoExtensionJson, null, 4)); 50 | fs.writeFileSync(adoTaskJsonPath, JSON.stringify(adoTaskJson, null, 4)); 51 | 52 | console.log("New version is: " + newVersion); 53 | -------------------------------------------------------------------------------- /copyFiles.ts: -------------------------------------------------------------------------------- 1 | import * as shell from "shelljs"; 2 | 3 | console.log('Copying files..'); 4 | shell.cp("-R", "src/assets", "dist/src"); 5 | shell.cp("-R", "node_modules", "dist/src"); 6 | shell.cp("src/task.json", "dist/src/task.json"); 7 | shell.cp("-R", "test/assets", "dist/test"); 8 | -------------------------------------------------------------------------------- /dist_gh_action/lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "messages": { 3 | "LIB_UnhandledEx": "Unhandled: %s", 4 | "LIB_FailOnCode": "Failure return code: %d", 5 | "LIB_MkdirFailed": "Unable to create directory '%s'. %s", 6 | "LIB_MkdirFailedFileExists": "Unable to create directory '%s'. Conflicting file exists: '%s'", 7 | "LIB_MkdirFailedInvalidDriveRoot": "Unable to create directory '%s'. Root directory does not exist: '%s'", 8 | "LIB_MkdirFailedInvalidShare": "Unable to create directory '%s'. Unable to verify the directory exists: '%s'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share.", 9 | "LIB_MultilineSecret": "Secrets cannot contain multiple lines", 10 | "LIB_ProcessError": "There was an error when attempting to execute the process '%s'. This may indicate the process failed to start. Error: %s", 11 | "LIB_ProcessExitCode": "The process '%s' failed with exit code %s", 12 | "LIB_ProcessStderr": "The process '%s' failed because one or more lines were written to the STDERR stream", 13 | "LIB_ReturnCode": "Return code: %d", 14 | "LIB_ResourceFileNotExist": "Resource file doesn\\'t exist: %s", 15 | "LIB_ResourceFileAlreadySet": "Resource file has already set to: %s", 16 | "LIB_ResourceFileNotSet": "Resource file haven\\'t set, can\\'t find loc string for key: %s", 17 | "LIB_StdioNotClosed": "The STDIO streams did not close within %s seconds of the exit event from process '%s'. This may indicate a child process inherited the STDIO streams and has not yet exited.", 18 | "LIB_WhichNotFound_Linux": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.", 19 | "LIB_WhichNotFound_Win": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.", 20 | "LIB_LocStringNotFound": "Can\\'t find loc string for key: %s", 21 | "LIB_ParameterIsRequired": "%s not supplied", 22 | "LIB_InputRequired": "Input required: %s", 23 | "LIB_InvalidPattern": "Invalid pattern: '%s'", 24 | "LIB_EndpointNotExist": "Endpoint not present: %s", 25 | "LIB_EndpointDataNotExist": "Endpoint data parameter %s not present: %s", 26 | "LIB_EndpointAuthNotExist": "Endpoint auth data not present: %s", 27 | "LIB_InvalidEndpointAuth": "Invalid endpoint auth: %s", 28 | "LIB_InvalidSecureFilesInput": "Invalid secure file input: %s", 29 | "LIB_PathNotFound": "Not found %s: %s", 30 | "LIB_PathHasNullByte": "Path cannot contain null bytes", 31 | "LIB_OperationFailed": "Failed %s: %s", 32 | "LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.", 33 | "LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.", 34 | "LIB_PlatformNotSupported": "Platform not supported: %s" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "android-app-size-diff", 3 | "version": "1.0.5", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "android-app-size-diff", 9 | "version": "1.0.5", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@actions/core": "^1.2.6", 13 | "@types/adm-zip": "^0.4.32", 14 | "@types/line-reader": "0.0.28", 15 | "adm-zip": "^0.4.13", 16 | "applicationinsights": "^1.6.0", 17 | "azure-pipelines-task-lib": "^3.1.10", 18 | "line-reader": "^0.4.0" 19 | }, 20 | "devDependencies": { 21 | "@types/download": "^6.2.4", 22 | "@types/mocha": "^5.2.7", 23 | "@types/node": "^13.1.1", 24 | "@types/q": "^1.5.2", 25 | "@types/shelljs": "^0.8.5", 26 | "download": "^7.1.0", 27 | "shelljs": "^0.8.5", 28 | "sync-request": "^6.1.0" 29 | } 30 | }, 31 | "node_modules/@actions/core": { 32 | "version": "1.2.6", 33 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", 34 | "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" 35 | }, 36 | "node_modules/@sindresorhus/is": { 37 | "version": "0.7.0", 38 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", 39 | "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", 40 | "dev": true, 41 | "engines": { 42 | "node": ">=4" 43 | } 44 | }, 45 | "node_modules/@types/adm-zip": { 46 | "version": "0.4.32", 47 | "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.32.tgz", 48 | "integrity": "sha512-hv1O7ySn+XvP5OeDQcJFWwVb2v+GFGO1A9aMTQ5B/bzxb7WW21O8iRhVdsKKr8QwuiagzGmPP+gsUAYZ6bRddQ==", 49 | "dependencies": { 50 | "@types/node": "*" 51 | } 52 | }, 53 | "node_modules/@types/concat-stream": { 54 | "version": "1.6.0", 55 | "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", 56 | "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", 57 | "dependencies": { 58 | "@types/node": "*" 59 | } 60 | }, 61 | "node_modules/@types/decompress": { 62 | "version": "4.2.3", 63 | "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.3.tgz", 64 | "integrity": "sha512-W24e3Ycz1UZPgr1ZEDHlK4XnvOr+CpJH3qNsFeqXwwlW/9END9gxn3oJSsp7gYdiQxrXUHwUUd3xuzVz37MrZQ==", 65 | "dev": true, 66 | "dependencies": { 67 | "@types/node": "*" 68 | } 69 | }, 70 | "node_modules/@types/download": { 71 | "version": "6.2.4", 72 | "resolved": "https://registry.npmjs.org/@types/download/-/download-6.2.4.tgz", 73 | "integrity": "sha512-Lo5dy3ai6LNnbL663sgdzqL1eib11u1yKH6w3v3IXEOO4kRfQpMn1qWUTaumcHLACjFp1RcBx9tUXEvJoR3vcA==", 74 | "dev": true, 75 | "dependencies": { 76 | "@types/decompress": "*", 77 | "@types/got": "^8", 78 | "@types/node": "*" 79 | } 80 | }, 81 | "node_modules/@types/events": { 82 | "version": "3.0.0", 83 | "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", 84 | "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", 85 | "dev": true 86 | }, 87 | "node_modules/@types/form-data": { 88 | "version": "0.0.33", 89 | "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", 90 | "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", 91 | "dependencies": { 92 | "@types/node": "*" 93 | } 94 | }, 95 | "node_modules/@types/glob": { 96 | "version": "7.1.1", 97 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", 98 | "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", 99 | "dev": true, 100 | "dependencies": { 101 | "@types/events": "*", 102 | "@types/minimatch": "*", 103 | "@types/node": "*" 104 | } 105 | }, 106 | "node_modules/@types/got": { 107 | "version": "8.3.5", 108 | "resolved": "https://registry.npmjs.org/@types/got/-/got-8.3.5.tgz", 109 | "integrity": "sha512-AaXSrIF99SjjtPVNmCmYb388HML+PKEJb/xmj4SbL2ZO0hHuETZZzyDIKfOqaEoAHZEuX4sC+FRFrHYJoIby6A==", 110 | "dev": true, 111 | "dependencies": { 112 | "@types/node": "*" 113 | } 114 | }, 115 | "node_modules/@types/line-reader": { 116 | "version": "0.0.28", 117 | "resolved": "https://registry.npmjs.org/@types/line-reader/-/line-reader-0.0.28.tgz", 118 | "integrity": "sha1-y4/yVoKbmiN/zzG8Obwvt3HP1MQ=" 119 | }, 120 | "node_modules/@types/minimatch": { 121 | "version": "3.0.3", 122 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 123 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", 124 | "dev": true 125 | }, 126 | "node_modules/@types/mocha": { 127 | "version": "5.2.7", 128 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", 129 | "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", 130 | "dev": true 131 | }, 132 | "node_modules/@types/node": { 133 | "version": "13.1.4", 134 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.4.tgz", 135 | "integrity": "sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA==" 136 | }, 137 | "node_modules/@types/q": { 138 | "version": "1.5.2", 139 | "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", 140 | "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", 141 | "dev": true 142 | }, 143 | "node_modules/@types/qs": { 144 | "version": "6.9.0", 145 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.0.tgz", 146 | "integrity": "sha512-c4zji5CjWv1tJxIZkz1oUtGcdOlsH3aza28Nqmm+uNDWBRHoMsjooBEN4czZp1V3iXPihE/VRUOBqg+4Xq0W4g==" 147 | }, 148 | "node_modules/@types/shelljs": { 149 | "version": "0.8.6", 150 | "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.6.tgz", 151 | "integrity": "sha512-svx2eQS268awlppL/P8wgDLBrsDXdKznABHJcuqXyWpSKJgE1s2clXlBvAwbO/lehTmG06NtEWJRkAk4tAgenA==", 152 | "dev": true, 153 | "dependencies": { 154 | "@types/glob": "*", 155 | "@types/node": "*" 156 | } 157 | }, 158 | "node_modules/adm-zip": { 159 | "version": "0.4.13", 160 | "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", 161 | "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", 162 | "engines": { 163 | "node": ">=0.3.0" 164 | } 165 | }, 166 | "node_modules/applicationinsights": { 167 | "version": "1.6.0", 168 | "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.6.0.tgz", 169 | "integrity": "sha512-bTK91ZMPAh3UrN0q3Bq0ePn7RHmURbiPztsNPMpsURPOipNqLKgZlQ6Vg3kjwHiqehrCN/24753ED0nritvr5g==", 170 | "dependencies": { 171 | "cls-hooked": "^4.2.2", 172 | "continuation-local-storage": "^3.2.1", 173 | "diagnostic-channel": "0.2.0", 174 | "diagnostic-channel-publishers": "^0.3.3" 175 | } 176 | }, 177 | "node_modules/archive-type": { 178 | "version": "4.0.0", 179 | "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", 180 | "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", 181 | "dev": true, 182 | "dependencies": { 183 | "file-type": "^4.2.0" 184 | }, 185 | "engines": { 186 | "node": ">=4" 187 | } 188 | }, 189 | "node_modules/archive-type/node_modules/file-type": { 190 | "version": "4.4.0", 191 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", 192 | "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", 193 | "dev": true, 194 | "engines": { 195 | "node": ">=4" 196 | } 197 | }, 198 | "node_modules/asap": { 199 | "version": "2.0.6", 200 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 201 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 202 | }, 203 | "node_modules/async-hook-jl": { 204 | "version": "1.7.6", 205 | "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", 206 | "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", 207 | "dependencies": { 208 | "stack-chain": "^1.3.7" 209 | }, 210 | "engines": { 211 | "node": "^4.7 || >=6.9 || >=7.3" 212 | } 213 | }, 214 | "node_modules/async-listener": { 215 | "version": "0.6.10", 216 | "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", 217 | "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", 218 | "dependencies": { 219 | "semver": "^5.3.0", 220 | "shimmer": "^1.1.0" 221 | }, 222 | "engines": { 223 | "node": "<=0.11.8 || >0.11.10" 224 | } 225 | }, 226 | "node_modules/asynckit": { 227 | "version": "0.4.0", 228 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 229 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 230 | }, 231 | "node_modules/azure-pipelines-task-lib": { 232 | "version": "3.2.0", 233 | "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.2.0.tgz", 234 | "integrity": "sha512-7mO6/B1HwGISpP8z0UiNw/O9mu34lQpAm7jlU/jTNdwfL4RCsHJkUFD86zN+8wVFVgwBNskBaZtem4fmCxdklQ==", 235 | "dependencies": { 236 | "minimatch": "3.0.4", 237 | "mockery": "^1.7.0", 238 | "q": "^1.5.1", 239 | "semver": "^5.1.0", 240 | "shelljs": "^0.8.5", 241 | "sync-request": "6.1.0", 242 | "uuid": "^3.0.1" 243 | } 244 | }, 245 | "node_modules/balanced-match": { 246 | "version": "1.0.0", 247 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 248 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 249 | }, 250 | "node_modules/base64-js": { 251 | "version": "1.3.1", 252 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 253 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 254 | "dev": true 255 | }, 256 | "node_modules/bl": { 257 | "version": "1.2.3", 258 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 259 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 260 | "dev": true, 261 | "dependencies": { 262 | "readable-stream": "^2.3.5", 263 | "safe-buffer": "^5.1.1" 264 | } 265 | }, 266 | "node_modules/brace-expansion": { 267 | "version": "1.1.11", 268 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 269 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 270 | "dependencies": { 271 | "balanced-match": "^1.0.0", 272 | "concat-map": "0.0.1" 273 | } 274 | }, 275 | "node_modules/buffer": { 276 | "version": "5.4.3", 277 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", 278 | "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", 279 | "dev": true, 280 | "dependencies": { 281 | "base64-js": "^1.0.2", 282 | "ieee754": "^1.1.4" 283 | } 284 | }, 285 | "node_modules/buffer-alloc": { 286 | "version": "1.2.0", 287 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 288 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 289 | "dev": true, 290 | "dependencies": { 291 | "buffer-alloc-unsafe": "^1.1.0", 292 | "buffer-fill": "^1.0.0" 293 | } 294 | }, 295 | "node_modules/buffer-alloc-unsafe": { 296 | "version": "1.1.0", 297 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 298 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 299 | "dev": true 300 | }, 301 | "node_modules/buffer-crc32": { 302 | "version": "0.2.13", 303 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 304 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 305 | "dev": true, 306 | "engines": { 307 | "node": "*" 308 | } 309 | }, 310 | "node_modules/buffer-fill": { 311 | "version": "1.0.0", 312 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 313 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 314 | "dev": true 315 | }, 316 | "node_modules/buffer-from": { 317 | "version": "1.1.1", 318 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 319 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 320 | }, 321 | "node_modules/cacheable-request": { 322 | "version": "2.1.4", 323 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", 324 | "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", 325 | "dev": true, 326 | "dependencies": { 327 | "clone-response": "1.0.2", 328 | "get-stream": "3.0.0", 329 | "http-cache-semantics": "3.8.1", 330 | "keyv": "3.0.0", 331 | "lowercase-keys": "1.0.0", 332 | "normalize-url": "2.0.1", 333 | "responselike": "1.0.2" 334 | } 335 | }, 336 | "node_modules/cacheable-request/node_modules/lowercase-keys": { 337 | "version": "1.0.0", 338 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 339 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", 340 | "dev": true, 341 | "engines": { 342 | "node": ">=0.10.0" 343 | } 344 | }, 345 | "node_modules/caseless": { 346 | "version": "0.12.0", 347 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 348 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 349 | }, 350 | "node_modules/caw": { 351 | "version": "2.0.1", 352 | "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", 353 | "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", 354 | "dev": true, 355 | "dependencies": { 356 | "get-proxy": "^2.0.0", 357 | "isurl": "^1.0.0-alpha5", 358 | "tunnel-agent": "^0.6.0", 359 | "url-to-options": "^1.0.1" 360 | }, 361 | "engines": { 362 | "node": ">=4" 363 | } 364 | }, 365 | "node_modules/clone-response": { 366 | "version": "1.0.2", 367 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 368 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 369 | "dev": true, 370 | "dependencies": { 371 | "mimic-response": "^1.0.0" 372 | } 373 | }, 374 | "node_modules/cls-hooked": { 375 | "version": "4.2.2", 376 | "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", 377 | "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", 378 | "dependencies": { 379 | "async-hook-jl": "^1.7.6", 380 | "emitter-listener": "^1.0.1", 381 | "semver": "^5.4.1" 382 | }, 383 | "engines": { 384 | "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" 385 | } 386 | }, 387 | "node_modules/combined-stream": { 388 | "version": "1.0.8", 389 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 390 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 391 | "dependencies": { 392 | "delayed-stream": "~1.0.0" 393 | }, 394 | "engines": { 395 | "node": ">= 0.8" 396 | } 397 | }, 398 | "node_modules/commander": { 399 | "version": "2.8.1", 400 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 401 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 402 | "dev": true, 403 | "dependencies": { 404 | "graceful-readlink": ">= 1.0.0" 405 | }, 406 | "engines": { 407 | "node": ">= 0.6.x" 408 | } 409 | }, 410 | "node_modules/concat-map": { 411 | "version": "0.0.1", 412 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 413 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 414 | }, 415 | "node_modules/concat-stream": { 416 | "version": "1.6.2", 417 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 418 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 419 | "engines": [ 420 | "node >= 0.8" 421 | ], 422 | "dependencies": { 423 | "buffer-from": "^1.0.0", 424 | "inherits": "^2.0.3", 425 | "readable-stream": "^2.2.2", 426 | "typedarray": "^0.0.6" 427 | } 428 | }, 429 | "node_modules/config-chain": { 430 | "version": "1.1.12", 431 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", 432 | "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", 433 | "dev": true, 434 | "dependencies": { 435 | "ini": "^1.3.4", 436 | "proto-list": "~1.2.1" 437 | } 438 | }, 439 | "node_modules/content-disposition": { 440 | "version": "0.5.3", 441 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 442 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 443 | "dev": true, 444 | "dependencies": { 445 | "safe-buffer": "5.1.2" 446 | }, 447 | "engines": { 448 | "node": ">= 0.6" 449 | } 450 | }, 451 | "node_modules/content-disposition/node_modules/safe-buffer": { 452 | "version": "5.1.2", 453 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 454 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 455 | "dev": true 456 | }, 457 | "node_modules/continuation-local-storage": { 458 | "version": "3.2.1", 459 | "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", 460 | "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", 461 | "dependencies": { 462 | "async-listener": "^0.6.0", 463 | "emitter-listener": "^1.1.1" 464 | } 465 | }, 466 | "node_modules/core-util-is": { 467 | "version": "1.0.2", 468 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 469 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 470 | }, 471 | "node_modules/decode-uri-component": { 472 | "version": "0.2.0", 473 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 474 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 475 | "dev": true, 476 | "engines": { 477 | "node": ">=0.10" 478 | } 479 | }, 480 | "node_modules/decompress": { 481 | "version": "4.2.1", 482 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", 483 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", 484 | "dev": true, 485 | "dependencies": { 486 | "decompress-tar": "^4.0.0", 487 | "decompress-tarbz2": "^4.0.0", 488 | "decompress-targz": "^4.0.0", 489 | "decompress-unzip": "^4.0.1", 490 | "graceful-fs": "^4.1.10", 491 | "make-dir": "^1.0.0", 492 | "pify": "^2.3.0", 493 | "strip-dirs": "^2.0.0" 494 | }, 495 | "engines": { 496 | "node": ">=4" 497 | } 498 | }, 499 | "node_modules/decompress-response": { 500 | "version": "3.3.0", 501 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 502 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 503 | "dev": true, 504 | "dependencies": { 505 | "mimic-response": "^1.0.0" 506 | }, 507 | "engines": { 508 | "node": ">=4" 509 | } 510 | }, 511 | "node_modules/decompress-tar": { 512 | "version": "4.1.1", 513 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 514 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 515 | "dev": true, 516 | "dependencies": { 517 | "file-type": "^5.2.0", 518 | "is-stream": "^1.1.0", 519 | "tar-stream": "^1.5.2" 520 | }, 521 | "engines": { 522 | "node": ">=4" 523 | } 524 | }, 525 | "node_modules/decompress-tar/node_modules/file-type": { 526 | "version": "5.2.0", 527 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 528 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", 529 | "dev": true, 530 | "engines": { 531 | "node": ">=4" 532 | } 533 | }, 534 | "node_modules/decompress-tarbz2": { 535 | "version": "4.1.1", 536 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 537 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 538 | "dev": true, 539 | "dependencies": { 540 | "decompress-tar": "^4.1.0", 541 | "file-type": "^6.1.0", 542 | "is-stream": "^1.1.0", 543 | "seek-bzip": "^1.0.5", 544 | "unbzip2-stream": "^1.0.9" 545 | }, 546 | "engines": { 547 | "node": ">=4" 548 | } 549 | }, 550 | "node_modules/decompress-tarbz2/node_modules/file-type": { 551 | "version": "6.2.0", 552 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 553 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", 554 | "dev": true, 555 | "engines": { 556 | "node": ">=4" 557 | } 558 | }, 559 | "node_modules/decompress-targz": { 560 | "version": "4.1.1", 561 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 562 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 563 | "dev": true, 564 | "dependencies": { 565 | "decompress-tar": "^4.1.1", 566 | "file-type": "^5.2.0", 567 | "is-stream": "^1.1.0" 568 | }, 569 | "engines": { 570 | "node": ">=4" 571 | } 572 | }, 573 | "node_modules/decompress-targz/node_modules/file-type": { 574 | "version": "5.2.0", 575 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 576 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", 577 | "dev": true, 578 | "engines": { 579 | "node": ">=4" 580 | } 581 | }, 582 | "node_modules/decompress-unzip": { 583 | "version": "4.0.1", 584 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 585 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", 586 | "dev": true, 587 | "dependencies": { 588 | "file-type": "^3.8.0", 589 | "get-stream": "^2.2.0", 590 | "pify": "^2.3.0", 591 | "yauzl": "^2.4.2" 592 | }, 593 | "engines": { 594 | "node": ">=4" 595 | } 596 | }, 597 | "node_modules/decompress-unzip/node_modules/file-type": { 598 | "version": "3.9.0", 599 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 600 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", 601 | "dev": true, 602 | "engines": { 603 | "node": ">=0.10.0" 604 | } 605 | }, 606 | "node_modules/decompress-unzip/node_modules/get-stream": { 607 | "version": "2.3.1", 608 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 609 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", 610 | "dev": true, 611 | "dependencies": { 612 | "object-assign": "^4.0.1", 613 | "pinkie-promise": "^2.0.0" 614 | }, 615 | "engines": { 616 | "node": ">=0.10.0" 617 | } 618 | }, 619 | "node_modules/decompress-unzip/node_modules/pify": { 620 | "version": "2.3.0", 621 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 622 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 623 | "dev": true, 624 | "engines": { 625 | "node": ">=0.10.0" 626 | } 627 | }, 628 | "node_modules/decompress/node_modules/pify": { 629 | "version": "2.3.0", 630 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 631 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 632 | "dev": true, 633 | "engines": { 634 | "node": ">=0.10.0" 635 | } 636 | }, 637 | "node_modules/delayed-stream": { 638 | "version": "1.0.0", 639 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 640 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 641 | "engines": { 642 | "node": ">=0.4.0" 643 | } 644 | }, 645 | "node_modules/diagnostic-channel": { 646 | "version": "0.2.0", 647 | "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", 648 | "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", 649 | "dependencies": { 650 | "semver": "^5.3.0" 651 | } 652 | }, 653 | "node_modules/diagnostic-channel-publishers": { 654 | "version": "0.3.3", 655 | "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.3.tgz", 656 | "integrity": "sha512-qIocRYU5TrGUkBlDDxaziAK1+squ8Yf2Ls4HldL3xxb/jzmWO2Enux7CvevNKYmF2kDXZ9HiRqwjPsjk8L+i2Q==", 657 | "peerDependencies": { 658 | "diagnostic-channel": "*" 659 | } 660 | }, 661 | "node_modules/download": { 662 | "version": "7.1.0", 663 | "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", 664 | "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", 665 | "dev": true, 666 | "dependencies": { 667 | "archive-type": "^4.0.0", 668 | "caw": "^2.0.1", 669 | "content-disposition": "^0.5.2", 670 | "decompress": "^4.2.0", 671 | "ext-name": "^5.0.0", 672 | "file-type": "^8.1.0", 673 | "filenamify": "^2.0.0", 674 | "get-stream": "^3.0.0", 675 | "got": "^8.3.1", 676 | "make-dir": "^1.2.0", 677 | "p-event": "^2.1.0", 678 | "pify": "^3.0.0" 679 | }, 680 | "engines": { 681 | "node": ">=6" 682 | } 683 | }, 684 | "node_modules/duplexer3": { 685 | "version": "0.1.4", 686 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 687 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 688 | "dev": true 689 | }, 690 | "node_modules/emitter-listener": { 691 | "version": "1.1.2", 692 | "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", 693 | "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", 694 | "dependencies": { 695 | "shimmer": "^1.2.0" 696 | } 697 | }, 698 | "node_modules/end-of-stream": { 699 | "version": "1.4.4", 700 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 701 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 702 | "dev": true, 703 | "dependencies": { 704 | "once": "^1.4.0" 705 | } 706 | }, 707 | "node_modules/escape-string-regexp": { 708 | "version": "1.0.5", 709 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 710 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 711 | "dev": true, 712 | "engines": { 713 | "node": ">=0.8.0" 714 | } 715 | }, 716 | "node_modules/ext-list": { 717 | "version": "2.2.2", 718 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 719 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", 720 | "dev": true, 721 | "dependencies": { 722 | "mime-db": "^1.28.0" 723 | }, 724 | "engines": { 725 | "node": ">=0.10.0" 726 | } 727 | }, 728 | "node_modules/ext-name": { 729 | "version": "5.0.0", 730 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", 731 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", 732 | "dev": true, 733 | "dependencies": { 734 | "ext-list": "^2.0.0", 735 | "sort-keys-length": "^1.0.0" 736 | }, 737 | "engines": { 738 | "node": ">=4" 739 | } 740 | }, 741 | "node_modules/fd-slicer": { 742 | "version": "1.1.0", 743 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 744 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 745 | "dev": true, 746 | "dependencies": { 747 | "pend": "~1.2.0" 748 | } 749 | }, 750 | "node_modules/file-type": { 751 | "version": "8.1.0", 752 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", 753 | "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", 754 | "dev": true, 755 | "engines": { 756 | "node": ">=6" 757 | } 758 | }, 759 | "node_modules/filename-reserved-regex": { 760 | "version": "2.0.0", 761 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 762 | "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", 763 | "dev": true, 764 | "engines": { 765 | "node": ">=4" 766 | } 767 | }, 768 | "node_modules/filenamify": { 769 | "version": "2.1.0", 770 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", 771 | "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", 772 | "dev": true, 773 | "dependencies": { 774 | "filename-reserved-regex": "^2.0.0", 775 | "strip-outer": "^1.0.0", 776 | "trim-repeated": "^1.0.0" 777 | }, 778 | "engines": { 779 | "node": ">=4" 780 | } 781 | }, 782 | "node_modules/form-data": { 783 | "version": "2.5.1", 784 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 785 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 786 | "dependencies": { 787 | "asynckit": "^0.4.0", 788 | "combined-stream": "^1.0.6", 789 | "mime-types": "^2.1.12" 790 | }, 791 | "engines": { 792 | "node": ">= 0.12" 793 | } 794 | }, 795 | "node_modules/from2": { 796 | "version": "2.3.0", 797 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 798 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 799 | "dev": true, 800 | "dependencies": { 801 | "inherits": "^2.0.1", 802 | "readable-stream": "^2.0.0" 803 | } 804 | }, 805 | "node_modules/fs-constants": { 806 | "version": "1.0.0", 807 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 808 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 809 | "dev": true 810 | }, 811 | "node_modules/fs.realpath": { 812 | "version": "1.0.0", 813 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 814 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 815 | }, 816 | "node_modules/function-bind": { 817 | "version": "1.1.1", 818 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 819 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 820 | }, 821 | "node_modules/get-port": { 822 | "version": "3.2.0", 823 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 824 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", 825 | "engines": { 826 | "node": ">=4" 827 | } 828 | }, 829 | "node_modules/get-proxy": { 830 | "version": "2.1.0", 831 | "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", 832 | "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", 833 | "dev": true, 834 | "dependencies": { 835 | "npm-conf": "^1.1.0" 836 | }, 837 | "engines": { 838 | "node": ">=4" 839 | } 840 | }, 841 | "node_modules/get-stream": { 842 | "version": "3.0.0", 843 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 844 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 845 | "dev": true, 846 | "engines": { 847 | "node": ">=4" 848 | } 849 | }, 850 | "node_modules/glob": { 851 | "version": "7.2.0", 852 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 853 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 854 | "dependencies": { 855 | "fs.realpath": "^1.0.0", 856 | "inflight": "^1.0.4", 857 | "inherits": "2", 858 | "minimatch": "^3.0.4", 859 | "once": "^1.3.0", 860 | "path-is-absolute": "^1.0.0" 861 | }, 862 | "engines": { 863 | "node": "*" 864 | }, 865 | "funding": { 866 | "url": "https://github.com/sponsors/isaacs" 867 | } 868 | }, 869 | "node_modules/got": { 870 | "version": "8.3.2", 871 | "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", 872 | "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", 873 | "dev": true, 874 | "dependencies": { 875 | "@sindresorhus/is": "^0.7.0", 876 | "cacheable-request": "^2.1.1", 877 | "decompress-response": "^3.3.0", 878 | "duplexer3": "^0.1.4", 879 | "get-stream": "^3.0.0", 880 | "into-stream": "^3.1.0", 881 | "is-retry-allowed": "^1.1.0", 882 | "isurl": "^1.0.0-alpha5", 883 | "lowercase-keys": "^1.0.0", 884 | "mimic-response": "^1.0.0", 885 | "p-cancelable": "^0.4.0", 886 | "p-timeout": "^2.0.1", 887 | "pify": "^3.0.0", 888 | "safe-buffer": "^5.1.1", 889 | "timed-out": "^4.0.1", 890 | "url-parse-lax": "^3.0.0", 891 | "url-to-options": "^1.0.1" 892 | }, 893 | "engines": { 894 | "node": ">=4" 895 | } 896 | }, 897 | "node_modules/graceful-fs": { 898 | "version": "4.2.3", 899 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 900 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 901 | "dev": true 902 | }, 903 | "node_modules/graceful-readlink": { 904 | "version": "1.0.1", 905 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 906 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 907 | "dev": true 908 | }, 909 | "node_modules/has": { 910 | "version": "1.0.3", 911 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 912 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 913 | "dependencies": { 914 | "function-bind": "^1.1.1" 915 | }, 916 | "engines": { 917 | "node": ">= 0.4.0" 918 | } 919 | }, 920 | "node_modules/has-symbol-support-x": { 921 | "version": "1.4.2", 922 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", 923 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", 924 | "dev": true, 925 | "engines": { 926 | "node": "*" 927 | } 928 | }, 929 | "node_modules/has-to-string-tag-x": { 930 | "version": "1.4.1", 931 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", 932 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", 933 | "dev": true, 934 | "dependencies": { 935 | "has-symbol-support-x": "^1.4.1" 936 | }, 937 | "engines": { 938 | "node": "*" 939 | } 940 | }, 941 | "node_modules/http-basic": { 942 | "version": "8.1.3", 943 | "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", 944 | "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", 945 | "dependencies": { 946 | "caseless": "^0.12.0", 947 | "concat-stream": "^1.6.2", 948 | "http-response-object": "^3.0.1", 949 | "parse-cache-control": "^1.0.1" 950 | }, 951 | "engines": { 952 | "node": ">=6.0.0" 953 | } 954 | }, 955 | "node_modules/http-cache-semantics": { 956 | "version": "3.8.1", 957 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 958 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", 959 | "dev": true 960 | }, 961 | "node_modules/http-response-object": { 962 | "version": "3.0.2", 963 | "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", 964 | "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", 965 | "dependencies": { 966 | "@types/node": "^10.0.3" 967 | } 968 | }, 969 | "node_modules/http-response-object/node_modules/@types/node": { 970 | "version": "10.17.13", 971 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", 972 | "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==" 973 | }, 974 | "node_modules/ieee754": { 975 | "version": "1.1.13", 976 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 977 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 978 | "dev": true 979 | }, 980 | "node_modules/inflight": { 981 | "version": "1.0.6", 982 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 983 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 984 | "dependencies": { 985 | "once": "^1.3.0", 986 | "wrappy": "1" 987 | } 988 | }, 989 | "node_modules/inherits": { 990 | "version": "2.0.4", 991 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 992 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 993 | }, 994 | "node_modules/ini": { 995 | "version": "1.3.8", 996 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 997 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 998 | "dev": true 999 | }, 1000 | "node_modules/interpret": { 1001 | "version": "1.4.0", 1002 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 1003 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 1004 | "engines": { 1005 | "node": ">= 0.10" 1006 | } 1007 | }, 1008 | "node_modules/into-stream": { 1009 | "version": "3.1.0", 1010 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 1011 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 1012 | "dev": true, 1013 | "dependencies": { 1014 | "from2": "^2.1.1", 1015 | "p-is-promise": "^1.1.0" 1016 | }, 1017 | "engines": { 1018 | "node": ">=4" 1019 | } 1020 | }, 1021 | "node_modules/is-core-module": { 1022 | "version": "2.8.1", 1023 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 1024 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 1025 | "dependencies": { 1026 | "has": "^1.0.3" 1027 | }, 1028 | "funding": { 1029 | "url": "https://github.com/sponsors/ljharb" 1030 | } 1031 | }, 1032 | "node_modules/is-natural-number": { 1033 | "version": "4.0.1", 1034 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 1035 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", 1036 | "dev": true 1037 | }, 1038 | "node_modules/is-object": { 1039 | "version": "1.0.1", 1040 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", 1041 | "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", 1042 | "dev": true 1043 | }, 1044 | "node_modules/is-plain-obj": { 1045 | "version": "1.1.0", 1046 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 1047 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 1048 | "dev": true, 1049 | "engines": { 1050 | "node": ">=0.10.0" 1051 | } 1052 | }, 1053 | "node_modules/is-retry-allowed": { 1054 | "version": "1.2.0", 1055 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 1056 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", 1057 | "dev": true, 1058 | "engines": { 1059 | "node": ">=0.10.0" 1060 | } 1061 | }, 1062 | "node_modules/is-stream": { 1063 | "version": "1.1.0", 1064 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1065 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1066 | "dev": true, 1067 | "engines": { 1068 | "node": ">=0.10.0" 1069 | } 1070 | }, 1071 | "node_modules/isarray": { 1072 | "version": "1.0.0", 1073 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1074 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1075 | }, 1076 | "node_modules/isurl": { 1077 | "version": "1.0.0", 1078 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", 1079 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", 1080 | "dev": true, 1081 | "dependencies": { 1082 | "has-to-string-tag-x": "^1.2.0", 1083 | "is-object": "^1.0.1" 1084 | }, 1085 | "engines": { 1086 | "node": ">= 4" 1087 | } 1088 | }, 1089 | "node_modules/json-buffer": { 1090 | "version": "3.0.0", 1091 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 1092 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 1093 | "dev": true 1094 | }, 1095 | "node_modules/keyv": { 1096 | "version": "3.0.0", 1097 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", 1098 | "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", 1099 | "dev": true, 1100 | "dependencies": { 1101 | "json-buffer": "3.0.0" 1102 | } 1103 | }, 1104 | "node_modules/line-reader": { 1105 | "version": "0.4.0", 1106 | "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", 1107 | "integrity": "sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0=" 1108 | }, 1109 | "node_modules/lowercase-keys": { 1110 | "version": "1.0.1", 1111 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1112 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 1113 | "dev": true, 1114 | "engines": { 1115 | "node": ">=0.10.0" 1116 | } 1117 | }, 1118 | "node_modules/make-dir": { 1119 | "version": "1.3.0", 1120 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1121 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "pify": "^3.0.0" 1125 | }, 1126 | "engines": { 1127 | "node": ">=4" 1128 | } 1129 | }, 1130 | "node_modules/mime-db": { 1131 | "version": "1.43.0", 1132 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 1133 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", 1134 | "engines": { 1135 | "node": ">= 0.6" 1136 | } 1137 | }, 1138 | "node_modules/mime-types": { 1139 | "version": "2.1.26", 1140 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 1141 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 1142 | "dependencies": { 1143 | "mime-db": "1.43.0" 1144 | }, 1145 | "engines": { 1146 | "node": ">= 0.6" 1147 | } 1148 | }, 1149 | "node_modules/mimic-response": { 1150 | "version": "1.0.1", 1151 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1152 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 1153 | "dev": true, 1154 | "engines": { 1155 | "node": ">=4" 1156 | } 1157 | }, 1158 | "node_modules/minimatch": { 1159 | "version": "3.0.4", 1160 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1161 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1162 | "dependencies": { 1163 | "brace-expansion": "^1.1.7" 1164 | }, 1165 | "engines": { 1166 | "node": "*" 1167 | } 1168 | }, 1169 | "node_modules/mockery": { 1170 | "version": "1.7.0", 1171 | "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", 1172 | "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" 1173 | }, 1174 | "node_modules/normalize-url": { 1175 | "version": "2.0.1", 1176 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", 1177 | "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", 1178 | "dev": true, 1179 | "dependencies": { 1180 | "prepend-http": "^2.0.0", 1181 | "query-string": "^5.0.1", 1182 | "sort-keys": "^2.0.0" 1183 | }, 1184 | "engines": { 1185 | "node": ">=4" 1186 | } 1187 | }, 1188 | "node_modules/normalize-url/node_modules/sort-keys": { 1189 | "version": "2.0.0", 1190 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", 1191 | "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", 1192 | "dev": true, 1193 | "dependencies": { 1194 | "is-plain-obj": "^1.0.0" 1195 | }, 1196 | "engines": { 1197 | "node": ">=4" 1198 | } 1199 | }, 1200 | "node_modules/npm-conf": { 1201 | "version": "1.1.3", 1202 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 1203 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", 1204 | "dev": true, 1205 | "dependencies": { 1206 | "config-chain": "^1.1.11", 1207 | "pify": "^3.0.0" 1208 | }, 1209 | "engines": { 1210 | "node": ">=4" 1211 | } 1212 | }, 1213 | "node_modules/object-assign": { 1214 | "version": "4.1.1", 1215 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1216 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1217 | "dev": true, 1218 | "engines": { 1219 | "node": ">=0.10.0" 1220 | } 1221 | }, 1222 | "node_modules/once": { 1223 | "version": "1.4.0", 1224 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1225 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1226 | "dependencies": { 1227 | "wrappy": "1" 1228 | } 1229 | }, 1230 | "node_modules/p-cancelable": { 1231 | "version": "0.4.1", 1232 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", 1233 | "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", 1234 | "dev": true, 1235 | "engines": { 1236 | "node": ">=4" 1237 | } 1238 | }, 1239 | "node_modules/p-event": { 1240 | "version": "2.3.1", 1241 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", 1242 | "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", 1243 | "dev": true, 1244 | "dependencies": { 1245 | "p-timeout": "^2.0.1" 1246 | }, 1247 | "engines": { 1248 | "node": ">=6" 1249 | } 1250 | }, 1251 | "node_modules/p-finally": { 1252 | "version": "1.0.0", 1253 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1254 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1255 | "dev": true, 1256 | "engines": { 1257 | "node": ">=4" 1258 | } 1259 | }, 1260 | "node_modules/p-is-promise": { 1261 | "version": "1.1.0", 1262 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 1263 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", 1264 | "dev": true, 1265 | "engines": { 1266 | "node": ">=4" 1267 | } 1268 | }, 1269 | "node_modules/p-timeout": { 1270 | "version": "2.0.1", 1271 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", 1272 | "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", 1273 | "dev": true, 1274 | "dependencies": { 1275 | "p-finally": "^1.0.0" 1276 | }, 1277 | "engines": { 1278 | "node": ">=4" 1279 | } 1280 | }, 1281 | "node_modules/parse-cache-control": { 1282 | "version": "1.0.1", 1283 | "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", 1284 | "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" 1285 | }, 1286 | "node_modules/path-is-absolute": { 1287 | "version": "1.0.1", 1288 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1289 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1290 | "engines": { 1291 | "node": ">=0.10.0" 1292 | } 1293 | }, 1294 | "node_modules/path-parse": { 1295 | "version": "1.0.7", 1296 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1297 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1298 | }, 1299 | "node_modules/pend": { 1300 | "version": "1.2.0", 1301 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1302 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1303 | "dev": true 1304 | }, 1305 | "node_modules/pify": { 1306 | "version": "3.0.0", 1307 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1308 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1309 | "dev": true, 1310 | "engines": { 1311 | "node": ">=4" 1312 | } 1313 | }, 1314 | "node_modules/pinkie": { 1315 | "version": "2.0.4", 1316 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1317 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1318 | "dev": true, 1319 | "engines": { 1320 | "node": ">=0.10.0" 1321 | } 1322 | }, 1323 | "node_modules/pinkie-promise": { 1324 | "version": "2.0.1", 1325 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1326 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1327 | "dev": true, 1328 | "dependencies": { 1329 | "pinkie": "^2.0.0" 1330 | }, 1331 | "engines": { 1332 | "node": ">=0.10.0" 1333 | } 1334 | }, 1335 | "node_modules/prepend-http": { 1336 | "version": "2.0.0", 1337 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1338 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 1339 | "dev": true, 1340 | "engines": { 1341 | "node": ">=4" 1342 | } 1343 | }, 1344 | "node_modules/process-nextick-args": { 1345 | "version": "2.0.1", 1346 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1347 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1348 | }, 1349 | "node_modules/promise": { 1350 | "version": "8.0.3", 1351 | "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", 1352 | "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", 1353 | "dependencies": { 1354 | "asap": "~2.0.6" 1355 | } 1356 | }, 1357 | "node_modules/proto-list": { 1358 | "version": "1.2.4", 1359 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 1360 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", 1361 | "dev": true 1362 | }, 1363 | "node_modules/q": { 1364 | "version": "1.5.1", 1365 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1366 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 1367 | "engines": { 1368 | "node": ">=0.6.0", 1369 | "teleport": ">=0.2.0" 1370 | } 1371 | }, 1372 | "node_modules/qs": { 1373 | "version": "6.9.1", 1374 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", 1375 | "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==", 1376 | "engines": { 1377 | "node": ">=0.6" 1378 | }, 1379 | "funding": { 1380 | "url": "https://github.com/sponsors/ljharb" 1381 | } 1382 | }, 1383 | "node_modules/query-string": { 1384 | "version": "5.1.1", 1385 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 1386 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 1387 | "dev": true, 1388 | "dependencies": { 1389 | "decode-uri-component": "^0.2.0", 1390 | "object-assign": "^4.1.0", 1391 | "strict-uri-encode": "^1.0.0" 1392 | }, 1393 | "engines": { 1394 | "node": ">=0.10.0" 1395 | } 1396 | }, 1397 | "node_modules/readable-stream": { 1398 | "version": "2.3.7", 1399 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1400 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1401 | "dependencies": { 1402 | "core-util-is": "~1.0.0", 1403 | "inherits": "~2.0.3", 1404 | "isarray": "~1.0.0", 1405 | "process-nextick-args": "~2.0.0", 1406 | "safe-buffer": "~5.1.1", 1407 | "string_decoder": "~1.1.1", 1408 | "util-deprecate": "~1.0.1" 1409 | } 1410 | }, 1411 | "node_modules/readable-stream/node_modules/safe-buffer": { 1412 | "version": "5.1.2", 1413 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1414 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1415 | }, 1416 | "node_modules/rechoir": { 1417 | "version": "0.6.2", 1418 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1419 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1420 | "dependencies": { 1421 | "resolve": "^1.1.6" 1422 | }, 1423 | "engines": { 1424 | "node": ">= 0.10" 1425 | } 1426 | }, 1427 | "node_modules/resolve": { 1428 | "version": "1.21.0", 1429 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", 1430 | "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", 1431 | "dependencies": { 1432 | "is-core-module": "^2.8.0", 1433 | "path-parse": "^1.0.7", 1434 | "supports-preserve-symlinks-flag": "^1.0.0" 1435 | }, 1436 | "bin": { 1437 | "resolve": "bin/resolve" 1438 | }, 1439 | "funding": { 1440 | "url": "https://github.com/sponsors/ljharb" 1441 | } 1442 | }, 1443 | "node_modules/responselike": { 1444 | "version": "1.0.2", 1445 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1446 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1447 | "dev": true, 1448 | "dependencies": { 1449 | "lowercase-keys": "^1.0.0" 1450 | } 1451 | }, 1452 | "node_modules/safe-buffer": { 1453 | "version": "5.2.0", 1454 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 1455 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 1456 | "dev": true 1457 | }, 1458 | "node_modules/seek-bzip": { 1459 | "version": "1.0.5", 1460 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", 1461 | "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", 1462 | "dev": true, 1463 | "dependencies": { 1464 | "commander": "~2.8.1" 1465 | }, 1466 | "bin": { 1467 | "seek-bunzip": "bin/seek-bunzip", 1468 | "seek-table": "bin/seek-bzip-table" 1469 | } 1470 | }, 1471 | "node_modules/semver": { 1472 | "version": "5.7.1", 1473 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1474 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1475 | "bin": { 1476 | "semver": "bin/semver" 1477 | } 1478 | }, 1479 | "node_modules/shelljs": { 1480 | "version": "0.8.5", 1481 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 1482 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 1483 | "dependencies": { 1484 | "glob": "^7.0.0", 1485 | "interpret": "^1.0.0", 1486 | "rechoir": "^0.6.2" 1487 | }, 1488 | "bin": { 1489 | "shjs": "bin/shjs" 1490 | }, 1491 | "engines": { 1492 | "node": ">=4" 1493 | } 1494 | }, 1495 | "node_modules/shimmer": { 1496 | "version": "1.2.1", 1497 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", 1498 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" 1499 | }, 1500 | "node_modules/sort-keys": { 1501 | "version": "1.1.2", 1502 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 1503 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 1504 | "dev": true, 1505 | "dependencies": { 1506 | "is-plain-obj": "^1.0.0" 1507 | }, 1508 | "engines": { 1509 | "node": ">=0.10.0" 1510 | } 1511 | }, 1512 | "node_modules/sort-keys-length": { 1513 | "version": "1.0.1", 1514 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", 1515 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", 1516 | "dev": true, 1517 | "dependencies": { 1518 | "sort-keys": "^1.0.0" 1519 | }, 1520 | "engines": { 1521 | "node": ">=0.10.0" 1522 | } 1523 | }, 1524 | "node_modules/stack-chain": { 1525 | "version": "1.3.7", 1526 | "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", 1527 | "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" 1528 | }, 1529 | "node_modules/strict-uri-encode": { 1530 | "version": "1.1.0", 1531 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 1532 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", 1533 | "dev": true, 1534 | "engines": { 1535 | "node": ">=0.10.0" 1536 | } 1537 | }, 1538 | "node_modules/string_decoder": { 1539 | "version": "1.1.1", 1540 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1541 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1542 | "dependencies": { 1543 | "safe-buffer": "~5.1.0" 1544 | } 1545 | }, 1546 | "node_modules/string_decoder/node_modules/safe-buffer": { 1547 | "version": "5.1.2", 1548 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1549 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1550 | }, 1551 | "node_modules/strip-dirs": { 1552 | "version": "2.1.0", 1553 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 1554 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 1555 | "dev": true, 1556 | "dependencies": { 1557 | "is-natural-number": "^4.0.1" 1558 | } 1559 | }, 1560 | "node_modules/strip-outer": { 1561 | "version": "1.0.1", 1562 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 1563 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 1564 | "dev": true, 1565 | "dependencies": { 1566 | "escape-string-regexp": "^1.0.2" 1567 | }, 1568 | "engines": { 1569 | "node": ">=0.10.0" 1570 | } 1571 | }, 1572 | "node_modules/supports-preserve-symlinks-flag": { 1573 | "version": "1.0.0", 1574 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1575 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1576 | "engines": { 1577 | "node": ">= 0.4" 1578 | }, 1579 | "funding": { 1580 | "url": "https://github.com/sponsors/ljharb" 1581 | } 1582 | }, 1583 | "node_modules/sync-request": { 1584 | "version": "6.1.0", 1585 | "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", 1586 | "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", 1587 | "dependencies": { 1588 | "http-response-object": "^3.0.1", 1589 | "sync-rpc": "^1.2.1", 1590 | "then-request": "^6.0.0" 1591 | }, 1592 | "engines": { 1593 | "node": ">=8.0.0" 1594 | } 1595 | }, 1596 | "node_modules/sync-rpc": { 1597 | "version": "1.3.6", 1598 | "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", 1599 | "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", 1600 | "dependencies": { 1601 | "get-port": "^3.1.0" 1602 | } 1603 | }, 1604 | "node_modules/tar-stream": { 1605 | "version": "1.6.2", 1606 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 1607 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 1608 | "dev": true, 1609 | "dependencies": { 1610 | "bl": "^1.0.0", 1611 | "buffer-alloc": "^1.2.0", 1612 | "end-of-stream": "^1.0.0", 1613 | "fs-constants": "^1.0.0", 1614 | "readable-stream": "^2.3.0", 1615 | "to-buffer": "^1.1.1", 1616 | "xtend": "^4.0.0" 1617 | }, 1618 | "engines": { 1619 | "node": ">= 0.8.0" 1620 | } 1621 | }, 1622 | "node_modules/then-request": { 1623 | "version": "6.0.2", 1624 | "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", 1625 | "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", 1626 | "dependencies": { 1627 | "@types/concat-stream": "^1.6.0", 1628 | "@types/form-data": "0.0.33", 1629 | "@types/node": "^8.0.0", 1630 | "@types/qs": "^6.2.31", 1631 | "caseless": "~0.12.0", 1632 | "concat-stream": "^1.6.0", 1633 | "form-data": "^2.2.0", 1634 | "http-basic": "^8.1.1", 1635 | "http-response-object": "^3.0.1", 1636 | "promise": "^8.0.0", 1637 | "qs": "^6.4.0" 1638 | }, 1639 | "engines": { 1640 | "node": ">=6.0.0" 1641 | } 1642 | }, 1643 | "node_modules/then-request/node_modules/@types/node": { 1644 | "version": "8.10.59", 1645 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", 1646 | "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==" 1647 | }, 1648 | "node_modules/through": { 1649 | "version": "2.3.8", 1650 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1651 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1652 | "dev": true 1653 | }, 1654 | "node_modules/timed-out": { 1655 | "version": "4.0.1", 1656 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 1657 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 1658 | "dev": true, 1659 | "engines": { 1660 | "node": ">=0.10.0" 1661 | } 1662 | }, 1663 | "node_modules/to-buffer": { 1664 | "version": "1.1.1", 1665 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 1666 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", 1667 | "dev": true 1668 | }, 1669 | "node_modules/trim-repeated": { 1670 | "version": "1.0.0", 1671 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 1672 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 1673 | "dev": true, 1674 | "dependencies": { 1675 | "escape-string-regexp": "^1.0.2" 1676 | }, 1677 | "engines": { 1678 | "node": ">=0.10.0" 1679 | } 1680 | }, 1681 | "node_modules/tunnel-agent": { 1682 | "version": "0.6.0", 1683 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1684 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1685 | "dev": true, 1686 | "dependencies": { 1687 | "safe-buffer": "^5.0.1" 1688 | }, 1689 | "engines": { 1690 | "node": "*" 1691 | } 1692 | }, 1693 | "node_modules/typedarray": { 1694 | "version": "0.0.6", 1695 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1696 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1697 | }, 1698 | "node_modules/unbzip2-stream": { 1699 | "version": "1.3.3", 1700 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", 1701 | "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", 1702 | "dev": true, 1703 | "dependencies": { 1704 | "buffer": "^5.2.1", 1705 | "through": "^2.3.8" 1706 | } 1707 | }, 1708 | "node_modules/url-parse-lax": { 1709 | "version": "3.0.0", 1710 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1711 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1712 | "dev": true, 1713 | "dependencies": { 1714 | "prepend-http": "^2.0.0" 1715 | }, 1716 | "engines": { 1717 | "node": ">=4" 1718 | } 1719 | }, 1720 | "node_modules/url-to-options": { 1721 | "version": "1.0.1", 1722 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", 1723 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", 1724 | "dev": true, 1725 | "engines": { 1726 | "node": ">= 4" 1727 | } 1728 | }, 1729 | "node_modules/util-deprecate": { 1730 | "version": "1.0.2", 1731 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1732 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1733 | }, 1734 | "node_modules/uuid": { 1735 | "version": "3.3.3", 1736 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1737 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", 1738 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1739 | "bin": { 1740 | "uuid": "bin/uuid" 1741 | } 1742 | }, 1743 | "node_modules/wrappy": { 1744 | "version": "1.0.2", 1745 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1746 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1747 | }, 1748 | "node_modules/xtend": { 1749 | "version": "4.0.2", 1750 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1751 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1752 | "dev": true, 1753 | "engines": { 1754 | "node": ">=0.4" 1755 | } 1756 | }, 1757 | "node_modules/yauzl": { 1758 | "version": "2.10.0", 1759 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1760 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1761 | "dev": true, 1762 | "dependencies": { 1763 | "buffer-crc32": "~0.2.3", 1764 | "fd-slicer": "~1.1.0" 1765 | } 1766 | } 1767 | }, 1768 | "dependencies": { 1769 | "@actions/core": { 1770 | "version": "1.2.6", 1771 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", 1772 | "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" 1773 | }, 1774 | "@sindresorhus/is": { 1775 | "version": "0.7.0", 1776 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", 1777 | "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", 1778 | "dev": true 1779 | }, 1780 | "@types/adm-zip": { 1781 | "version": "0.4.32", 1782 | "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.32.tgz", 1783 | "integrity": "sha512-hv1O7ySn+XvP5OeDQcJFWwVb2v+GFGO1A9aMTQ5B/bzxb7WW21O8iRhVdsKKr8QwuiagzGmPP+gsUAYZ6bRddQ==", 1784 | "requires": { 1785 | "@types/node": "*" 1786 | } 1787 | }, 1788 | "@types/concat-stream": { 1789 | "version": "1.6.0", 1790 | "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", 1791 | "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", 1792 | "requires": { 1793 | "@types/node": "*" 1794 | } 1795 | }, 1796 | "@types/decompress": { 1797 | "version": "4.2.3", 1798 | "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.3.tgz", 1799 | "integrity": "sha512-W24e3Ycz1UZPgr1ZEDHlK4XnvOr+CpJH3qNsFeqXwwlW/9END9gxn3oJSsp7gYdiQxrXUHwUUd3xuzVz37MrZQ==", 1800 | "dev": true, 1801 | "requires": { 1802 | "@types/node": "*" 1803 | } 1804 | }, 1805 | "@types/download": { 1806 | "version": "6.2.4", 1807 | "resolved": "https://registry.npmjs.org/@types/download/-/download-6.2.4.tgz", 1808 | "integrity": "sha512-Lo5dy3ai6LNnbL663sgdzqL1eib11u1yKH6w3v3IXEOO4kRfQpMn1qWUTaumcHLACjFp1RcBx9tUXEvJoR3vcA==", 1809 | "dev": true, 1810 | "requires": { 1811 | "@types/decompress": "*", 1812 | "@types/got": "^8", 1813 | "@types/node": "*" 1814 | } 1815 | }, 1816 | "@types/events": { 1817 | "version": "3.0.0", 1818 | "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", 1819 | "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", 1820 | "dev": true 1821 | }, 1822 | "@types/form-data": { 1823 | "version": "0.0.33", 1824 | "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", 1825 | "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", 1826 | "requires": { 1827 | "@types/node": "*" 1828 | } 1829 | }, 1830 | "@types/glob": { 1831 | "version": "7.1.1", 1832 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", 1833 | "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", 1834 | "dev": true, 1835 | "requires": { 1836 | "@types/events": "*", 1837 | "@types/minimatch": "*", 1838 | "@types/node": "*" 1839 | } 1840 | }, 1841 | "@types/got": { 1842 | "version": "8.3.5", 1843 | "resolved": "https://registry.npmjs.org/@types/got/-/got-8.3.5.tgz", 1844 | "integrity": "sha512-AaXSrIF99SjjtPVNmCmYb388HML+PKEJb/xmj4SbL2ZO0hHuETZZzyDIKfOqaEoAHZEuX4sC+FRFrHYJoIby6A==", 1845 | "dev": true, 1846 | "requires": { 1847 | "@types/node": "*" 1848 | } 1849 | }, 1850 | "@types/line-reader": { 1851 | "version": "0.0.28", 1852 | "resolved": "https://registry.npmjs.org/@types/line-reader/-/line-reader-0.0.28.tgz", 1853 | "integrity": "sha1-y4/yVoKbmiN/zzG8Obwvt3HP1MQ=" 1854 | }, 1855 | "@types/minimatch": { 1856 | "version": "3.0.3", 1857 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 1858 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", 1859 | "dev": true 1860 | }, 1861 | "@types/mocha": { 1862 | "version": "5.2.7", 1863 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", 1864 | "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", 1865 | "dev": true 1866 | }, 1867 | "@types/node": { 1868 | "version": "13.1.4", 1869 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.4.tgz", 1870 | "integrity": "sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA==" 1871 | }, 1872 | "@types/q": { 1873 | "version": "1.5.2", 1874 | "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", 1875 | "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", 1876 | "dev": true 1877 | }, 1878 | "@types/qs": { 1879 | "version": "6.9.0", 1880 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.0.tgz", 1881 | "integrity": "sha512-c4zji5CjWv1tJxIZkz1oUtGcdOlsH3aza28Nqmm+uNDWBRHoMsjooBEN4czZp1V3iXPihE/VRUOBqg+4Xq0W4g==" 1882 | }, 1883 | "@types/shelljs": { 1884 | "version": "0.8.6", 1885 | "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.6.tgz", 1886 | "integrity": "sha512-svx2eQS268awlppL/P8wgDLBrsDXdKznABHJcuqXyWpSKJgE1s2clXlBvAwbO/lehTmG06NtEWJRkAk4tAgenA==", 1887 | "dev": true, 1888 | "requires": { 1889 | "@types/glob": "*", 1890 | "@types/node": "*" 1891 | } 1892 | }, 1893 | "adm-zip": { 1894 | "version": "0.4.13", 1895 | "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", 1896 | "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==" 1897 | }, 1898 | "applicationinsights": { 1899 | "version": "1.6.0", 1900 | "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.6.0.tgz", 1901 | "integrity": "sha512-bTK91ZMPAh3UrN0q3Bq0ePn7RHmURbiPztsNPMpsURPOipNqLKgZlQ6Vg3kjwHiqehrCN/24753ED0nritvr5g==", 1902 | "requires": { 1903 | "cls-hooked": "^4.2.2", 1904 | "continuation-local-storage": "^3.2.1", 1905 | "diagnostic-channel": "0.2.0", 1906 | "diagnostic-channel-publishers": "^0.3.3" 1907 | } 1908 | }, 1909 | "archive-type": { 1910 | "version": "4.0.0", 1911 | "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", 1912 | "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", 1913 | "dev": true, 1914 | "requires": { 1915 | "file-type": "^4.2.0" 1916 | }, 1917 | "dependencies": { 1918 | "file-type": { 1919 | "version": "4.4.0", 1920 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", 1921 | "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", 1922 | "dev": true 1923 | } 1924 | } 1925 | }, 1926 | "asap": { 1927 | "version": "2.0.6", 1928 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 1929 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 1930 | }, 1931 | "async-hook-jl": { 1932 | "version": "1.7.6", 1933 | "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", 1934 | "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", 1935 | "requires": { 1936 | "stack-chain": "^1.3.7" 1937 | } 1938 | }, 1939 | "async-listener": { 1940 | "version": "0.6.10", 1941 | "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", 1942 | "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", 1943 | "requires": { 1944 | "semver": "^5.3.0", 1945 | "shimmer": "^1.1.0" 1946 | } 1947 | }, 1948 | "asynckit": { 1949 | "version": "0.4.0", 1950 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1951 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 1952 | }, 1953 | "azure-pipelines-task-lib": { 1954 | "version": "3.2.0", 1955 | "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.2.0.tgz", 1956 | "integrity": "sha512-7mO6/B1HwGISpP8z0UiNw/O9mu34lQpAm7jlU/jTNdwfL4RCsHJkUFD86zN+8wVFVgwBNskBaZtem4fmCxdklQ==", 1957 | "requires": { 1958 | "minimatch": "3.0.4", 1959 | "mockery": "^1.7.0", 1960 | "q": "^1.5.1", 1961 | "semver": "^5.1.0", 1962 | "shelljs": "^0.8.5", 1963 | "sync-request": "6.1.0", 1964 | "uuid": "^3.0.1" 1965 | } 1966 | }, 1967 | "balanced-match": { 1968 | "version": "1.0.0", 1969 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 1970 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 1971 | }, 1972 | "base64-js": { 1973 | "version": "1.3.1", 1974 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 1975 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 1976 | "dev": true 1977 | }, 1978 | "bl": { 1979 | "version": "1.2.3", 1980 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 1981 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 1982 | "dev": true, 1983 | "requires": { 1984 | "readable-stream": "^2.3.5", 1985 | "safe-buffer": "^5.1.1" 1986 | } 1987 | }, 1988 | "brace-expansion": { 1989 | "version": "1.1.11", 1990 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1991 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1992 | "requires": { 1993 | "balanced-match": "^1.0.0", 1994 | "concat-map": "0.0.1" 1995 | } 1996 | }, 1997 | "buffer": { 1998 | "version": "5.4.3", 1999 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", 2000 | "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", 2001 | "dev": true, 2002 | "requires": { 2003 | "base64-js": "^1.0.2", 2004 | "ieee754": "^1.1.4" 2005 | } 2006 | }, 2007 | "buffer-alloc": { 2008 | "version": "1.2.0", 2009 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 2010 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 2011 | "dev": true, 2012 | "requires": { 2013 | "buffer-alloc-unsafe": "^1.1.0", 2014 | "buffer-fill": "^1.0.0" 2015 | } 2016 | }, 2017 | "buffer-alloc-unsafe": { 2018 | "version": "1.1.0", 2019 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 2020 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 2021 | "dev": true 2022 | }, 2023 | "buffer-crc32": { 2024 | "version": "0.2.13", 2025 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 2026 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 2027 | "dev": true 2028 | }, 2029 | "buffer-fill": { 2030 | "version": "1.0.0", 2031 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 2032 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 2033 | "dev": true 2034 | }, 2035 | "buffer-from": { 2036 | "version": "1.1.1", 2037 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 2038 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 2039 | }, 2040 | "cacheable-request": { 2041 | "version": "2.1.4", 2042 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", 2043 | "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", 2044 | "dev": true, 2045 | "requires": { 2046 | "clone-response": "1.0.2", 2047 | "get-stream": "3.0.0", 2048 | "http-cache-semantics": "3.8.1", 2049 | "keyv": "3.0.0", 2050 | "lowercase-keys": "1.0.0", 2051 | "normalize-url": "2.0.1", 2052 | "responselike": "1.0.2" 2053 | }, 2054 | "dependencies": { 2055 | "lowercase-keys": { 2056 | "version": "1.0.0", 2057 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 2058 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", 2059 | "dev": true 2060 | } 2061 | } 2062 | }, 2063 | "caseless": { 2064 | "version": "0.12.0", 2065 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 2066 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 2067 | }, 2068 | "caw": { 2069 | "version": "2.0.1", 2070 | "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", 2071 | "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", 2072 | "dev": true, 2073 | "requires": { 2074 | "get-proxy": "^2.0.0", 2075 | "isurl": "^1.0.0-alpha5", 2076 | "tunnel-agent": "^0.6.0", 2077 | "url-to-options": "^1.0.1" 2078 | } 2079 | }, 2080 | "clone-response": { 2081 | "version": "1.0.2", 2082 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 2083 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 2084 | "dev": true, 2085 | "requires": { 2086 | "mimic-response": "^1.0.0" 2087 | } 2088 | }, 2089 | "cls-hooked": { 2090 | "version": "4.2.2", 2091 | "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", 2092 | "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", 2093 | "requires": { 2094 | "async-hook-jl": "^1.7.6", 2095 | "emitter-listener": "^1.0.1", 2096 | "semver": "^5.4.1" 2097 | } 2098 | }, 2099 | "combined-stream": { 2100 | "version": "1.0.8", 2101 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 2102 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 2103 | "requires": { 2104 | "delayed-stream": "~1.0.0" 2105 | } 2106 | }, 2107 | "commander": { 2108 | "version": "2.8.1", 2109 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 2110 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 2111 | "dev": true, 2112 | "requires": { 2113 | "graceful-readlink": ">= 1.0.0" 2114 | } 2115 | }, 2116 | "concat-map": { 2117 | "version": "0.0.1", 2118 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2119 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 2120 | }, 2121 | "concat-stream": { 2122 | "version": "1.6.2", 2123 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 2124 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 2125 | "requires": { 2126 | "buffer-from": "^1.0.0", 2127 | "inherits": "^2.0.3", 2128 | "readable-stream": "^2.2.2", 2129 | "typedarray": "^0.0.6" 2130 | } 2131 | }, 2132 | "config-chain": { 2133 | "version": "1.1.12", 2134 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", 2135 | "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", 2136 | "dev": true, 2137 | "requires": { 2138 | "ini": "^1.3.4", 2139 | "proto-list": "~1.2.1" 2140 | } 2141 | }, 2142 | "content-disposition": { 2143 | "version": "0.5.3", 2144 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 2145 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 2146 | "dev": true, 2147 | "requires": { 2148 | "safe-buffer": "5.1.2" 2149 | }, 2150 | "dependencies": { 2151 | "safe-buffer": { 2152 | "version": "5.1.2", 2153 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2154 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2155 | "dev": true 2156 | } 2157 | } 2158 | }, 2159 | "continuation-local-storage": { 2160 | "version": "3.2.1", 2161 | "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", 2162 | "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", 2163 | "requires": { 2164 | "async-listener": "^0.6.0", 2165 | "emitter-listener": "^1.1.1" 2166 | } 2167 | }, 2168 | "core-util-is": { 2169 | "version": "1.0.2", 2170 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 2171 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 2172 | }, 2173 | "decode-uri-component": { 2174 | "version": "0.2.0", 2175 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 2176 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 2177 | "dev": true 2178 | }, 2179 | "decompress": { 2180 | "version": "4.2.1", 2181 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", 2182 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", 2183 | "dev": true, 2184 | "requires": { 2185 | "decompress-tar": "^4.0.0", 2186 | "decompress-tarbz2": "^4.0.0", 2187 | "decompress-targz": "^4.0.0", 2188 | "decompress-unzip": "^4.0.1", 2189 | "graceful-fs": "^4.1.10", 2190 | "make-dir": "^1.0.0", 2191 | "pify": "^2.3.0", 2192 | "strip-dirs": "^2.0.0" 2193 | }, 2194 | "dependencies": { 2195 | "pify": { 2196 | "version": "2.3.0", 2197 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2198 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2199 | "dev": true 2200 | } 2201 | } 2202 | }, 2203 | "decompress-response": { 2204 | "version": "3.3.0", 2205 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 2206 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 2207 | "dev": true, 2208 | "requires": { 2209 | "mimic-response": "^1.0.0" 2210 | } 2211 | }, 2212 | "decompress-tar": { 2213 | "version": "4.1.1", 2214 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 2215 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 2216 | "dev": true, 2217 | "requires": { 2218 | "file-type": "^5.2.0", 2219 | "is-stream": "^1.1.0", 2220 | "tar-stream": "^1.5.2" 2221 | }, 2222 | "dependencies": { 2223 | "file-type": { 2224 | "version": "5.2.0", 2225 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 2226 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", 2227 | "dev": true 2228 | } 2229 | } 2230 | }, 2231 | "decompress-tarbz2": { 2232 | "version": "4.1.1", 2233 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 2234 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 2235 | "dev": true, 2236 | "requires": { 2237 | "decompress-tar": "^4.1.0", 2238 | "file-type": "^6.1.0", 2239 | "is-stream": "^1.1.0", 2240 | "seek-bzip": "^1.0.5", 2241 | "unbzip2-stream": "^1.0.9" 2242 | }, 2243 | "dependencies": { 2244 | "file-type": { 2245 | "version": "6.2.0", 2246 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 2247 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", 2248 | "dev": true 2249 | } 2250 | } 2251 | }, 2252 | "decompress-targz": { 2253 | "version": "4.1.1", 2254 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 2255 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 2256 | "dev": true, 2257 | "requires": { 2258 | "decompress-tar": "^4.1.1", 2259 | "file-type": "^5.2.0", 2260 | "is-stream": "^1.1.0" 2261 | }, 2262 | "dependencies": { 2263 | "file-type": { 2264 | "version": "5.2.0", 2265 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 2266 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", 2267 | "dev": true 2268 | } 2269 | } 2270 | }, 2271 | "decompress-unzip": { 2272 | "version": "4.0.1", 2273 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 2274 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", 2275 | "dev": true, 2276 | "requires": { 2277 | "file-type": "^3.8.0", 2278 | "get-stream": "^2.2.0", 2279 | "pify": "^2.3.0", 2280 | "yauzl": "^2.4.2" 2281 | }, 2282 | "dependencies": { 2283 | "file-type": { 2284 | "version": "3.9.0", 2285 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 2286 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", 2287 | "dev": true 2288 | }, 2289 | "get-stream": { 2290 | "version": "2.3.1", 2291 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 2292 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", 2293 | "dev": true, 2294 | "requires": { 2295 | "object-assign": "^4.0.1", 2296 | "pinkie-promise": "^2.0.0" 2297 | } 2298 | }, 2299 | "pify": { 2300 | "version": "2.3.0", 2301 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2302 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2303 | "dev": true 2304 | } 2305 | } 2306 | }, 2307 | "delayed-stream": { 2308 | "version": "1.0.0", 2309 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 2310 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 2311 | }, 2312 | "diagnostic-channel": { 2313 | "version": "0.2.0", 2314 | "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", 2315 | "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", 2316 | "requires": { 2317 | "semver": "^5.3.0" 2318 | } 2319 | }, 2320 | "diagnostic-channel-publishers": { 2321 | "version": "0.3.3", 2322 | "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.3.tgz", 2323 | "integrity": "sha512-qIocRYU5TrGUkBlDDxaziAK1+squ8Yf2Ls4HldL3xxb/jzmWO2Enux7CvevNKYmF2kDXZ9HiRqwjPsjk8L+i2Q==", 2324 | "requires": {} 2325 | }, 2326 | "download": { 2327 | "version": "7.1.0", 2328 | "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", 2329 | "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", 2330 | "dev": true, 2331 | "requires": { 2332 | "archive-type": "^4.0.0", 2333 | "caw": "^2.0.1", 2334 | "content-disposition": "^0.5.2", 2335 | "decompress": "^4.2.0", 2336 | "ext-name": "^5.0.0", 2337 | "file-type": "^8.1.0", 2338 | "filenamify": "^2.0.0", 2339 | "get-stream": "^3.0.0", 2340 | "got": "^8.3.1", 2341 | "make-dir": "^1.2.0", 2342 | "p-event": "^2.1.0", 2343 | "pify": "^3.0.0" 2344 | } 2345 | }, 2346 | "duplexer3": { 2347 | "version": "0.1.4", 2348 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 2349 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 2350 | "dev": true 2351 | }, 2352 | "emitter-listener": { 2353 | "version": "1.1.2", 2354 | "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", 2355 | "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", 2356 | "requires": { 2357 | "shimmer": "^1.2.0" 2358 | } 2359 | }, 2360 | "end-of-stream": { 2361 | "version": "1.4.4", 2362 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 2363 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 2364 | "dev": true, 2365 | "requires": { 2366 | "once": "^1.4.0" 2367 | } 2368 | }, 2369 | "escape-string-regexp": { 2370 | "version": "1.0.5", 2371 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2372 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 2373 | "dev": true 2374 | }, 2375 | "ext-list": { 2376 | "version": "2.2.2", 2377 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 2378 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", 2379 | "dev": true, 2380 | "requires": { 2381 | "mime-db": "^1.28.0" 2382 | } 2383 | }, 2384 | "ext-name": { 2385 | "version": "5.0.0", 2386 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", 2387 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", 2388 | "dev": true, 2389 | "requires": { 2390 | "ext-list": "^2.0.0", 2391 | "sort-keys-length": "^1.0.0" 2392 | } 2393 | }, 2394 | "fd-slicer": { 2395 | "version": "1.1.0", 2396 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 2397 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 2398 | "dev": true, 2399 | "requires": { 2400 | "pend": "~1.2.0" 2401 | } 2402 | }, 2403 | "file-type": { 2404 | "version": "8.1.0", 2405 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", 2406 | "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", 2407 | "dev": true 2408 | }, 2409 | "filename-reserved-regex": { 2410 | "version": "2.0.0", 2411 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 2412 | "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", 2413 | "dev": true 2414 | }, 2415 | "filenamify": { 2416 | "version": "2.1.0", 2417 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", 2418 | "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", 2419 | "dev": true, 2420 | "requires": { 2421 | "filename-reserved-regex": "^2.0.0", 2422 | "strip-outer": "^1.0.0", 2423 | "trim-repeated": "^1.0.0" 2424 | } 2425 | }, 2426 | "form-data": { 2427 | "version": "2.5.1", 2428 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 2429 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 2430 | "requires": { 2431 | "asynckit": "^0.4.0", 2432 | "combined-stream": "^1.0.6", 2433 | "mime-types": "^2.1.12" 2434 | } 2435 | }, 2436 | "from2": { 2437 | "version": "2.3.0", 2438 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 2439 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 2440 | "dev": true, 2441 | "requires": { 2442 | "inherits": "^2.0.1", 2443 | "readable-stream": "^2.0.0" 2444 | } 2445 | }, 2446 | "fs-constants": { 2447 | "version": "1.0.0", 2448 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 2449 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 2450 | "dev": true 2451 | }, 2452 | "fs.realpath": { 2453 | "version": "1.0.0", 2454 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2455 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 2456 | }, 2457 | "function-bind": { 2458 | "version": "1.1.1", 2459 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2460 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 2461 | }, 2462 | "get-port": { 2463 | "version": "3.2.0", 2464 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 2465 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" 2466 | }, 2467 | "get-proxy": { 2468 | "version": "2.1.0", 2469 | "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", 2470 | "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", 2471 | "dev": true, 2472 | "requires": { 2473 | "npm-conf": "^1.1.0" 2474 | } 2475 | }, 2476 | "get-stream": { 2477 | "version": "3.0.0", 2478 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 2479 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 2480 | "dev": true 2481 | }, 2482 | "glob": { 2483 | "version": "7.2.0", 2484 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2485 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2486 | "requires": { 2487 | "fs.realpath": "^1.0.0", 2488 | "inflight": "^1.0.4", 2489 | "inherits": "2", 2490 | "minimatch": "^3.0.4", 2491 | "once": "^1.3.0", 2492 | "path-is-absolute": "^1.0.0" 2493 | } 2494 | }, 2495 | "got": { 2496 | "version": "8.3.2", 2497 | "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", 2498 | "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", 2499 | "dev": true, 2500 | "requires": { 2501 | "@sindresorhus/is": "^0.7.0", 2502 | "cacheable-request": "^2.1.1", 2503 | "decompress-response": "^3.3.0", 2504 | "duplexer3": "^0.1.4", 2505 | "get-stream": "^3.0.0", 2506 | "into-stream": "^3.1.0", 2507 | "is-retry-allowed": "^1.1.0", 2508 | "isurl": "^1.0.0-alpha5", 2509 | "lowercase-keys": "^1.0.0", 2510 | "mimic-response": "^1.0.0", 2511 | "p-cancelable": "^0.4.0", 2512 | "p-timeout": "^2.0.1", 2513 | "pify": "^3.0.0", 2514 | "safe-buffer": "^5.1.1", 2515 | "timed-out": "^4.0.1", 2516 | "url-parse-lax": "^3.0.0", 2517 | "url-to-options": "^1.0.1" 2518 | } 2519 | }, 2520 | "graceful-fs": { 2521 | "version": "4.2.3", 2522 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 2523 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 2524 | "dev": true 2525 | }, 2526 | "graceful-readlink": { 2527 | "version": "1.0.1", 2528 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 2529 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 2530 | "dev": true 2531 | }, 2532 | "has": { 2533 | "version": "1.0.3", 2534 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2535 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2536 | "requires": { 2537 | "function-bind": "^1.1.1" 2538 | } 2539 | }, 2540 | "has-symbol-support-x": { 2541 | "version": "1.4.2", 2542 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", 2543 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", 2544 | "dev": true 2545 | }, 2546 | "has-to-string-tag-x": { 2547 | "version": "1.4.1", 2548 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", 2549 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", 2550 | "dev": true, 2551 | "requires": { 2552 | "has-symbol-support-x": "^1.4.1" 2553 | } 2554 | }, 2555 | "http-basic": { 2556 | "version": "8.1.3", 2557 | "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", 2558 | "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", 2559 | "requires": { 2560 | "caseless": "^0.12.0", 2561 | "concat-stream": "^1.6.2", 2562 | "http-response-object": "^3.0.1", 2563 | "parse-cache-control": "^1.0.1" 2564 | } 2565 | }, 2566 | "http-cache-semantics": { 2567 | "version": "3.8.1", 2568 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 2569 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", 2570 | "dev": true 2571 | }, 2572 | "http-response-object": { 2573 | "version": "3.0.2", 2574 | "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", 2575 | "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", 2576 | "requires": { 2577 | "@types/node": "^10.0.3" 2578 | }, 2579 | "dependencies": { 2580 | "@types/node": { 2581 | "version": "10.17.13", 2582 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", 2583 | "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==" 2584 | } 2585 | } 2586 | }, 2587 | "ieee754": { 2588 | "version": "1.1.13", 2589 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 2590 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 2591 | "dev": true 2592 | }, 2593 | "inflight": { 2594 | "version": "1.0.6", 2595 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2596 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2597 | "requires": { 2598 | "once": "^1.3.0", 2599 | "wrappy": "1" 2600 | } 2601 | }, 2602 | "inherits": { 2603 | "version": "2.0.4", 2604 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2605 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2606 | }, 2607 | "ini": { 2608 | "version": "1.3.8", 2609 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 2610 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 2611 | "dev": true 2612 | }, 2613 | "interpret": { 2614 | "version": "1.4.0", 2615 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 2616 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" 2617 | }, 2618 | "into-stream": { 2619 | "version": "3.1.0", 2620 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 2621 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 2622 | "dev": true, 2623 | "requires": { 2624 | "from2": "^2.1.1", 2625 | "p-is-promise": "^1.1.0" 2626 | } 2627 | }, 2628 | "is-core-module": { 2629 | "version": "2.8.1", 2630 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 2631 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 2632 | "requires": { 2633 | "has": "^1.0.3" 2634 | } 2635 | }, 2636 | "is-natural-number": { 2637 | "version": "4.0.1", 2638 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 2639 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", 2640 | "dev": true 2641 | }, 2642 | "is-object": { 2643 | "version": "1.0.1", 2644 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", 2645 | "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", 2646 | "dev": true 2647 | }, 2648 | "is-plain-obj": { 2649 | "version": "1.1.0", 2650 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 2651 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 2652 | "dev": true 2653 | }, 2654 | "is-retry-allowed": { 2655 | "version": "1.2.0", 2656 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 2657 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", 2658 | "dev": true 2659 | }, 2660 | "is-stream": { 2661 | "version": "1.1.0", 2662 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 2663 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 2664 | "dev": true 2665 | }, 2666 | "isarray": { 2667 | "version": "1.0.0", 2668 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2669 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2670 | }, 2671 | "isurl": { 2672 | "version": "1.0.0", 2673 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", 2674 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", 2675 | "dev": true, 2676 | "requires": { 2677 | "has-to-string-tag-x": "^1.2.0", 2678 | "is-object": "^1.0.1" 2679 | } 2680 | }, 2681 | "json-buffer": { 2682 | "version": "3.0.0", 2683 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 2684 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 2685 | "dev": true 2686 | }, 2687 | "keyv": { 2688 | "version": "3.0.0", 2689 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", 2690 | "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", 2691 | "dev": true, 2692 | "requires": { 2693 | "json-buffer": "3.0.0" 2694 | } 2695 | }, 2696 | "line-reader": { 2697 | "version": "0.4.0", 2698 | "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", 2699 | "integrity": "sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0=" 2700 | }, 2701 | "lowercase-keys": { 2702 | "version": "1.0.1", 2703 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 2704 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 2705 | "dev": true 2706 | }, 2707 | "make-dir": { 2708 | "version": "1.3.0", 2709 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 2710 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 2711 | "dev": true, 2712 | "requires": { 2713 | "pify": "^3.0.0" 2714 | } 2715 | }, 2716 | "mime-db": { 2717 | "version": "1.43.0", 2718 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 2719 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 2720 | }, 2721 | "mime-types": { 2722 | "version": "2.1.26", 2723 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 2724 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 2725 | "requires": { 2726 | "mime-db": "1.43.0" 2727 | } 2728 | }, 2729 | "mimic-response": { 2730 | "version": "1.0.1", 2731 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 2732 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 2733 | "dev": true 2734 | }, 2735 | "minimatch": { 2736 | "version": "3.0.4", 2737 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2738 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2739 | "requires": { 2740 | "brace-expansion": "^1.1.7" 2741 | } 2742 | }, 2743 | "mockery": { 2744 | "version": "1.7.0", 2745 | "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", 2746 | "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" 2747 | }, 2748 | "normalize-url": { 2749 | "version": "2.0.1", 2750 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", 2751 | "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", 2752 | "dev": true, 2753 | "requires": { 2754 | "prepend-http": "^2.0.0", 2755 | "query-string": "^5.0.1", 2756 | "sort-keys": "^2.0.0" 2757 | }, 2758 | "dependencies": { 2759 | "sort-keys": { 2760 | "version": "2.0.0", 2761 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", 2762 | "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", 2763 | "dev": true, 2764 | "requires": { 2765 | "is-plain-obj": "^1.0.0" 2766 | } 2767 | } 2768 | } 2769 | }, 2770 | "npm-conf": { 2771 | "version": "1.1.3", 2772 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 2773 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", 2774 | "dev": true, 2775 | "requires": { 2776 | "config-chain": "^1.1.11", 2777 | "pify": "^3.0.0" 2778 | } 2779 | }, 2780 | "object-assign": { 2781 | "version": "4.1.1", 2782 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2783 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2784 | "dev": true 2785 | }, 2786 | "once": { 2787 | "version": "1.4.0", 2788 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2789 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2790 | "requires": { 2791 | "wrappy": "1" 2792 | } 2793 | }, 2794 | "p-cancelable": { 2795 | "version": "0.4.1", 2796 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", 2797 | "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", 2798 | "dev": true 2799 | }, 2800 | "p-event": { 2801 | "version": "2.3.1", 2802 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", 2803 | "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", 2804 | "dev": true, 2805 | "requires": { 2806 | "p-timeout": "^2.0.1" 2807 | } 2808 | }, 2809 | "p-finally": { 2810 | "version": "1.0.0", 2811 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 2812 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 2813 | "dev": true 2814 | }, 2815 | "p-is-promise": { 2816 | "version": "1.1.0", 2817 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 2818 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", 2819 | "dev": true 2820 | }, 2821 | "p-timeout": { 2822 | "version": "2.0.1", 2823 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", 2824 | "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", 2825 | "dev": true, 2826 | "requires": { 2827 | "p-finally": "^1.0.0" 2828 | } 2829 | }, 2830 | "parse-cache-control": { 2831 | "version": "1.0.1", 2832 | "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", 2833 | "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" 2834 | }, 2835 | "path-is-absolute": { 2836 | "version": "1.0.1", 2837 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2838 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2839 | }, 2840 | "path-parse": { 2841 | "version": "1.0.7", 2842 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2843 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2844 | }, 2845 | "pend": { 2846 | "version": "1.2.0", 2847 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 2848 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 2849 | "dev": true 2850 | }, 2851 | "pify": { 2852 | "version": "3.0.0", 2853 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2854 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2855 | "dev": true 2856 | }, 2857 | "pinkie": { 2858 | "version": "2.0.4", 2859 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2860 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2861 | "dev": true 2862 | }, 2863 | "pinkie-promise": { 2864 | "version": "2.0.1", 2865 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2866 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2867 | "dev": true, 2868 | "requires": { 2869 | "pinkie": "^2.0.0" 2870 | } 2871 | }, 2872 | "prepend-http": { 2873 | "version": "2.0.0", 2874 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 2875 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 2876 | "dev": true 2877 | }, 2878 | "process-nextick-args": { 2879 | "version": "2.0.1", 2880 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2881 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2882 | }, 2883 | "promise": { 2884 | "version": "8.0.3", 2885 | "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", 2886 | "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", 2887 | "requires": { 2888 | "asap": "~2.0.6" 2889 | } 2890 | }, 2891 | "proto-list": { 2892 | "version": "1.2.4", 2893 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 2894 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", 2895 | "dev": true 2896 | }, 2897 | "q": { 2898 | "version": "1.5.1", 2899 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 2900 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 2901 | }, 2902 | "qs": { 2903 | "version": "6.9.1", 2904 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", 2905 | "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" 2906 | }, 2907 | "query-string": { 2908 | "version": "5.1.1", 2909 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 2910 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 2911 | "dev": true, 2912 | "requires": { 2913 | "decode-uri-component": "^0.2.0", 2914 | "object-assign": "^4.1.0", 2915 | "strict-uri-encode": "^1.0.0" 2916 | } 2917 | }, 2918 | "readable-stream": { 2919 | "version": "2.3.7", 2920 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2921 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2922 | "requires": { 2923 | "core-util-is": "~1.0.0", 2924 | "inherits": "~2.0.3", 2925 | "isarray": "~1.0.0", 2926 | "process-nextick-args": "~2.0.0", 2927 | "safe-buffer": "~5.1.1", 2928 | "string_decoder": "~1.1.1", 2929 | "util-deprecate": "~1.0.1" 2930 | }, 2931 | "dependencies": { 2932 | "safe-buffer": { 2933 | "version": "5.1.2", 2934 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2935 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2936 | } 2937 | } 2938 | }, 2939 | "rechoir": { 2940 | "version": "0.6.2", 2941 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 2942 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 2943 | "requires": { 2944 | "resolve": "^1.1.6" 2945 | } 2946 | }, 2947 | "resolve": { 2948 | "version": "1.21.0", 2949 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", 2950 | "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", 2951 | "requires": { 2952 | "is-core-module": "^2.8.0", 2953 | "path-parse": "^1.0.7", 2954 | "supports-preserve-symlinks-flag": "^1.0.0" 2955 | } 2956 | }, 2957 | "responselike": { 2958 | "version": "1.0.2", 2959 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 2960 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 2961 | "dev": true, 2962 | "requires": { 2963 | "lowercase-keys": "^1.0.0" 2964 | } 2965 | }, 2966 | "safe-buffer": { 2967 | "version": "5.2.0", 2968 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 2969 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 2970 | "dev": true 2971 | }, 2972 | "seek-bzip": { 2973 | "version": "1.0.5", 2974 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", 2975 | "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", 2976 | "dev": true, 2977 | "requires": { 2978 | "commander": "~2.8.1" 2979 | } 2980 | }, 2981 | "semver": { 2982 | "version": "5.7.1", 2983 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2984 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2985 | }, 2986 | "shelljs": { 2987 | "version": "0.8.5", 2988 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 2989 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 2990 | "requires": { 2991 | "glob": "^7.0.0", 2992 | "interpret": "^1.0.0", 2993 | "rechoir": "^0.6.2" 2994 | } 2995 | }, 2996 | "shimmer": { 2997 | "version": "1.2.1", 2998 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", 2999 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" 3000 | }, 3001 | "sort-keys": { 3002 | "version": "1.1.2", 3003 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 3004 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 3005 | "dev": true, 3006 | "requires": { 3007 | "is-plain-obj": "^1.0.0" 3008 | } 3009 | }, 3010 | "sort-keys-length": { 3011 | "version": "1.0.1", 3012 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", 3013 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", 3014 | "dev": true, 3015 | "requires": { 3016 | "sort-keys": "^1.0.0" 3017 | } 3018 | }, 3019 | "stack-chain": { 3020 | "version": "1.3.7", 3021 | "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", 3022 | "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" 3023 | }, 3024 | "strict-uri-encode": { 3025 | "version": "1.1.0", 3026 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 3027 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", 3028 | "dev": true 3029 | }, 3030 | "string_decoder": { 3031 | "version": "1.1.1", 3032 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3033 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3034 | "requires": { 3035 | "safe-buffer": "~5.1.0" 3036 | }, 3037 | "dependencies": { 3038 | "safe-buffer": { 3039 | "version": "5.1.2", 3040 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3041 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 3042 | } 3043 | } 3044 | }, 3045 | "strip-dirs": { 3046 | "version": "2.1.0", 3047 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 3048 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 3049 | "dev": true, 3050 | "requires": { 3051 | "is-natural-number": "^4.0.1" 3052 | } 3053 | }, 3054 | "strip-outer": { 3055 | "version": "1.0.1", 3056 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 3057 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 3058 | "dev": true, 3059 | "requires": { 3060 | "escape-string-regexp": "^1.0.2" 3061 | } 3062 | }, 3063 | "supports-preserve-symlinks-flag": { 3064 | "version": "1.0.0", 3065 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3066 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 3067 | }, 3068 | "sync-request": { 3069 | "version": "6.1.0", 3070 | "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", 3071 | "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", 3072 | "requires": { 3073 | "http-response-object": "^3.0.1", 3074 | "sync-rpc": "^1.2.1", 3075 | "then-request": "^6.0.0" 3076 | } 3077 | }, 3078 | "sync-rpc": { 3079 | "version": "1.3.6", 3080 | "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", 3081 | "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", 3082 | "requires": { 3083 | "get-port": "^3.1.0" 3084 | } 3085 | }, 3086 | "tar-stream": { 3087 | "version": "1.6.2", 3088 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 3089 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 3090 | "dev": true, 3091 | "requires": { 3092 | "bl": "^1.0.0", 3093 | "buffer-alloc": "^1.2.0", 3094 | "end-of-stream": "^1.0.0", 3095 | "fs-constants": "^1.0.0", 3096 | "readable-stream": "^2.3.0", 3097 | "to-buffer": "^1.1.1", 3098 | "xtend": "^4.0.0" 3099 | } 3100 | }, 3101 | "then-request": { 3102 | "version": "6.0.2", 3103 | "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", 3104 | "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", 3105 | "requires": { 3106 | "@types/concat-stream": "^1.6.0", 3107 | "@types/form-data": "0.0.33", 3108 | "@types/node": "^8.0.0", 3109 | "@types/qs": "^6.2.31", 3110 | "caseless": "~0.12.0", 3111 | "concat-stream": "^1.6.0", 3112 | "form-data": "^2.2.0", 3113 | "http-basic": "^8.1.1", 3114 | "http-response-object": "^3.0.1", 3115 | "promise": "^8.0.0", 3116 | "qs": "^6.4.0" 3117 | }, 3118 | "dependencies": { 3119 | "@types/node": { 3120 | "version": "8.10.59", 3121 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", 3122 | "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==" 3123 | } 3124 | } 3125 | }, 3126 | "through": { 3127 | "version": "2.3.8", 3128 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3129 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3130 | "dev": true 3131 | }, 3132 | "timed-out": { 3133 | "version": "4.0.1", 3134 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 3135 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 3136 | "dev": true 3137 | }, 3138 | "to-buffer": { 3139 | "version": "1.1.1", 3140 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 3141 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", 3142 | "dev": true 3143 | }, 3144 | "trim-repeated": { 3145 | "version": "1.0.0", 3146 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 3147 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 3148 | "dev": true, 3149 | "requires": { 3150 | "escape-string-regexp": "^1.0.2" 3151 | } 3152 | }, 3153 | "tunnel-agent": { 3154 | "version": "0.6.0", 3155 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3156 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3157 | "dev": true, 3158 | "requires": { 3159 | "safe-buffer": "^5.0.1" 3160 | } 3161 | }, 3162 | "typedarray": { 3163 | "version": "0.0.6", 3164 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3165 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 3166 | }, 3167 | "unbzip2-stream": { 3168 | "version": "1.3.3", 3169 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", 3170 | "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", 3171 | "dev": true, 3172 | "requires": { 3173 | "buffer": "^5.2.1", 3174 | "through": "^2.3.8" 3175 | } 3176 | }, 3177 | "url-parse-lax": { 3178 | "version": "3.0.0", 3179 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 3180 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 3181 | "dev": true, 3182 | "requires": { 3183 | "prepend-http": "^2.0.0" 3184 | } 3185 | }, 3186 | "url-to-options": { 3187 | "version": "1.0.1", 3188 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", 3189 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", 3190 | "dev": true 3191 | }, 3192 | "util-deprecate": { 3193 | "version": "1.0.2", 3194 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3195 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3196 | }, 3197 | "uuid": { 3198 | "version": "3.3.3", 3199 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 3200 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 3201 | }, 3202 | "wrappy": { 3203 | "version": "1.0.2", 3204 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3205 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3206 | }, 3207 | "xtend": { 3208 | "version": "4.0.2", 3209 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3210 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3211 | "dev": true 3212 | }, 3213 | "yauzl": { 3214 | "version": "2.10.0", 3215 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 3216 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 3217 | "dev": true, 3218 | "requires": { 3219 | "buffer-crc32": "~0.2.3", 3220 | "fd-slicer": "~1.1.0" 3221 | } 3222 | } 3223 | } 3224 | } 3225 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "android-app-size-diff", 3 | "version": "1.0.5", 4 | "description": "Azure DevOps task to measure the size in Android app size by looking at 2 given APKs and AABs", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "npm run build-ts && npm run copy-files", 8 | "adoTask": "npm run build && node dist/src/ado-index.js", 9 | "build-ts": "tsc", 10 | "copy-files": "ts-node copyFiles.ts", 11 | "test": "npm run build && mocha dist/test/**/*.js", 12 | "bundle": "npm run build && npm run bundle-ado-task && npm run bundle-gh-action", 13 | "bundle-gh-action": "ncc build src/gh-action-index.ts -m -o dist_gh_action", 14 | "bundle-ado-task": "tfx extension create --manifest-globs ado-extension.json", 15 | "bump-major": "ts-node bumpVersion.ts major", 16 | "bump-minor": "ts-node bumpVersion.ts minor", 17 | "bump-patch": "ts-node bumpVersion.ts patch" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/microsoft/android-app-size-ci.git" 22 | }, 23 | "keywords": [ 24 | "android", 25 | "app", 26 | "size", 27 | "ado" 28 | ], 29 | "author": "Praveen Pendyala", 30 | "license": "MIT", 31 | "bugs": { 32 | "url": "https://github.com/microsoft/android-app-size-ci/issues" 33 | }, 34 | "homepage": "https://github.com/microsoft/android-app-size-ci#readme", 35 | "dependencies": { 36 | "@actions/core": "^1.2.6", 37 | "@types/adm-zip": "^0.4.32", 38 | "@types/line-reader": "0.0.28", 39 | "adm-zip": "^0.4.13", 40 | "applicationinsights": "^1.6.0", 41 | "azure-pipelines-task-lib": "^3.1.10", 42 | "line-reader": "^0.4.0" 43 | }, 44 | "devDependencies": { 45 | "@types/download": "^6.2.4", 46 | "@types/mocha": "^5.2.7", 47 | "@types/node": "^13.1.1", 48 | "@types/q": "^1.5.2", 49 | "@types/shelljs": "^0.8.5", 50 | "download": "^7.1.0", 51 | "shelljs": "^0.8.5", 52 | "sync-request": "^6.1.0" 53 | } 54 | } -------------------------------------------------------------------------------- /src/ado-index.ts: -------------------------------------------------------------------------------- 1 | import AdoTaskRunner from './adoTask/adoTaskRunner' 2 | 3 | new AdoTaskRunner().run(); 4 | -------------------------------------------------------------------------------- /src/adoTask/adoTaskRunner.ts: -------------------------------------------------------------------------------- 1 | import * as adoTask from 'azure-pipelines-task-lib/task'; 2 | import CiRunner, { CiCore } from '../apkAnalyzer/CiRunner'; 3 | import { isUndefined } from 'util'; 4 | 5 | export class AdoCiCore implements CiCore { 6 | 7 | getCiName(): string { 8 | return 'Azure DevOps'; 9 | } 10 | 11 | getInput(name: string): string { 12 | const value = adoTask.getInput(name); 13 | return isUndefined(value) ? "" : value; 14 | } 15 | 16 | setOutput(key: string, value: string) { 17 | return adoTask.setVariable(key, value); 18 | } 19 | 20 | logInfo(message: string) { 21 | return console.log(message); 22 | } 23 | 24 | logWarning(message: string) { 25 | return adoTask.warning(message); 26 | } 27 | 28 | logError(message: string) { 29 | return adoTask.error(message); 30 | } 31 | 32 | markAsFailed(errorMessage: string) { 33 | return adoTask.setResult(adoTask.TaskResult.Failed, errorMessage); 34 | } 35 | } 36 | 37 | export default class AdoTaskRunner { 38 | 39 | public async run() { 40 | try { 41 | const adoCiCore = new AdoCiCore(); 42 | const ciRunner = new CiRunner(adoCiCore); 43 | await ciRunner.run(); 44 | } 45 | catch (err) { 46 | adoTask.setResult(adoTask.TaskResult.Failed, (err as Error).message); 47 | } 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/apkAnalyzer/ApkAnalyzer.ts: -------------------------------------------------------------------------------- 1 | import AdmZip from 'adm-zip'; 2 | import * as path from 'path' 3 | import * as util from 'util'; 4 | import MetaMfParser from './MetaMfParser'; 5 | import ApkSizeSummary from './model/ApkSizeSummary'; 6 | import { FilesSizeCalculator } from './FilesSizeCalculator'; 7 | 8 | export default class ApkAnalyzer { 9 | 10 | public async analyse(apkPath: string, apkLabel: string, workingDir?: string) : Promise { 11 | if (util.isUndefined(workingDir)) { 12 | workingDir = path.join(path.dirname(apkPath), 'extracted'); 13 | } 14 | 15 | // Extract the apk file 16 | const apkFile = new AdmZip(apkPath); 17 | console.log('Extracting APK file to ' + workingDir); 18 | apkFile.extractAllTo(workingDir, true); 19 | 20 | // Parse the IMF file 21 | const mfParser = new MetaMfParser(workingDir); 22 | await mfParser.parse(); 23 | 24 | // Build Apk size summary 25 | const fileSizeCalc = new FilesSizeCalculator(); 26 | const sizeSummary = new ApkSizeSummary(); 27 | 28 | sizeSummary.apkLabel = apkLabel; 29 | sizeSummary.sizeMetrics['apkSize'] = fileSizeCalc.getFileSize(apkPath); 30 | sizeSummary.sizeMetrics['arscFile'] = fileSizeCalc.getFilesSize(mfParser.getFiles('.arsc')); 31 | sizeSummary.sizeMetrics['dexFiles'] = fileSizeCalc.getFilesSize(mfParser.getFiles('.dex')); 32 | sizeSummary.sizeMetrics['nativeLibs'] = fileSizeCalc.getFilesSize(mfParser.getFiles('.so')); 33 | sizeSummary.sizeMetrics['installSize'] = sizeSummary.sizeMetrics['apkSize'] + sizeSummary.sizeMetrics['dexFiles']; 34 | 35 | return sizeSummary; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/apkAnalyzer/CiRunner.ts: -------------------------------------------------------------------------------- 1 | import ApkAnalyzer from '../apkAnalyzer/ApkAnalyzer'; 2 | import ComparisionReportGenerator from '../apkAnalyzer/ComparisionReportGenerator'; 3 | import { MarkdownReporter } from '../apkAnalyzer/reporter/MarkdownReporter'; 4 | import ComparisionReport from './model/ComparisionReport'; 5 | import ThresholdChecker from './ThresholdChecker'; 6 | import * as appInsights from 'applicationinsights' 7 | 8 | export interface CiCore { 9 | 10 | /** 11 | * @returns the name of the CI 12 | */ 13 | getCiName(): string; 14 | 15 | /** 16 | * Gets an input from the CI 17 | * @param name 18 | */ 19 | getInput(name: string): string; 20 | 21 | /** 22 | * Sets an output variable on the CI 23 | * @param key 24 | * @param value 25 | */ 26 | setOutput(key: string, value: string): any; 27 | 28 | logInfo(message: string): any; 29 | logWarning(message: string): any; 30 | logError(message: string): any; 31 | 32 | /** 33 | * Marks the run as failure 34 | * @param errorMessage Error message 35 | */ 36 | markAsFailed(errorMessage: string): any; 37 | } 38 | 39 | /** 40 | * Runs Apk comparision on a CI - Github workflow or ADO Task 41 | */ 42 | export default class CiRunner { 43 | ciCore: CiCore; // either Github action core or ADO Task 44 | thresholdChecker: ThresholdChecker; 45 | 46 | constructor(ciCore: CiCore) { 47 | this.ciCore = ciCore; 48 | this.thresholdChecker = new ThresholdChecker(ciCore); 49 | } 50 | 51 | /** 52 | * Runs the ci runner with telemetry enabled if set 53 | */ 54 | public async run() { 55 | const telemetryEnabled = Boolean(JSON.parse(this.ciCore.getInput('telemetryEnabled'))); 56 | 57 | if (telemetryEnabled) { 58 | console.log("Running with usage telemetry.."); 59 | return this.runAppSizeAnalysisWithTelemetry(); 60 | } else { 61 | console.log("Running with telemetry disabled.."); 62 | return this.runAppSizeAnalysis(); 63 | } 64 | } 65 | 66 | private async runAppSizeAnalysisWithTelemetry() { 67 | // Configure and enable telemetry 68 | appInsights.setup("InstrumentationKey=badea35a-1e7a-436e-bdbb-d2efc83ed8ee;IngestionEndpoint=https://ukwest-0.in.applicationinsights.azure.com/") // Change this to your own instrumentation key 69 | .setAutoDependencyCorrelation(true) 70 | .setAutoCollectRequests(true) 71 | .setAutoCollectPerformance(true, true) 72 | .setAutoCollectExceptions(true) 73 | .setAutoCollectDependencies(true) 74 | .setAutoCollectConsole(true) 75 | .setUseDiskRetryCaching(true) 76 | .setSendLiveMetrics(true) 77 | .start(); 78 | const telemetryClient = appInsights.defaultClient; 79 | 80 | // Send app start telemetry 81 | const startTime = new Date().getTime(); 82 | const telemetryProperties = { 83 | ciName: this.ciCore.getCiName() 84 | } 85 | telemetryClient.trackEvent({ 86 | name: 'RunStarted', 87 | properties: telemetryProperties 88 | }); 89 | 90 | var result: any; 91 | try { 92 | result = await this.runAppSizeAnalysis(); 93 | 94 | // Send success telemetry 95 | const endTime = new Date().getTime(); 96 | const elapsedTime = endTime - startTime; 97 | telemetryClient.trackEvent({ 98 | name: 'RunSuccess', 99 | measurements: { 100 | duration: elapsedTime 101 | }, 102 | properties: telemetryProperties 103 | }); 104 | } catch (err) { 105 | // Send error telemetry 106 | telemetryClient.trackEvent({ 107 | name: 'RunFailed', 108 | properties: telemetryProperties 109 | }); 110 | telemetryClient.trackException({ 111 | exception: err as Error, 112 | properties: telemetryProperties 113 | }); 114 | 115 | throw err; 116 | } finally { 117 | telemetryClient.flush(); 118 | } 119 | 120 | return result; 121 | } 122 | 123 | private async runAppSizeAnalysis() { 124 | const baseAppPath = this.ciCore.getInput('baseAppPath'); 125 | const targetAppPath = this.ciCore.getInput('targetAppPath'); 126 | const baseAppLabel = this.ciCore.getInput('baseAppLabel'); 127 | const targetAppLabel = this.ciCore.getInput('targetAppLabel'); 128 | const summaryOutputPath = this.ciCore.getInput('summaryOutputPath'); 129 | const metrics = this.ciCore.getInput('metrics'); 130 | const thresholds = this.ciCore.getInput('thresholds'); 131 | 132 | var abortRun = false; 133 | if (!baseAppPath || !targetAppPath) { 134 | this.ciCore.logError('App paths not supplied!'); 135 | abortRun = true; 136 | } 137 | 138 | if (!baseAppLabel || !targetAppLabel) { 139 | this.ciCore.logError('App labels not supplied!'); 140 | abortRun = true; 141 | } 142 | 143 | if (!summaryOutputPath) { 144 | this.ciCore.logError('Summary path not supplied!'); 145 | abortRun = true; 146 | } 147 | 148 | if (!metrics) { 149 | this.ciCore.logError('Must pick at least one metric!'); 150 | abortRun = true; 151 | } 152 | 153 | const metricsList: Array = this.readCsv(metrics); 154 | var thresholdsList: Array = [] 155 | try { 156 | thresholdsList = this.parseThresholdsFromInput(thresholds, metricsList); 157 | } catch (error) { 158 | this.ciCore.logError('Error parsing thresholds! ' + error); 159 | abortRun = true; 160 | } 161 | 162 | // Fail if we have to abort because at least one of the required conditions are not met 163 | if (abortRun) { 164 | throw 'Invalid / illegal task inputs!'; 165 | } 166 | 167 | const apkAnalyzer = new ApkAnalyzer(); 168 | const markdownReportor = new MarkdownReporter(); 169 | const compareReportGenerator = new ComparisionReportGenerator( 170 | apkAnalyzer, markdownReportor); 171 | 172 | const comparisionReport : ComparisionReport = await compareReportGenerator.generateComparisionReport( 173 | baseAppPath, 174 | targetAppPath, 175 | summaryOutputPath, 176 | baseAppLabel, 177 | targetAppLabel, 178 | metricsList, 179 | thresholdsList 180 | ); 181 | 182 | // Check if thresholds are adhered to 183 | if (!this.thresholdChecker.checkThresholds(comparisionReport)) { 184 | this.ciCore.markAsFailed('App size increased significantly in at least one metric!'); 185 | } 186 | console.log(comparisionReport); 187 | 188 | return comparisionReport; 189 | } 190 | 191 | private parseThresholdsFromInput(thresholdsInput: string, metricsList: Array): Array { 192 | const thresholdsList: Array = []; 193 | 194 | // If no thresholds set, just use NaN for each metric as a threshold 195 | if (!thresholdsInput) { 196 | this.ciCore.logWarning('No thresholds supplied. Drastic changes in app size metrics will not fail this task!'); 197 | metricsList.forEach(() => thresholdsList.push(NaN)); 198 | return thresholdsList; 199 | } 200 | 201 | // Check if same number of thresholds and metrics are passed 202 | const thresholdStrings: Array = this.readCsv(thresholdsInput); 203 | if (thresholdStrings.length != metricsList.length) { 204 | throw 'Thresholds must be set corresponding to each metric in metrics or none!'; 205 | } 206 | 207 | // Parse threshold for each metric 208 | metricsList.forEach((_, index) => { 209 | const thresholdValue = parseInt(thresholdStrings[index]); 210 | thresholdsList.push(thresholdValue); 211 | }); 212 | return thresholdsList; 213 | } 214 | 215 | private readCsv(inputString: string): Array { 216 | const valuesList: Array = inputString.split(','); 217 | return valuesList.map((value) => value.trim()); 218 | } 219 | 220 | } -------------------------------------------------------------------------------- /src/apkAnalyzer/ComparisionReportGenerator.ts: -------------------------------------------------------------------------------- 1 | import ApkAnalyzer from "./ApkAnalyzer"; 2 | import ComparisionReport from "./model/ComparisionReport"; 3 | import IReportor from './reporter/IReporter'; 4 | 5 | /** 6 | * Generates a report comparsing two different APks 7 | */ 8 | export default class ComparisionReportGenerator { 9 | apkAnalyser: ApkAnalyzer; 10 | reporter: IReportor; 11 | 12 | public constructor(apkAnalyser : ApkAnalyzer, reporter: IReportor) { 13 | this.apkAnalyser = apkAnalyser; 14 | this.reporter = reporter; 15 | } 16 | 17 | public async generateComparisionReport( 18 | baseApkPath: string, 19 | targetApkPath: string, 20 | reportOutputPath: string, 21 | baseApkLabel: string, 22 | targetApkLabel: string, 23 | includeMetrics: Array, 24 | thresholds: Array) : Promise { 25 | const baseSummary = await this.apkAnalyser.analyse(baseApkPath, baseApkLabel); 26 | const targetSummary = await this.apkAnalyser.analyse(targetApkPath, targetApkLabel); 27 | 28 | const comparisionReport = new ComparisionReport(); 29 | comparisionReport.baseApkLabel = baseSummary.apkLabel; 30 | comparisionReport.targetApkLabel = targetSummary.apkLabel; 31 | 32 | includeMetrics.forEach((metric, index) => { 33 | const baseMetric = baseSummary.sizeMetrics[metric]; 34 | const targetMetric = targetSummary.sizeMetrics[metric]; 35 | const difference = targetMetric - baseMetric; 36 | 37 | comparisionReport.comparisionMetrics.push({ 38 | metricName: metric, 39 | baseValue: baseMetric, 40 | targetValue: targetMetric, 41 | difference: difference, 42 | threshold: thresholds[index] 43 | }); 44 | }); 45 | 46 | this.reporter.writeReport(comparisionReport, reportOutputPath); 47 | 48 | return comparisionReport; 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /src/apkAnalyzer/FilesSizeCalculator.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Calculates the cummulative size of given file(s) 3 | */ 4 | import * as fs from 'fs'; 5 | import * as util from 'util'; 6 | 7 | export class FilesSizeCalculator { 8 | 9 | /** 10 | * Returns the cummulative size of all the files 11 | */ 12 | public getFilesSize(filePaths: string[] | undefined) : number { 13 | var totalSize = 0; 14 | 15 | if (!util.isNullOrUndefined(filePaths)) { 16 | filePaths.forEach(filePath => { 17 | totalSize += this.getFileSize(filePath); 18 | }); 19 | } 20 | 21 | return totalSize; 22 | } 23 | 24 | public getFileSize(filePath: string) : number { 25 | const stats = fs.statSync(filePath); 26 | return stats["size"]; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/apkAnalyzer/MetaMfParser.ts: -------------------------------------------------------------------------------- 1 | import LineReader from 'line-reader'; 2 | import * as path from 'path'; 3 | import * as util from 'util'; 4 | 5 | /** 6 | * Parses the contents of the Android MetaMf file and sorts the list of files based on extension 7 | */ 8 | export default class MetaMfParser { 9 | 10 | // Path which is root of the apk contents 11 | mBasePath: string; 12 | 13 | // Path to the actual .MF file 14 | mfFilePath: string; 15 | 16 | mFilesExtensionMap: Map>; 17 | 18 | constructor(apkContentsPath: string) { 19 | this.mBasePath = apkContentsPath; 20 | this.mfFilePath = path.join(apkContentsPath, 'META-INF', 'MANIFEST.MF'); 21 | this.mFilesExtensionMap = new Map(); 22 | } 23 | 24 | /** 25 | * Parses the file contents into extension groups 26 | */ 27 | public async parse() { 28 | var eachLine: any = util.promisify(LineReader.eachLine); 29 | return eachLine(this.mfFilePath, (line: string) => { 30 | this.parseLine(line) 31 | }); 32 | } 33 | 34 | /** 35 | * Gets array of files with the given extension 36 | */ 37 | public getFiles(extension: string) : Array | undefined { 38 | return this.mFilesExtensionMap.get(extension); 39 | } 40 | 41 | private parseLine(line: string) { 42 | // Ignore lines which doesn't point to a file 43 | if (!line.startsWith('Name: ')) { 44 | return; 45 | } 46 | 47 | const filePath = path.join(this.mBasePath, line.split('Name: ', 2)[1]); 48 | const extension = path.extname(filePath); 49 | 50 | if (!this.mFilesExtensionMap.has(extension)) { 51 | this.mFilesExtensionMap.set(extension, []); 52 | } 53 | 54 | const filesForExt = this.mFilesExtensionMap.get(extension); 55 | if (!util.isUndefined(filesForExt)) { 56 | filesForExt.push(filePath); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/apkAnalyzer/ThresholdChecker.ts: -------------------------------------------------------------------------------- 1 | import ComparisionReport from "./model/ComparisionReport"; 2 | import { CiCore } from "./CiRunner"; 3 | 4 | /** 5 | * Checks that Comparision report follows the given threshold contraints 6 | */ 7 | export default class ThresholdChecker { 8 | ciCore: CiCore; 9 | 10 | constructor(ciCore: CiCore) { 11 | this.ciCore = ciCore; 12 | } 13 | 14 | /** 15 | * Checks thresholds for each metric in the comparision report 16 | * @returns true if all thresholds are upheld. false if any single threshold has failed. 17 | */ 18 | public checkThresholds(comparisionReport: ComparisionReport) : boolean { 19 | var thresholdsUpheld = true; 20 | comparisionReport.comparisionMetrics.forEach(metric => { 21 | if (metric.threshold == NaN) { 22 | this.ciCore.logInfo(metric.metricName + ': ignoring threshold for metric!'); 23 | return; 24 | } 25 | 26 | if (metric.difference > metric.threshold) { 27 | this.ciCore.logError(metric.metricName + ' increased more than threshold!'); 28 | thresholdsUpheld = false; 29 | } 30 | }); 31 | return thresholdsUpheld; 32 | } 33 | } -------------------------------------------------------------------------------- /src/apkAnalyzer/model/ApkSizeSummary.ts: -------------------------------------------------------------------------------- 1 | export default class ApkSizeSummary { 2 | apkLabel: string = ''; 3 | sizeMetrics: {[key: string]: number} = {}; 4 | } -------------------------------------------------------------------------------- /src/apkAnalyzer/model/ComparisionReport.ts: -------------------------------------------------------------------------------- 1 | export interface ComparisionMetric { 2 | metricName: string; 3 | baseValue: number; 4 | targetValue: number; 5 | difference: number; 6 | threshold: number; 7 | } 8 | 9 | export default class ComparisionReport { 10 | baseApkLabel: string = ''; 11 | targetApkLabel: string = ''; 12 | comparisionMetrics: Array = []; 13 | } -------------------------------------------------------------------------------- /src/apkAnalyzer/reporter/IReporter.ts: -------------------------------------------------------------------------------- 1 | import ComparisionReport from '../model/ComparisionReport' 2 | 3 | export default interface IReporter { 4 | 5 | writeReport(comparisionReport: ComparisionReport, outputPath: string) : Promise; 6 | } -------------------------------------------------------------------------------- /src/apkAnalyzer/reporter/MarkdownReporter.ts: -------------------------------------------------------------------------------- 1 | import IReporter from './IReporter'; 2 | import ComparisionReport from '../model/ComparisionReport'; 3 | import * as fs from 'fs'; 4 | 5 | export class MarkdownReporter implements IReporter { 6 | 7 | public async writeReport(comparisionReport: ComparisionReport, outputPath: string) { 8 | var report = ''; 9 | 10 | // Title row 11 | report += this.buildRow( 12 | 'Metric', 13 | comparisionReport.baseApkLabel, 14 | comparisionReport.targetApkLabel, 15 | 'Difference'); 16 | 17 | // Seperator row 18 | report += this.buildRow('---', '---', '---', '---'); 19 | 20 | // A row per metric 21 | comparisionReport.comparisionMetrics.forEach(compareMetric => { 22 | report += this.buildRow( 23 | compareMetric.metricName, 24 | String(compareMetric.baseValue), 25 | String(compareMetric.targetValue), 26 | String(compareMetric.difference)); 27 | }); 28 | 29 | return fs.writeFileSync(outputPath, report); 30 | } 31 | 32 | private buildRow(...cellStrings : string[]) : string { 33 | return cellStrings.join(' | ') + ' | \n'; 34 | } 35 | } -------------------------------------------------------------------------------- /src/assets/appSizeChangesIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/android-app-size-diff/0199b33b3b917f575afe28ded628b000cdc74307/src/assets/appSizeChangesIcon.png -------------------------------------------------------------------------------- /src/assets/overview.md: -------------------------------------------------------------------------------- 1 | ## Usage examples 2 | 3 | - In a Azure DevOps Pipeline 4 | 5 | ```yml 6 | - task: android-app-size-diff@1 7 | inputs: 8 | baseAppPath: test/assets/test.apk 9 | targetAppPath: test/assets/test.apk 10 | summaryOutputPath: summary.md 11 | displayName: Run APK size comparision 12 | ``` 13 | 14 | ## Inputs 15 | 16 | - `baseAppPath`: Path to base apk. This is the app before changes 17 | - required: true 18 | - default: 'base.apk' 19 | - `baseAppLabel`: Label to use for the base app in the report 20 | - required: false 21 | - default: 'Base APK' 22 | - `targetAppPath`: Path to target apk. This is the app after changes 23 | - required: true 24 | - default: 'target.apk' 25 | - `targetAppLabel`: Label to use for the base app in the report 26 | - required: false 27 | - default: 'Target APK' 28 | - `summaryOutputPath`: Output file where comparision summary should be written to 29 | - required: true 30 | - default: 'summary.md' 31 | - `metrics`: A comma seperated list of size metrics to include in the summary. Possible values are `apkSize`, `installSize`, `dexFiles`, `arscFile`, `nativeLibs` 32 | - required: false 33 | - default: 'apkSize, installSize, dexFiles, arscFile, nativeLibs' 34 | - `thresholds`: A comma seperated list of thresholds for each of the metrics in bytes. If this is empty, no thresholding will apply. When this is not empty, the task will fail when any of the given thresholds are crossed 35 | - required: false 36 | - default: '' 37 | - `telemetryEnabled`: Set to `false` to disable telemetry 38 | - required: false 39 | - default: 'true' 40 | -------------------------------------------------------------------------------- /src/gh-action-index.ts: -------------------------------------------------------------------------------- 1 | import GithubActionRunner from './githubAction/GithubActionRunner' 2 | 3 | new GithubActionRunner().run(); 4 | -------------------------------------------------------------------------------- /src/githubAction/GithubActionRunner.ts: -------------------------------------------------------------------------------- 1 | import * as ghAction from '@actions/core'; 2 | import CiRunner, { CiCore } from '../apkAnalyzer/CiRunner'; 3 | import { isUndefined } from 'util'; 4 | 5 | export class GithubCiCore implements CiCore { 6 | 7 | getCiName(): string { 8 | return 'GitHub'; 9 | } 10 | 11 | getInput(name: string): string { 12 | const value = ghAction.getInput(name); 13 | return isUndefined(value) ? "" : value; 14 | } 15 | 16 | setOutput(key: string, value: string) { 17 | return ghAction.setOutput(key, value); 18 | } 19 | 20 | logInfo(message: string) { 21 | return ghAction.info(message); 22 | } 23 | 24 | logWarning(message: string) { 25 | return ghAction.warning(message); 26 | } 27 | 28 | logError(message: string) { 29 | return ghAction.error(message); 30 | } 31 | 32 | markAsFailed(errorMessage: string) { 33 | return ghAction.setFailed(errorMessage); 34 | } 35 | } 36 | 37 | export default class GithubActionRunner { 38 | 39 | public async run() { 40 | try { 41 | const githubCore = new GithubCiCore(); 42 | const ciRunner = new CiRunner(githubCore); 43 | await ciRunner.run(); 44 | } 45 | catch (err) { 46 | ghAction.setFailed((err as Error).message); 47 | } 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/task.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json", 3 | "id": "911fb029-c89b-4d09-a2d4-610486918018", 4 | "name": "android-app-size-diff", 5 | "friendlyName": "Android app size change summary", 6 | "description": "Generates a summary of Android application size across different metrics", 7 | "helpMarkDown": "", 8 | "category": "Utility", 9 | "author": "Microsoft", 10 | "version": { 11 | "Major": 1, 12 | "Minor": 0, 13 | "Patch": 5 14 | }, 15 | "instanceNameFormat": "Android App size change - $(baseAppPath) vs $(targetAppPath)", 16 | "inputs": [ 17 | { 18 | "name": "baseAppPath", 19 | "type": "string", 20 | "label": "Base app path", 21 | "defaultValue": "base.apk", 22 | "required": true, 23 | "helpMarkDown": "Path to base apk. This is the app before changes" 24 | }, 25 | { 26 | "name": "baseAppLabel", 27 | "type": "string", 28 | "label": "Base app label", 29 | "defaultValue": "Base APK", 30 | "required": false, 31 | "helpMarkDown": "Label to use for the base app in the report" 32 | }, 33 | { 34 | "name": "targetAppPath", 35 | "type": "string", 36 | "label": "Target app path", 37 | "defaultValue": "target.apk", 38 | "required": true, 39 | "helpMarkDown": "Path to target apk. This is the app after changes" 40 | }, 41 | { 42 | "name": "targetAppLabel", 43 | "type": "string", 44 | "label": "Target app label", 45 | "defaultValue": "Target APK", 46 | "required": false, 47 | "helpMarkDown": "Label to use for the target app in the report" 48 | }, 49 | { 50 | "name": "summaryOutputPath", 51 | "type": "string", 52 | "label": "Summary output path", 53 | "defaultValue": "summary.md", 54 | "required": true, 55 | "helpMarkDown": "Output file where comparision summary should be written to" 56 | }, 57 | { 58 | "name": "metrics", 59 | "type": "string", 60 | "label": "Size metrics", 61 | "defaultValue": "apkSize, installSize, dexFiles, arscFile, nativeLibs", 62 | "required": false, 63 | "helpMarkDown": "A comma seperated list of size metrics to include in the summary. Possible values are `apkSize`, `installSize`, `dexFiles`, `arscFile`, `nativeLibs`" 64 | }, 65 | { 66 | "name": "thresholds", 67 | "type": "string", 68 | "label": "Size thresholds", 69 | "defaultValue": "", 70 | "required": false, 71 | "helpMarkDown": "A comma seperated list of thresholds for each of the metrics in bytes. If this is empty, no thresholding will apply. When this is not empty, the task will fail when any of the given thresholds are crossed." 72 | }, 73 | { 74 | "name": "telemetryEnabled", 75 | "type": "string", 76 | "label": "Telemetry enabled", 77 | "defaultValue": "true", 78 | "required": false, 79 | "helpMarkDown": "Set to `false` to disable telemetry" 80 | } 81 | ], 82 | "execution": { 83 | "Node10": { 84 | "target": "ado-index.js" 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /src/typings/typings.d.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/android-app-size-diff/0199b33b3b917f575afe28ded628b000cdc74307/src/typings/typings.d.ts -------------------------------------------------------------------------------- /test/adoTask/_suite.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as assert from 'assert'; 3 | import * as ttm from 'azure-pipelines-task-lib/mock-test'; 4 | 5 | describe('Sample task tests', function () { 6 | let taskJsonPath = path.join(__dirname, '../../src/', 'task.json'); 7 | 8 | before(() => { 9 | 10 | }); 11 | 12 | after(() => { 13 | 14 | }); 15 | 16 | it('should succeed with simple inputs', function(done: MochaDone) { 17 | let tp = path.join(__dirname, 'success.js'); 18 | let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp, taskJsonPath); 19 | 20 | tr.run(); 21 | console.log(tr.succeeded); 22 | assert.equal(tr.succeeded, true, 'should have succeeded'); 23 | assert.equal(tr.warningIssues.length, 0, "should have no warnings"); 24 | assert.equal(tr.errorIssues.length, 0, "should have no errors"); 25 | console.log(tr.stdout); 26 | assert.equal(tr.stdout.indexOf('apkSize') >= 0, true, "should contain size info"); 27 | done(); 28 | }); 29 | 30 | }); 31 | 32 | -------------------------------------------------------------------------------- /test/adoTask/success.ts: -------------------------------------------------------------------------------- 1 | import ma = require('azure-pipelines-task-lib/mock-answer'); 2 | import tmrm = require('azure-pipelines-task-lib/mock-run'); 3 | import path = require('path'); 4 | 5 | let taskPath = path.join(__dirname, '../../src/', 'ado-index.js'); 6 | let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); 7 | 8 | tmr.setInput('baseAppPath', 'test/assets/test.apk'); 9 | tmr.setInput('targetAppPath', 'test/assets/test.apk'); 10 | tmr.setInput('baseAppLabel', 'Base APK'); 11 | tmr.setInput('targetAppLabel', 'Target APK'); 12 | tmr.setInput('metrics', 'apkSize, installSize'); 13 | tmr.setInput('thresholds', '20, 50'); 14 | tmr.setInput('summaryOutputPath', 'dist/test/testReport.md'); 15 | tmr.setInput('telemetryEnabled', 'false'); 16 | 17 | tmr.run(); 18 | -------------------------------------------------------------------------------- /test/assets/test.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/android-app-size-diff/0199b33b3b917f575afe28ded628b000cdc74307/test/assets/test.apk -------------------------------------------------------------------------------- /threat_model/azure_devops.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/android-app-size-diff/0199b33b3b917f575afe28ded628b000cdc74307/threat_model/azure_devops.png -------------------------------------------------------------------------------- /threat_model/github_ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/android-app-size-diff/0199b33b3b917f575afe28ded628b000cdc74307/threat_model/github_ci.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ 6 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 7 | // "lib": [], /* Specify library files to be included in the compilation. */ 8 | // "allowJs": true, /* Allow javascript files to be compiled. */ 9 | // "checkJs": true, /* Report errors in .js files. */ 10 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 11 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 12 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 13 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 14 | // "outFile": "./", /* Concatenate and emit output to single file. */ 15 | "outDir": "dist", /* Redirect output structure to the directory. */ 16 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 17 | // "composite": true, /* Enable project compilation */ 18 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 19 | // "removeComments": true, /* Do not emit comments to output. */ 20 | // "noEmit": true, /* Do not emit outputs. */ 21 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 22 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 23 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 24 | 25 | /* Strict Type-Checking Options */ 26 | "strict": true, /* Enable all strict type-checking options. */ 27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 28 | // "strictNullChecks": true, /* Enable strict null checks. */ 29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 30 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 31 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 32 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 33 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 34 | 35 | /* Additional Checks */ 36 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 37 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 38 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 39 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 40 | 41 | /* Module Resolution Options */ 42 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 43 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 44 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 45 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 46 | "typeRoots": [ 47 | "node_modules/@types", 48 | "src/typings" 49 | ], /* List of folders to include type definitions from. */ 50 | // "types": [], /* Type declaration files to be included in compilation. */ 51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 55 | 56 | /* Source Map Options */ 57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 61 | 62 | /* Experimental Options */ 63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 65 | 66 | /* Advanced Options */ 67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 68 | }, 69 | "include": [ 70 | "src/**/*.ts", 71 | "test/**/*.ts" 72 | ] 73 | } 74 | --------------------------------------------------------------------------------