├── .gitignore ├── README.md ├── assets ├── how-it-works.png ├── how-it-works.vsdx └── mvp-monitor-promo.png ├── docs ├── favicon.ico ├── index.html └── static │ ├── ga.js │ ├── logo.png │ ├── script.js │ └── styles.css ├── package-lock.json ├── package.json ├── provisioning ├── Deploy.ps1 ├── Install.ps1 ├── Settings.ps1 ├── lib │ ├── Functions.ps1 │ └── Functions │ │ ├── AuthContext.ps1 │ │ ├── JsConfigs.js │ │ ├── JsConfigs.ps1 │ │ └── PsUtils.ps1 ├── script │ └── clean.pnp.ts └── templates │ └── Model.xml ├── reports ├── mvp-stats-mobile.pbix └── mvp-stats.pbix ├── src ├── api.ts ├── index.ts ├── interface.ts ├── map.ts └── utils.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | config/private* 4 | .env 5 | data/ 6 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Microsoft MVPs Monitor 2 | 3 | > Have you ever wondered how many MVPs in specific categories and countries right now? Interested in MVP nominations' historical trends? 4 | 5 | The project collects information about active Microsoft Most Valuable Professionals from [official MVP web site](https://mvp.microsoft.com), and provides up-to-date and easy accessible statistics. 6 | 7 | Anonymous MVP stats, such as nominations in contribution areas and geography, is saved for historical purposes and exposed via publicly published Power BI report(s). 8 | 9 | ![MVP Monitor](./assets/mvp-monitor-promo.png) 10 | 11 | Have an idea of a metric to add? Please create an issue request. 12 | 13 | ## How it works 14 | 15 | ![Flow](./assets/how-it-works.png) 16 | 17 | 1. Node.js job scraps MVP site on schedule basis 18 | 2. Structured data is dumped to SharePoint list as JSON document 19 | 3. JSON is processed and used with Power BI 20 | 4. Reports are published to web and used on a static site hosted in GitHub pages 21 | -------------------------------------------------------------------------------- /assets/how-it-works.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/assets/how-it-works.png -------------------------------------------------------------------------------- /assets/how-it-works.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/assets/how-it-works.vsdx -------------------------------------------------------------------------------- /assets/mvp-monitor-promo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/assets/mvp-monitor-promo.png -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | MVP Monitor 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | Monitor beta 18 | about Microsoft MVP program 19 |
20 | 21 | 22 |
23 | GitHub 24 |
25 | Star 26 |
27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /docs/static/ga.js: -------------------------------------------------------------------------------- 1 | window.dataLayer = window.dataLayer || []; 2 | function gtag(){ dataLayer.push(arguments); } 3 | gtag('js', new Date()); 4 | gtag('config', 'UA-144726671-1'); -------------------------------------------------------------------------------- /docs/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/docs/static/logo.png -------------------------------------------------------------------------------- /docs/static/script.js: -------------------------------------------------------------------------------- 1 | function getReportType() { 2 | return window.innerWidth >= 1024 ? 'desktop' : 'mobile'; 3 | } 4 | 5 | function onReportLoad() { 6 | document.querySelector('.footer-stripe').hidden = true; 7 | } 8 | 9 | function getReportUrl(type) { 10 | var embedReports = { 11 | desktop: 'eyJrIjoiOGZkYTQxNzEtMmIyNC00ZjdlLTg2MDYtOTVjM2E5YjVjNmFmIiwidCI6IjY3Y2YyMDkyLTc4ZWEtNDhjNC05YWZiLTJlM2JlNzZjYjAxYyIsImMiOjl9', 12 | mobile: 'eyJrIjoiMDJkMmEyMDEtMmZlOS00YzE2LWFhMmYtMmZmODI2ZjMxMWNmIiwidCI6IjY3Y2YyMDkyLTc4ZWEtNDhjNC05YWZiLTJlM2JlNzZjYjAxYyIsImMiOjl9' 13 | }; 14 | return 'https://app.powerbi.com/view?r=' + embedReports[type]; 15 | } 16 | 17 | function setReportUrl(reportUrl) { 18 | document.querySelector('.footer-stripe').hidden = false; 19 | var iframe = document.querySelector('.power-bi'); 20 | iframe.setAttribute('src', reportUrl); 21 | } 22 | 23 | window.addEventListener('resize', function() { 24 | var reportUrl = getReportUrl(getReportType()); 25 | if (window.reportUrl !== reportUrl) { 26 | window.reportUrl = reportUrl; 27 | setReportUrl(window.reportUrl); 28 | } 29 | }); 30 | 31 | (function() { 32 | window.reportUrl = getReportUrl(getReportType()); 33 | setReportUrl(window.reportUrl); 34 | })(); 35 | -------------------------------------------------------------------------------- /docs/static/styles.css: -------------------------------------------------------------------------------- 1 | body, html { 2 | height: 100%; 3 | } 4 | body { 5 | margin: 0px; 6 | padding: 0px; 7 | background-color: #ffffff; 8 | color: #333333; 9 | font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; 10 | } 11 | .header { 12 | background-color: #0072c6; 13 | color: white; 14 | height: 52px; 15 | line-height: 52px; 16 | } 17 | .header .logo { 18 | padding-left: 20px; 19 | height: 52px; 20 | } 21 | .header .name { 22 | display: inline-block; 23 | vertical-align: top; 24 | font-size: 1.1em; 25 | font-weight: 500; 26 | } 27 | .header .beta { 28 | font-size: 0.6em; 29 | font-weight: 100; 30 | 31 | } 32 | .header .what-is-mvp { 33 | display: block; 34 | font-size: 0.8em; 35 | float: right; 36 | margin-right: 20px; 37 | color: #efefef; 38 | text-decoration: none; 39 | } 40 | .footer-stripe { 41 | background-color: #eaeaea; 42 | width: 100%; 43 | height: 36px; 44 | position: absolute; 45 | bottom: 0px; 46 | border-top: 1px solid #d0d0d0; 47 | z-index: 1; 48 | } 49 | .power-bi { 50 | width: 100%; 51 | height: calc(100% - 52px); 52 | border: 0px; 53 | position: absolute; 54 | } 55 | .github-info { 56 | position: absolute; 57 | bottom: 0px; 58 | right: 0px; 59 | padding-right: 15px; 60 | background-color: #eaeaea; 61 | border-top: 1px solid #d0d0d0; 62 | width: calc(50% - 90px); 63 | min-width: 170px; 64 | text-align: right; 65 | z-index: 1; 66 | } 67 | .github-link { 68 | cursor: pointer; 69 | font-family: 'Segoe UI Semibold',wf_segoe-ui_semibold,helvetica,arial,sans-serif; 70 | color: #000; 71 | display: inline-block; 72 | vertical-align: top; 73 | text-decoration: none; 74 | line-height: 36px; 75 | margin-right: 5px; 76 | font-weight: 600; 77 | font-size: 9pt; 78 | } 79 | .github-widget { 80 | display: inline-block; 81 | height: 36px; 82 | } 83 | .github-widget > span { 84 | display: block; 85 | margin-top: 4px; 86 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mvp-monitor", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.16.7", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 10 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.16.7" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.16.7", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 19 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.16.10", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", 25 | "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.16.7", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "ansi-styles": { 34 | "version": "3.2.1", 35 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 36 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 37 | "dev": true, 38 | "requires": { 39 | "color-convert": "^1.9.0" 40 | } 41 | }, 42 | "chalk": { 43 | "version": "2.4.2", 44 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 45 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 46 | "dev": true, 47 | "requires": { 48 | "ansi-styles": "^3.2.1", 49 | "escape-string-regexp": "^1.0.5", 50 | "supports-color": "^5.3.0" 51 | } 52 | }, 53 | "color-convert": { 54 | "version": "1.9.3", 55 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 56 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 57 | "dev": true, 58 | "requires": { 59 | "color-name": "1.1.3" 60 | } 61 | }, 62 | "color-name": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 65 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 66 | "dev": true 67 | }, 68 | "has-flag": { 69 | "version": "3.0.0", 70 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 71 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 72 | "dev": true 73 | }, 74 | "supports-color": { 75 | "version": "5.5.0", 76 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 77 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 78 | "dev": true, 79 | "requires": { 80 | "has-flag": "^3.0.0" 81 | } 82 | } 83 | } 84 | }, 85 | "@cspotcode/source-map-consumer": { 86 | "version": "0.8.0", 87 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", 88 | "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", 89 | "dev": true 90 | }, 91 | "@cspotcode/source-map-support": { 92 | "version": "0.7.0", 93 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", 94 | "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", 95 | "dev": true, 96 | "requires": { 97 | "@cspotcode/source-map-consumer": "0.8.0" 98 | } 99 | }, 100 | "@pnp/common-commonjs": { 101 | "version": "2.12.0", 102 | "resolved": "https://registry.npmjs.org/@pnp/common-commonjs/-/common-commonjs-2.12.0.tgz", 103 | "integrity": "sha512-NZOgX89EAK8IoJSUiWvZzPpmBnSfrP0eEZ8ryoMeQKXNs0qVLWdD4lTYRIezTNxCoyw01NSStvQlpdXU1Ur+3Q==", 104 | "requires": { 105 | "tslib": "2.3.0" 106 | } 107 | }, 108 | "@pnp/logging-commonjs": { 109 | "version": "2.12.0", 110 | "resolved": "https://registry.npmjs.org/@pnp/logging-commonjs/-/logging-commonjs-2.12.0.tgz", 111 | "integrity": "sha512-1OqR+JqcClEnbvozJbOWwBDF+/7k6kDDzDU/YKOZgDn5WfppUyAnbNA4Z1cuQlvqNQHFqiD9XznGredZIqozmQ==", 112 | "requires": { 113 | "tslib": "2.3.0" 114 | } 115 | }, 116 | "@pnp/odata-commonjs": { 117 | "version": "2.12.0", 118 | "resolved": "https://registry.npmjs.org/@pnp/odata-commonjs/-/odata-commonjs-2.12.0.tgz", 119 | "integrity": "sha512-bDpcww2dX6ds8FNMcXFTj73UFQ0z3lh2GaLtO5Fp9JRTQuC53BpIsHidhUfaBmW76KLtvDkVxaLKbuilH61bUg==", 120 | "requires": { 121 | "@pnp/common-commonjs": "2.12.0", 122 | "@pnp/logging-commonjs": "2.12.0", 123 | "tslib": "2.3.0" 124 | } 125 | }, 126 | "@pnp/sp-commonjs": { 127 | "version": "2.12.0", 128 | "resolved": "https://registry.npmjs.org/@pnp/sp-commonjs/-/sp-commonjs-2.12.0.tgz", 129 | "integrity": "sha512-M7BVuwKWPRP2t/OeDTcYRTw/VckDu+wjHfE62ADcfV+b0MfwuOYysK0WhjKxkoJfFehVf9EB0O+xj4DvV2iZZQ==", 130 | "requires": { 131 | "@pnp/common-commonjs": "2.12.0", 132 | "@pnp/logging-commonjs": "2.12.0", 133 | "@pnp/odata-commonjs": "2.12.0", 134 | "tslib": "2.3.0" 135 | } 136 | }, 137 | "@sindresorhus/is": { 138 | "version": "2.1.1", 139 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", 140 | "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==" 141 | }, 142 | "@szmarczak/http-timer": { 143 | "version": "4.0.6", 144 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", 145 | "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", 146 | "requires": { 147 | "defer-to-connect": "^2.0.0" 148 | } 149 | }, 150 | "@tsconfig/node10": { 151 | "version": "1.0.8", 152 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", 153 | "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", 154 | "dev": true 155 | }, 156 | "@tsconfig/node12": { 157 | "version": "1.0.9", 158 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", 159 | "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", 160 | "dev": true 161 | }, 162 | "@tsconfig/node14": { 163 | "version": "1.0.1", 164 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", 165 | "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", 166 | "dev": true 167 | }, 168 | "@tsconfig/node16": { 169 | "version": "1.0.2", 170 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", 171 | "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", 172 | "dev": true 173 | }, 174 | "@types/cacheable-request": { 175 | "version": "6.0.2", 176 | "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", 177 | "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", 178 | "requires": { 179 | "@types/http-cache-semantics": "*", 180 | "@types/keyv": "*", 181 | "@types/node": "*", 182 | "@types/responselike": "*" 183 | } 184 | }, 185 | "@types/cheerio": { 186 | "version": "0.22.31", 187 | "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.31.tgz", 188 | "integrity": "sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==", 189 | "dev": true, 190 | "requires": { 191 | "@types/node": "*" 192 | } 193 | }, 194 | "@types/cookie": { 195 | "version": "0.4.0", 196 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", 197 | "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" 198 | }, 199 | "@types/core-js": { 200 | "version": "2.5.3", 201 | "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.3.tgz", 202 | "integrity": "sha512-F9RHpjuPSit4dCCRXgi7XcqA01DAjy9QY+v9yICoxXsjXD9cgQpyZyL2eSZnTkBGXGaQnea8waZOZTogLDB+rA==" 203 | }, 204 | "@types/global-agent": { 205 | "version": "2.1.0", 206 | "resolved": "https://registry.npmjs.org/@types/global-agent/-/global-agent-2.1.0.tgz", 207 | "integrity": "sha512-xBOerse4Agekl7VZJclA9bfuA9aa3u9T24TDkBiMQrZgu4qe5HMBPzVGzAt2k4dx/v3uIFI6CzG0Z9X894LHrg==" 208 | }, 209 | "@types/http-cache-semantics": { 210 | "version": "4.0.1", 211 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 212 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" 213 | }, 214 | "@types/jsonwebtoken": { 215 | "version": "8.5.0", 216 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", 217 | "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", 218 | "requires": { 219 | "@types/node": "*" 220 | } 221 | }, 222 | "@types/keyv": { 223 | "version": "3.1.3", 224 | "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", 225 | "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", 226 | "requires": { 227 | "@types/node": "*" 228 | } 229 | }, 230 | "@types/lodash": { 231 | "version": "4.14.178", 232 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", 233 | "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" 234 | }, 235 | "@types/lodash.template": { 236 | "version": "4.5.0", 237 | "resolved": "https://registry.npmjs.org/@types/lodash.template/-/lodash.template-4.5.0.tgz", 238 | "integrity": "sha512-4LgHxK16IPbGR7TmXpPvNT7iNGsLCdQY6Rc0mi1a/JECt8et/D4hx6NMVAJej/d932sj1mJsg0QYHKL189O0Qw==", 239 | "requires": { 240 | "@types/lodash": "*" 241 | } 242 | }, 243 | "@types/node": { 244 | "version": "17.0.17", 245 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", 246 | "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==" 247 | }, 248 | "@types/node-fetch": { 249 | "version": "3.0.3", 250 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-3.0.3.tgz", 251 | "integrity": "sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g==", 252 | "dev": true, 253 | "requires": { 254 | "node-fetch": "*" 255 | } 256 | }, 257 | "@types/responselike": { 258 | "version": "1.0.0", 259 | "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", 260 | "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", 261 | "requires": { 262 | "@types/node": "*" 263 | } 264 | }, 265 | "acorn": { 266 | "version": "8.7.0", 267 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 268 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", 269 | "dev": true 270 | }, 271 | "acorn-walk": { 272 | "version": "8.2.0", 273 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 274 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 275 | "dev": true 276 | }, 277 | "ajv": { 278 | "version": "6.12.6", 279 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 280 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 281 | "requires": { 282 | "fast-deep-equal": "^3.1.1", 283 | "fast-json-stable-stringify": "^2.0.0", 284 | "json-schema-traverse": "^0.4.1", 285 | "uri-js": "^4.2.2" 286 | } 287 | }, 288 | "ansi-escapes": { 289 | "version": "4.3.2", 290 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 291 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 292 | "requires": { 293 | "type-fest": "^0.21.3" 294 | } 295 | }, 296 | "ansi-regex": { 297 | "version": "5.0.1", 298 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 299 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 300 | }, 301 | "ansi-styles": { 302 | "version": "4.3.0", 303 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 304 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 305 | "requires": { 306 | "color-convert": "^2.0.1" 307 | } 308 | }, 309 | "arg": { 310 | "version": "4.1.3", 311 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 312 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 313 | "dev": true 314 | }, 315 | "argparse": { 316 | "version": "1.0.10", 317 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 318 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 319 | "dev": true, 320 | "requires": { 321 | "sprintf-js": "~1.0.2" 322 | }, 323 | "dependencies": { 324 | "sprintf-js": { 325 | "version": "1.0.3", 326 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 327 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 328 | "dev": true 329 | } 330 | } 331 | }, 332 | "asn1": { 333 | "version": "0.2.6", 334 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 335 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 336 | "requires": { 337 | "safer-buffer": "~2.1.0" 338 | } 339 | }, 340 | "assert-plus": { 341 | "version": "1.0.0", 342 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 343 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 344 | }, 345 | "asynckit": { 346 | "version": "0.4.0", 347 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 348 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 349 | }, 350 | "aws-sign2": { 351 | "version": "0.7.0", 352 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 353 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 354 | }, 355 | "aws4": { 356 | "version": "1.11.0", 357 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 358 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 359 | }, 360 | "balanced-match": { 361 | "version": "1.0.2", 362 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 363 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 364 | "dev": true 365 | }, 366 | "bcrypt-pbkdf": { 367 | "version": "1.0.2", 368 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 369 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 370 | "requires": { 371 | "tweetnacl": "^0.14.3" 372 | } 373 | }, 374 | "boolbase": { 375 | "version": "1.0.0", 376 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 377 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 378 | }, 379 | "boolean": { 380 | "version": "3.1.4", 381 | "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", 382 | "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==" 383 | }, 384 | "brace-expansion": { 385 | "version": "1.1.11", 386 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 387 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 388 | "dev": true, 389 | "requires": { 390 | "balanced-match": "^1.0.0", 391 | "concat-map": "0.0.1" 392 | } 393 | }, 394 | "buffer-equal-constant-time": { 395 | "version": "1.0.1", 396 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 397 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 398 | }, 399 | "builtin-modules": { 400 | "version": "1.1.1", 401 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 402 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 403 | "dev": true 404 | }, 405 | "cacheable-lookup": { 406 | "version": "2.0.1", 407 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", 408 | "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", 409 | "requires": { 410 | "@types/keyv": "^3.1.1", 411 | "keyv": "^4.0.0" 412 | } 413 | }, 414 | "cacheable-request": { 415 | "version": "7.0.2", 416 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", 417 | "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", 418 | "requires": { 419 | "clone-response": "^1.0.2", 420 | "get-stream": "^5.1.0", 421 | "http-cache-semantics": "^4.0.0", 422 | "keyv": "^4.0.0", 423 | "lowercase-keys": "^2.0.0", 424 | "normalize-url": "^6.0.1", 425 | "responselike": "^2.0.0" 426 | } 427 | }, 428 | "caseless": { 429 | "version": "0.12.0", 430 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 431 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 432 | }, 433 | "chalk": { 434 | "version": "4.1.2", 435 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 436 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 437 | "requires": { 438 | "ansi-styles": "^4.1.0", 439 | "supports-color": "^7.1.0" 440 | } 441 | }, 442 | "chardet": { 443 | "version": "0.7.0", 444 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 445 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 446 | }, 447 | "cheerio": { 448 | "version": "1.0.0-rc.10", 449 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", 450 | "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", 451 | "requires": { 452 | "cheerio-select": "^1.5.0", 453 | "dom-serializer": "^1.3.2", 454 | "domhandler": "^4.2.0", 455 | "htmlparser2": "^6.1.0", 456 | "parse5": "^6.0.1", 457 | "parse5-htmlparser2-tree-adapter": "^6.0.1", 458 | "tslib": "^2.2.0" 459 | } 460 | }, 461 | "cheerio-select": { 462 | "version": "1.5.0", 463 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", 464 | "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", 465 | "requires": { 466 | "css-select": "^4.1.3", 467 | "css-what": "^5.0.1", 468 | "domelementtype": "^2.2.0", 469 | "domhandler": "^4.2.0", 470 | "domutils": "^2.7.0" 471 | } 472 | }, 473 | "cli-cursor": { 474 | "version": "3.1.0", 475 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 476 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 477 | "requires": { 478 | "restore-cursor": "^3.1.0" 479 | } 480 | }, 481 | "cli-width": { 482 | "version": "3.0.0", 483 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 484 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" 485 | }, 486 | "clone-response": { 487 | "version": "1.0.2", 488 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 489 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 490 | "requires": { 491 | "mimic-response": "^1.0.0" 492 | }, 493 | "dependencies": { 494 | "mimic-response": { 495 | "version": "1.0.1", 496 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 497 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 498 | } 499 | } 500 | }, 501 | "color-convert": { 502 | "version": "2.0.1", 503 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 504 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 505 | "requires": { 506 | "color-name": "~1.1.4" 507 | } 508 | }, 509 | "color-name": { 510 | "version": "1.1.4", 511 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 512 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 513 | }, 514 | "colors": { 515 | "version": "1.4.0", 516 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 517 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 518 | }, 519 | "combined-stream": { 520 | "version": "1.0.8", 521 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 522 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 523 | "requires": { 524 | "delayed-stream": "~1.0.0" 525 | } 526 | }, 527 | "commander": { 528 | "version": "5.1.0", 529 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 530 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" 531 | }, 532 | "concat-map": { 533 | "version": "0.0.1", 534 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 535 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 536 | "dev": true 537 | }, 538 | "cookie": { 539 | "version": "0.4.1", 540 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 541 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 542 | }, 543 | "core-js": { 544 | "version": "3.21.0", 545 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.0.tgz", 546 | "integrity": "sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==" 547 | }, 548 | "core-util-is": { 549 | "version": "1.0.2", 550 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 551 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 552 | }, 553 | "cpass": { 554 | "version": "2.3.0", 555 | "resolved": "https://registry.npmjs.org/cpass/-/cpass-2.3.0.tgz", 556 | "integrity": "sha512-iI0WSBupw1RQJGtYIT4Fa09ltF4I8acs6nCzsuuZm6gw6lPmIwCyfPZ8ji7C/icVGOpgU0r9goa1qRerdXCdPQ==", 557 | "requires": { 558 | "scmp": "^2.1.0" 559 | } 560 | }, 561 | "crc-32": { 562 | "version": "1.2.1", 563 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", 564 | "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", 565 | "requires": { 566 | "exit-on-epipe": "~1.0.1", 567 | "printj": "~1.3.1" 568 | } 569 | }, 570 | "create-require": { 571 | "version": "1.1.1", 572 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 573 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 574 | "dev": true 575 | }, 576 | "css-select": { 577 | "version": "4.2.1", 578 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", 579 | "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", 580 | "requires": { 581 | "boolbase": "^1.0.0", 582 | "css-what": "^5.1.0", 583 | "domhandler": "^4.3.0", 584 | "domutils": "^2.8.0", 585 | "nth-check": "^2.0.1" 586 | } 587 | }, 588 | "css-what": { 589 | "version": "5.1.0", 590 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", 591 | "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" 592 | }, 593 | "dashdash": { 594 | "version": "1.14.1", 595 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 596 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 597 | "requires": { 598 | "assert-plus": "^1.0.0" 599 | } 600 | }, 601 | "decompress-response": { 602 | "version": "5.0.0", 603 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", 604 | "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", 605 | "requires": { 606 | "mimic-response": "^2.0.0" 607 | } 608 | }, 609 | "defer-to-connect": { 610 | "version": "2.0.1", 611 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 612 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" 613 | }, 614 | "define-properties": { 615 | "version": "1.1.3", 616 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 617 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 618 | "requires": { 619 | "object-keys": "^1.0.12" 620 | } 621 | }, 622 | "delayed-stream": { 623 | "version": "1.0.0", 624 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 625 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 626 | }, 627 | "detect-node": { 628 | "version": "2.1.0", 629 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 630 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" 631 | }, 632 | "diff": { 633 | "version": "4.0.2", 634 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 635 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 636 | "dev": true 637 | }, 638 | "dom-serializer": { 639 | "version": "1.3.2", 640 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", 641 | "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", 642 | "requires": { 643 | "domelementtype": "^2.0.1", 644 | "domhandler": "^4.2.0", 645 | "entities": "^2.0.0" 646 | } 647 | }, 648 | "domelementtype": { 649 | "version": "2.2.0", 650 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", 651 | "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" 652 | }, 653 | "domhandler": { 654 | "version": "4.3.0", 655 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", 656 | "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", 657 | "requires": { 658 | "domelementtype": "^2.2.0" 659 | } 660 | }, 661 | "domutils": { 662 | "version": "2.8.0", 663 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 664 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 665 | "requires": { 666 | "dom-serializer": "^1.0.1", 667 | "domelementtype": "^2.2.0", 668 | "domhandler": "^4.2.0" 669 | } 670 | }, 671 | "duplexer3": { 672 | "version": "0.1.4", 673 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 674 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 675 | }, 676 | "ecc-jsbn": { 677 | "version": "0.1.2", 678 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 679 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 680 | "requires": { 681 | "jsbn": "~0.1.0", 682 | "safer-buffer": "^2.1.0" 683 | } 684 | }, 685 | "ecdsa-sig-formatter": { 686 | "version": "1.0.11", 687 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 688 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 689 | "requires": { 690 | "safe-buffer": "^5.0.1" 691 | } 692 | }, 693 | "emoji-regex": { 694 | "version": "8.0.0", 695 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 696 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 697 | }, 698 | "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 | "requires": { 703 | "once": "^1.4.0" 704 | } 705 | }, 706 | "entities": { 707 | "version": "2.2.0", 708 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 709 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" 710 | }, 711 | "es6-error": { 712 | "version": "4.1.1", 713 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 714 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" 715 | }, 716 | "escape-string-regexp": { 717 | "version": "1.0.5", 718 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 719 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 720 | }, 721 | "esprima": { 722 | "version": "4.0.1", 723 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 724 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 725 | "dev": true 726 | }, 727 | "exit-on-epipe": { 728 | "version": "1.0.1", 729 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", 730 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" 731 | }, 732 | "extend": { 733 | "version": "3.0.2", 734 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 735 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 736 | }, 737 | "external-editor": { 738 | "version": "3.1.0", 739 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 740 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 741 | "requires": { 742 | "chardet": "^0.7.0", 743 | "iconv-lite": "^0.4.24", 744 | "tmp": "^0.0.33" 745 | } 746 | }, 747 | "extsprintf": { 748 | "version": "1.3.0", 749 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 750 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 751 | }, 752 | "fast-deep-equal": { 753 | "version": "3.1.3", 754 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 755 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 756 | }, 757 | "fast-json-stable-stringify": { 758 | "version": "2.1.0", 759 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 760 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 761 | }, 762 | "figures": { 763 | "version": "3.2.0", 764 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 765 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 766 | "requires": { 767 | "escape-string-regexp": "^1.0.5" 768 | } 769 | }, 770 | "forever-agent": { 771 | "version": "0.6.1", 772 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 773 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 774 | }, 775 | "form-data": { 776 | "version": "2.3.3", 777 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 778 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 779 | "requires": { 780 | "asynckit": "^0.4.0", 781 | "combined-stream": "^1.0.6", 782 | "mime-types": "^2.1.12" 783 | } 784 | }, 785 | "fs.realpath": { 786 | "version": "1.0.0", 787 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 788 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 789 | "dev": true 790 | }, 791 | "function-bind": { 792 | "version": "1.1.1", 793 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 794 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 795 | "dev": true 796 | }, 797 | "get-stream": { 798 | "version": "5.2.0", 799 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 800 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 801 | "requires": { 802 | "pump": "^3.0.0" 803 | } 804 | }, 805 | "getpass": { 806 | "version": "0.1.7", 807 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 808 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 809 | "requires": { 810 | "assert-plus": "^1.0.0" 811 | } 812 | }, 813 | "glob": { 814 | "version": "7.2.0", 815 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 816 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 817 | "dev": true, 818 | "requires": { 819 | "fs.realpath": "^1.0.0", 820 | "inflight": "^1.0.4", 821 | "inherits": "2", 822 | "minimatch": "^3.0.4", 823 | "once": "^1.3.0", 824 | "path-is-absolute": "^1.0.0" 825 | } 826 | }, 827 | "global-agent": { 828 | "version": "2.1.12", 829 | "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", 830 | "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", 831 | "requires": { 832 | "boolean": "^3.0.1", 833 | "core-js": "^3.6.5", 834 | "es6-error": "^4.1.1", 835 | "matcher": "^3.0.0", 836 | "roarr": "^2.15.3", 837 | "semver": "^7.3.2", 838 | "serialize-error": "^7.0.1" 839 | } 840 | }, 841 | "globalthis": { 842 | "version": "1.0.2", 843 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", 844 | "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", 845 | "requires": { 846 | "define-properties": "^1.1.3" 847 | } 848 | }, 849 | "got": { 850 | "version": "10.7.0", 851 | "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", 852 | "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", 853 | "requires": { 854 | "@sindresorhus/is": "^2.0.0", 855 | "@szmarczak/http-timer": "^4.0.0", 856 | "@types/cacheable-request": "^6.0.1", 857 | "cacheable-lookup": "^2.0.0", 858 | "cacheable-request": "^7.0.1", 859 | "decompress-response": "^5.0.0", 860 | "duplexer3": "^0.1.4", 861 | "get-stream": "^5.0.0", 862 | "lowercase-keys": "^2.0.0", 863 | "mimic-response": "^2.1.0", 864 | "p-cancelable": "^2.0.0", 865 | "p-event": "^4.0.0", 866 | "responselike": "^2.0.0", 867 | "to-readable-stream": "^2.0.0", 868 | "type-fest": "^0.10.0" 869 | }, 870 | "dependencies": { 871 | "type-fest": { 872 | "version": "0.10.0", 873 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", 874 | "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" 875 | } 876 | } 877 | }, 878 | "har-schema": { 879 | "version": "2.0.0", 880 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 881 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 882 | }, 883 | "har-validator": { 884 | "version": "5.1.5", 885 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 886 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 887 | "requires": { 888 | "ajv": "^6.12.3", 889 | "har-schema": "^2.0.0" 890 | } 891 | }, 892 | "has": { 893 | "version": "1.0.3", 894 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 895 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 896 | "dev": true, 897 | "requires": { 898 | "function-bind": "^1.1.1" 899 | } 900 | }, 901 | "has-flag": { 902 | "version": "4.0.0", 903 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 904 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 905 | }, 906 | "htmlparser2": { 907 | "version": "6.1.0", 908 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 909 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 910 | "requires": { 911 | "domelementtype": "^2.0.1", 912 | "domhandler": "^4.0.0", 913 | "domutils": "^2.5.2", 914 | "entities": "^2.0.0" 915 | } 916 | }, 917 | "http-cache-semantics": { 918 | "version": "4.1.0", 919 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 920 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 921 | }, 922 | "http-signature": { 923 | "version": "1.2.0", 924 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 925 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 926 | "requires": { 927 | "assert-plus": "^1.0.0", 928 | "jsprim": "^1.2.2", 929 | "sshpk": "^1.7.0" 930 | } 931 | }, 932 | "iconv-lite": { 933 | "version": "0.4.24", 934 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 935 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 936 | "requires": { 937 | "safer-buffer": ">= 2.1.2 < 3" 938 | } 939 | }, 940 | "inflight": { 941 | "version": "1.0.6", 942 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 943 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 944 | "dev": true, 945 | "requires": { 946 | "once": "^1.3.0", 947 | "wrappy": "1" 948 | } 949 | }, 950 | "inherits": { 951 | "version": "2.0.4", 952 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 953 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 954 | "dev": true 955 | }, 956 | "inquirer": { 957 | "version": "7.3.3", 958 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", 959 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", 960 | "requires": { 961 | "ansi-escapes": "^4.2.1", 962 | "chalk": "^4.1.0", 963 | "cli-cursor": "^3.1.0", 964 | "cli-width": "^3.0.0", 965 | "external-editor": "^3.0.3", 966 | "figures": "^3.0.0", 967 | "lodash": "^4.17.19", 968 | "mute-stream": "0.0.8", 969 | "run-async": "^2.4.0", 970 | "rxjs": "^6.6.0", 971 | "string-width": "^4.1.0", 972 | "strip-ansi": "^6.0.0", 973 | "through": "^2.3.6" 974 | } 975 | }, 976 | "is-core-module": { 977 | "version": "2.8.1", 978 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 979 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 980 | "dev": true, 981 | "requires": { 982 | "has": "^1.0.3" 983 | } 984 | }, 985 | "is-fullwidth-code-point": { 986 | "version": "3.0.0", 987 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 988 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 989 | }, 990 | "is-typedarray": { 991 | "version": "1.0.0", 992 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 993 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 994 | }, 995 | "isstream": { 996 | "version": "0.1.2", 997 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 998 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 999 | }, 1000 | "js-tokens": { 1001 | "version": "4.0.0", 1002 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1003 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1004 | "dev": true 1005 | }, 1006 | "js-yaml": { 1007 | "version": "3.14.1", 1008 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1009 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1010 | "dev": true, 1011 | "requires": { 1012 | "argparse": "^1.0.7", 1013 | "esprima": "^4.0.0" 1014 | } 1015 | }, 1016 | "jsbn": { 1017 | "version": "0.1.1", 1018 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1019 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1020 | }, 1021 | "json-buffer": { 1022 | "version": "3.0.1", 1023 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1024 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 1025 | }, 1026 | "json-schema": { 1027 | "version": "0.4.0", 1028 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 1029 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 1030 | }, 1031 | "json-schema-traverse": { 1032 | "version": "0.4.1", 1033 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1034 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1035 | }, 1036 | "json-stringify-safe": { 1037 | "version": "5.0.1", 1038 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1039 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1040 | }, 1041 | "jsonwebtoken": { 1042 | "version": "8.5.1", 1043 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1044 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1045 | "requires": { 1046 | "jws": "^3.2.2", 1047 | "lodash.includes": "^4.3.0", 1048 | "lodash.isboolean": "^3.0.3", 1049 | "lodash.isinteger": "^4.0.4", 1050 | "lodash.isnumber": "^3.0.3", 1051 | "lodash.isplainobject": "^4.0.6", 1052 | "lodash.isstring": "^4.0.1", 1053 | "lodash.once": "^4.0.0", 1054 | "ms": "^2.1.1", 1055 | "semver": "^5.6.0" 1056 | }, 1057 | "dependencies": { 1058 | "semver": { 1059 | "version": "5.7.1", 1060 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1061 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1062 | } 1063 | } 1064 | }, 1065 | "jsprim": { 1066 | "version": "1.4.2", 1067 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 1068 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 1069 | "requires": { 1070 | "assert-plus": "1.0.0", 1071 | "extsprintf": "1.3.0", 1072 | "json-schema": "0.4.0", 1073 | "verror": "1.10.0" 1074 | } 1075 | }, 1076 | "jwa": { 1077 | "version": "1.4.1", 1078 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1079 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1080 | "requires": { 1081 | "buffer-equal-constant-time": "1.0.1", 1082 | "ecdsa-sig-formatter": "1.0.11", 1083 | "safe-buffer": "^5.0.1" 1084 | } 1085 | }, 1086 | "jws": { 1087 | "version": "3.2.2", 1088 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1089 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1090 | "requires": { 1091 | "jwa": "^1.4.1", 1092 | "safe-buffer": "^5.0.1" 1093 | } 1094 | }, 1095 | "keyv": { 1096 | "version": "4.1.1", 1097 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", 1098 | "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", 1099 | "requires": { 1100 | "json-buffer": "3.0.1" 1101 | } 1102 | }, 1103 | "lodash": { 1104 | "version": "4.17.21", 1105 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1106 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1107 | }, 1108 | "lodash._reinterpolate": { 1109 | "version": "3.0.0", 1110 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", 1111 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" 1112 | }, 1113 | "lodash.includes": { 1114 | "version": "4.3.0", 1115 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1116 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1117 | }, 1118 | "lodash.isboolean": { 1119 | "version": "3.0.3", 1120 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1121 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1122 | }, 1123 | "lodash.isinteger": { 1124 | "version": "4.0.4", 1125 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1126 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1127 | }, 1128 | "lodash.isnumber": { 1129 | "version": "3.0.3", 1130 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1131 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1132 | }, 1133 | "lodash.isplainobject": { 1134 | "version": "4.0.6", 1135 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1136 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1137 | }, 1138 | "lodash.isstring": { 1139 | "version": "4.0.1", 1140 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1141 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1142 | }, 1143 | "lodash.once": { 1144 | "version": "4.1.1", 1145 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1146 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1147 | }, 1148 | "lodash.template": { 1149 | "version": "4.5.0", 1150 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", 1151 | "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", 1152 | "requires": { 1153 | "lodash._reinterpolate": "^3.0.0", 1154 | "lodash.templatesettings": "^4.0.0" 1155 | } 1156 | }, 1157 | "lodash.templatesettings": { 1158 | "version": "4.2.0", 1159 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", 1160 | "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", 1161 | "requires": { 1162 | "lodash._reinterpolate": "^3.0.0" 1163 | } 1164 | }, 1165 | "lowercase-keys": { 1166 | "version": "2.0.0", 1167 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 1168 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" 1169 | }, 1170 | "lru-cache": { 1171 | "version": "6.0.0", 1172 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1173 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1174 | "requires": { 1175 | "yallist": "^4.0.0" 1176 | } 1177 | }, 1178 | "make-error": { 1179 | "version": "1.3.6", 1180 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1181 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1182 | "dev": true 1183 | }, 1184 | "matcher": { 1185 | "version": "3.0.0", 1186 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 1187 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 1188 | "requires": { 1189 | "escape-string-regexp": "^4.0.0" 1190 | }, 1191 | "dependencies": { 1192 | "escape-string-regexp": { 1193 | "version": "4.0.0", 1194 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1195 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 1196 | } 1197 | } 1198 | }, 1199 | "mime-db": { 1200 | "version": "1.51.0", 1201 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1202 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 1203 | }, 1204 | "mime-types": { 1205 | "version": "2.1.34", 1206 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1207 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1208 | "requires": { 1209 | "mime-db": "1.51.0" 1210 | } 1211 | }, 1212 | "mimic-fn": { 1213 | "version": "2.1.0", 1214 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1215 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 1216 | }, 1217 | "mimic-response": { 1218 | "version": "2.1.0", 1219 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 1220 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 1221 | }, 1222 | "minimatch": { 1223 | "version": "3.0.5", 1224 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", 1225 | "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", 1226 | "dev": true, 1227 | "requires": { 1228 | "brace-expansion": "^1.1.7" 1229 | } 1230 | }, 1231 | "minimist": { 1232 | "version": "1.2.5", 1233 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1234 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1235 | "dev": true 1236 | }, 1237 | "mkdirp": { 1238 | "version": "1.0.4", 1239 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1240 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 1241 | }, 1242 | "ms": { 1243 | "version": "2.1.3", 1244 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1245 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1246 | }, 1247 | "mute-stream": { 1248 | "version": "0.0.8", 1249 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1250 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 1251 | }, 1252 | "node-fetch": { 1253 | "version": "2.6.7", 1254 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1255 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1256 | "requires": { 1257 | "whatwg-url": "^5.0.0" 1258 | } 1259 | }, 1260 | "node-ntlm-client": { 1261 | "version": "0.1.2", 1262 | "resolved": "https://registry.npmjs.org/node-ntlm-client/-/node-ntlm-client-0.1.2.tgz", 1263 | "integrity": "sha1-bAXiNLDZGUuwh5kpSYxvE5YshHI=", 1264 | "requires": { 1265 | "extend": "^3.0.0", 1266 | "request": "^2.66.0" 1267 | } 1268 | }, 1269 | "node-sp-auth": { 1270 | "version": "3.0.4", 1271 | "resolved": "https://registry.npmjs.org/node-sp-auth/-/node-sp-auth-3.0.4.tgz", 1272 | "integrity": "sha512-bzkzNZyOSKq2lnyHfavnV9IrIdiBE9W8s9Fazo4Cea9efrxSVR7zZ686rOGscRhD9a49ZCtHbSF1y6QEYnBLCA==", 1273 | "requires": { 1274 | "@types/cookie": "0.4.0", 1275 | "@types/core-js": "2.5.3", 1276 | "@types/global-agent": "2.1.0", 1277 | "@types/jsonwebtoken": "8.5.0", 1278 | "@types/lodash.template": "4.5.0", 1279 | "@types/node": "14.0.13", 1280 | "cookie": "0.4.1", 1281 | "cpass": "2.3.0", 1282 | "global-agent": "2.1.12", 1283 | "got": "10.7.0", 1284 | "jsonwebtoken": "8.5.1", 1285 | "lodash.template": "4.5.0", 1286 | "node-ntlm-client": "0.1.2", 1287 | "node-sp-auth-config": "3.0.1", 1288 | "xmldoc": "1.1.2" 1289 | }, 1290 | "dependencies": { 1291 | "@types/node": { 1292 | "version": "14.0.13", 1293 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", 1294 | "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==" 1295 | }, 1296 | "node-sp-auth-config": { 1297 | "version": "3.0.1", 1298 | "resolved": "https://registry.npmjs.org/node-sp-auth-config/-/node-sp-auth-config-3.0.1.tgz", 1299 | "integrity": "sha512-pc+lQlOm4ksqhOqoH9rivFzpag4tt36NtufSh5tiKp6vWDtCFivMNLfy/n6s0oFnGxdKqd6slkRg6HLGT91S0A==", 1300 | "requires": { 1301 | "colors": "^1.4.0", 1302 | "commander": "^5.1.0", 1303 | "cpass": "^2.3.0", 1304 | "inquirer": "^7.2.0", 1305 | "mkdirp": "^1.0.4", 1306 | "node-sp-auth": "^3.0.0" 1307 | } 1308 | } 1309 | } 1310 | }, 1311 | "node-sp-auth-config": { 1312 | "version": "3.0.2", 1313 | "resolved": "https://registry.npmjs.org/node-sp-auth-config/-/node-sp-auth-config-3.0.2.tgz", 1314 | "integrity": "sha512-YpsqBBo9TKJepR3xq+ZqoPn27HngAGneWHm0bY551WGyTQaEvC6KHiAbBLfeO4wY7Yg0vR49S4q/sWWeiAR3Ow==", 1315 | "requires": { 1316 | "colors": "1.4.0", 1317 | "commander": "^5.1.0", 1318 | "cpass": "^2.3.0", 1319 | "inquirer": "^7.2.0", 1320 | "mkdirp": "^1.0.4", 1321 | "node-sp-auth": "^3.0.0" 1322 | } 1323 | }, 1324 | "normalize-url": { 1325 | "version": "6.1.0", 1326 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", 1327 | "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" 1328 | }, 1329 | "nth-check": { 1330 | "version": "2.0.1", 1331 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", 1332 | "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", 1333 | "requires": { 1334 | "boolbase": "^1.0.0" 1335 | } 1336 | }, 1337 | "oauth-sign": { 1338 | "version": "0.9.0", 1339 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1340 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1341 | }, 1342 | "object-keys": { 1343 | "version": "1.1.1", 1344 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1345 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1346 | }, 1347 | "once": { 1348 | "version": "1.4.0", 1349 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1350 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1351 | "requires": { 1352 | "wrappy": "1" 1353 | } 1354 | }, 1355 | "onetime": { 1356 | "version": "5.1.2", 1357 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1358 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1359 | "requires": { 1360 | "mimic-fn": "^2.1.0" 1361 | } 1362 | }, 1363 | "os-tmpdir": { 1364 | "version": "1.0.2", 1365 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1366 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1367 | }, 1368 | "p-cancelable": { 1369 | "version": "2.1.1", 1370 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", 1371 | "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" 1372 | }, 1373 | "p-event": { 1374 | "version": "4.2.0", 1375 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", 1376 | "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", 1377 | "requires": { 1378 | "p-timeout": "^3.1.0" 1379 | } 1380 | }, 1381 | "p-finally": { 1382 | "version": "1.0.0", 1383 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1384 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1385 | }, 1386 | "p-timeout": { 1387 | "version": "3.2.0", 1388 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", 1389 | "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", 1390 | "requires": { 1391 | "p-finally": "^1.0.0" 1392 | } 1393 | }, 1394 | "parse5": { 1395 | "version": "6.0.1", 1396 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 1397 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" 1398 | }, 1399 | "parse5-htmlparser2-tree-adapter": { 1400 | "version": "6.0.1", 1401 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", 1402 | "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", 1403 | "requires": { 1404 | "parse5": "^6.0.1" 1405 | } 1406 | }, 1407 | "path-is-absolute": { 1408 | "version": "1.0.1", 1409 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1410 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1411 | "dev": true 1412 | }, 1413 | "path-parse": { 1414 | "version": "1.0.7", 1415 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1416 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1417 | "dev": true 1418 | }, 1419 | "performance-now": { 1420 | "version": "2.1.0", 1421 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1422 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1423 | }, 1424 | "printj": { 1425 | "version": "1.3.1", 1426 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", 1427 | "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==" 1428 | }, 1429 | "psl": { 1430 | "version": "1.8.0", 1431 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1432 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1433 | }, 1434 | "pump": { 1435 | "version": "3.0.0", 1436 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1437 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1438 | "requires": { 1439 | "end-of-stream": "^1.1.0", 1440 | "once": "^1.3.1" 1441 | } 1442 | }, 1443 | "punycode": { 1444 | "version": "2.1.1", 1445 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1446 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1447 | }, 1448 | "qs": { 1449 | "version": "6.5.3", 1450 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1451 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" 1452 | }, 1453 | "request": { 1454 | "version": "2.88.2", 1455 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1456 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1457 | "requires": { 1458 | "aws-sign2": "~0.7.0", 1459 | "aws4": "^1.8.0", 1460 | "caseless": "~0.12.0", 1461 | "combined-stream": "~1.0.6", 1462 | "extend": "~3.0.2", 1463 | "forever-agent": "~0.6.1", 1464 | "form-data": "~2.3.2", 1465 | "har-validator": "~5.1.3", 1466 | "http-signature": "~1.2.0", 1467 | "is-typedarray": "~1.0.0", 1468 | "isstream": "~0.1.2", 1469 | "json-stringify-safe": "~5.0.1", 1470 | "mime-types": "~2.1.19", 1471 | "oauth-sign": "~0.9.0", 1472 | "performance-now": "^2.1.0", 1473 | "qs": "~6.5.2", 1474 | "safe-buffer": "^5.1.2", 1475 | "tough-cookie": "~2.5.0", 1476 | "tunnel-agent": "^0.6.0", 1477 | "uuid": "^3.3.2" 1478 | } 1479 | }, 1480 | "resolve": { 1481 | "version": "1.22.0", 1482 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1483 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1484 | "dev": true, 1485 | "requires": { 1486 | "is-core-module": "^2.8.1", 1487 | "path-parse": "^1.0.7", 1488 | "supports-preserve-symlinks-flag": "^1.0.0" 1489 | } 1490 | }, 1491 | "responselike": { 1492 | "version": "2.0.0", 1493 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", 1494 | "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", 1495 | "requires": { 1496 | "lowercase-keys": "^2.0.0" 1497 | } 1498 | }, 1499 | "restore-cursor": { 1500 | "version": "3.1.0", 1501 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1502 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1503 | "requires": { 1504 | "onetime": "^5.1.0", 1505 | "signal-exit": "^3.0.2" 1506 | } 1507 | }, 1508 | "roarr": { 1509 | "version": "2.15.4", 1510 | "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", 1511 | "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", 1512 | "requires": { 1513 | "boolean": "^3.0.1", 1514 | "detect-node": "^2.0.4", 1515 | "globalthis": "^1.0.1", 1516 | "json-stringify-safe": "^5.0.1", 1517 | "semver-compare": "^1.0.0", 1518 | "sprintf-js": "^1.1.2" 1519 | } 1520 | }, 1521 | "run-async": { 1522 | "version": "2.4.1", 1523 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1524 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 1525 | }, 1526 | "rxjs": { 1527 | "version": "6.6.7", 1528 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1529 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1530 | "requires": { 1531 | "tslib": "^1.9.0" 1532 | }, 1533 | "dependencies": { 1534 | "tslib": { 1535 | "version": "1.14.1", 1536 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1537 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1538 | } 1539 | } 1540 | }, 1541 | "safe-buffer": { 1542 | "version": "5.2.1", 1543 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1544 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1545 | }, 1546 | "safer-buffer": { 1547 | "version": "2.1.2", 1548 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1549 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1550 | }, 1551 | "sax": { 1552 | "version": "1.2.4", 1553 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1554 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1555 | }, 1556 | "scmp": { 1557 | "version": "2.1.0", 1558 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", 1559 | "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" 1560 | }, 1561 | "semver": { 1562 | "version": "7.3.5", 1563 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1564 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1565 | "requires": { 1566 | "lru-cache": "^6.0.0" 1567 | } 1568 | }, 1569 | "semver-compare": { 1570 | "version": "1.0.0", 1571 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 1572 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" 1573 | }, 1574 | "serialize-error": { 1575 | "version": "7.0.1", 1576 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", 1577 | "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", 1578 | "requires": { 1579 | "type-fest": "^0.13.1" 1580 | }, 1581 | "dependencies": { 1582 | "type-fest": { 1583 | "version": "0.13.1", 1584 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 1585 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" 1586 | } 1587 | } 1588 | }, 1589 | "signal-exit": { 1590 | "version": "3.0.7", 1591 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1592 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1593 | }, 1594 | "sp-pnp-node": { 1595 | "version": "3.0.1", 1596 | "resolved": "https://registry.npmjs.org/sp-pnp-node/-/sp-pnp-node-3.0.1.tgz", 1597 | "integrity": "sha512-gT7Dg7Pnsn6EVLV6JeSQ+tBK0VM3IQGU/uO1nqvXeNK0jMHQgktlr6Q9iK/5Y6JEXp/qcnXGyN6rgvIU6y30Eg==", 1598 | "requires": { 1599 | "crc-32": "^1.2.0", 1600 | "node-fetch": "^2.6.1", 1601 | "node-sp-auth-config": "^3.0.1" 1602 | }, 1603 | "dependencies": { 1604 | "node-fetch": { 1605 | "version": "2.6.7", 1606 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1607 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1608 | "requires": { 1609 | "whatwg-url": "^5.0.0" 1610 | } 1611 | } 1612 | } 1613 | }, 1614 | "sprintf-js": { 1615 | "version": "1.1.2", 1616 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 1617 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 1618 | }, 1619 | "sshpk": { 1620 | "version": "1.17.0", 1621 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", 1622 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", 1623 | "requires": { 1624 | "asn1": "~0.2.3", 1625 | "assert-plus": "^1.0.0", 1626 | "bcrypt-pbkdf": "^1.0.0", 1627 | "dashdash": "^1.12.0", 1628 | "ecc-jsbn": "~0.1.1", 1629 | "getpass": "^0.1.1", 1630 | "jsbn": "~0.1.0", 1631 | "safer-buffer": "^2.0.2", 1632 | "tweetnacl": "~0.14.0" 1633 | } 1634 | }, 1635 | "string-width": { 1636 | "version": "4.2.3", 1637 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1638 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1639 | "requires": { 1640 | "emoji-regex": "^8.0.0", 1641 | "is-fullwidth-code-point": "^3.0.0", 1642 | "strip-ansi": "^6.0.1" 1643 | } 1644 | }, 1645 | "strip-ansi": { 1646 | "version": "6.0.1", 1647 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1648 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1649 | "requires": { 1650 | "ansi-regex": "^5.0.1" 1651 | } 1652 | }, 1653 | "supports-color": { 1654 | "version": "7.2.0", 1655 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1656 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1657 | "requires": { 1658 | "has-flag": "^4.0.0" 1659 | } 1660 | }, 1661 | "supports-preserve-symlinks-flag": { 1662 | "version": "1.0.0", 1663 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1664 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1665 | "dev": true 1666 | }, 1667 | "through": { 1668 | "version": "2.3.8", 1669 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1670 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1671 | }, 1672 | "tmp": { 1673 | "version": "0.0.33", 1674 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1675 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1676 | "requires": { 1677 | "os-tmpdir": "~1.0.2" 1678 | } 1679 | }, 1680 | "to-readable-stream": { 1681 | "version": "2.1.0", 1682 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", 1683 | "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==" 1684 | }, 1685 | "tough-cookie": { 1686 | "version": "2.5.0", 1687 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1688 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1689 | "requires": { 1690 | "psl": "^1.1.28", 1691 | "punycode": "^2.1.1" 1692 | } 1693 | }, 1694 | "tr46": { 1695 | "version": "0.0.3", 1696 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1697 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1698 | }, 1699 | "ts-node": { 1700 | "version": "10.5.0", 1701 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.5.0.tgz", 1702 | "integrity": "sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw==", 1703 | "dev": true, 1704 | "requires": { 1705 | "@cspotcode/source-map-support": "0.7.0", 1706 | "@tsconfig/node10": "^1.0.7", 1707 | "@tsconfig/node12": "^1.0.7", 1708 | "@tsconfig/node14": "^1.0.0", 1709 | "@tsconfig/node16": "^1.0.2", 1710 | "acorn": "^8.4.1", 1711 | "acorn-walk": "^8.1.1", 1712 | "arg": "^4.1.0", 1713 | "create-require": "^1.1.0", 1714 | "diff": "^4.0.1", 1715 | "make-error": "^1.1.1", 1716 | "v8-compile-cache-lib": "^3.0.0", 1717 | "yn": "3.1.1" 1718 | } 1719 | }, 1720 | "tslib": { 1721 | "version": "2.3.0", 1722 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 1723 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 1724 | }, 1725 | "tslint": { 1726 | "version": "6.1.3", 1727 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", 1728 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", 1729 | "dev": true, 1730 | "requires": { 1731 | "@babel/code-frame": "^7.0.0", 1732 | "builtin-modules": "^1.1.1", 1733 | "chalk": "^2.3.0", 1734 | "commander": "^2.12.1", 1735 | "diff": "^4.0.1", 1736 | "glob": "^7.1.1", 1737 | "js-yaml": "^3.13.1", 1738 | "minimatch": "^3.0.4", 1739 | "mkdirp": "^0.5.3", 1740 | "resolve": "^1.3.2", 1741 | "semver": "^5.3.0", 1742 | "tslib": "^1.13.0", 1743 | "tsutils": "^2.29.0" 1744 | }, 1745 | "dependencies": { 1746 | "ansi-styles": { 1747 | "version": "3.2.1", 1748 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1749 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1750 | "dev": true, 1751 | "requires": { 1752 | "color-convert": "^1.9.0" 1753 | } 1754 | }, 1755 | "chalk": { 1756 | "version": "2.4.2", 1757 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1758 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1759 | "dev": true, 1760 | "requires": { 1761 | "ansi-styles": "^3.2.1", 1762 | "escape-string-regexp": "^1.0.5", 1763 | "supports-color": "^5.3.0" 1764 | } 1765 | }, 1766 | "color-convert": { 1767 | "version": "1.9.3", 1768 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1769 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1770 | "dev": true, 1771 | "requires": { 1772 | "color-name": "1.1.3" 1773 | } 1774 | }, 1775 | "color-name": { 1776 | "version": "1.1.3", 1777 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1778 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1779 | "dev": true 1780 | }, 1781 | "commander": { 1782 | "version": "2.20.3", 1783 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1784 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1785 | "dev": true 1786 | }, 1787 | "has-flag": { 1788 | "version": "3.0.0", 1789 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1790 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1791 | "dev": true 1792 | }, 1793 | "mkdirp": { 1794 | "version": "0.5.5", 1795 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1796 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1797 | "dev": true, 1798 | "requires": { 1799 | "minimist": "^1.2.5" 1800 | } 1801 | }, 1802 | "semver": { 1803 | "version": "5.7.1", 1804 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1805 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1806 | "dev": true 1807 | }, 1808 | "supports-color": { 1809 | "version": "5.5.0", 1810 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1811 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1812 | "dev": true, 1813 | "requires": { 1814 | "has-flag": "^3.0.0" 1815 | } 1816 | }, 1817 | "tslib": { 1818 | "version": "1.14.1", 1819 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1820 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1821 | "dev": true 1822 | } 1823 | } 1824 | }, 1825 | "tsutils": { 1826 | "version": "2.29.0", 1827 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1828 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1829 | "dev": true, 1830 | "requires": { 1831 | "tslib": "^1.8.1" 1832 | }, 1833 | "dependencies": { 1834 | "tslib": { 1835 | "version": "1.14.1", 1836 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1837 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1838 | "dev": true 1839 | } 1840 | } 1841 | }, 1842 | "tunnel-agent": { 1843 | "version": "0.6.0", 1844 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1845 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1846 | "requires": { 1847 | "safe-buffer": "^5.0.1" 1848 | } 1849 | }, 1850 | "tweetnacl": { 1851 | "version": "0.14.5", 1852 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1853 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1854 | }, 1855 | "type-fest": { 1856 | "version": "0.21.3", 1857 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1858 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" 1859 | }, 1860 | "typescript": { 1861 | "version": "4.5.5", 1862 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", 1863 | "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", 1864 | "dev": true 1865 | }, 1866 | "uri-js": { 1867 | "version": "4.4.1", 1868 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1869 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1870 | "requires": { 1871 | "punycode": "^2.1.0" 1872 | } 1873 | }, 1874 | "uuid": { 1875 | "version": "3.4.0", 1876 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1877 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1878 | }, 1879 | "v8-compile-cache-lib": { 1880 | "version": "3.0.0", 1881 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", 1882 | "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", 1883 | "dev": true 1884 | }, 1885 | "verror": { 1886 | "version": "1.10.0", 1887 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1888 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1889 | "requires": { 1890 | "assert-plus": "^1.0.0", 1891 | "core-util-is": "1.0.2", 1892 | "extsprintf": "^1.2.0" 1893 | } 1894 | }, 1895 | "webidl-conversions": { 1896 | "version": "3.0.1", 1897 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1898 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1899 | }, 1900 | "whatwg-url": { 1901 | "version": "5.0.0", 1902 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1903 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1904 | "requires": { 1905 | "tr46": "~0.0.3", 1906 | "webidl-conversions": "^3.0.0" 1907 | } 1908 | }, 1909 | "wrappy": { 1910 | "version": "1.0.2", 1911 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1912 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1913 | }, 1914 | "xmldoc": { 1915 | "version": "1.1.2", 1916 | "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", 1917 | "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", 1918 | "requires": { 1919 | "sax": "^1.2.1" 1920 | } 1921 | }, 1922 | "yallist": { 1923 | "version": "4.0.0", 1924 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1925 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1926 | }, 1927 | "yn": { 1928 | "version": "3.1.1", 1929 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1930 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1931 | "dev": true 1932 | } 1933 | } 1934 | } 1935 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mvp-monitor", 3 | "version": "1.0.0", 4 | "description": "Microsoft MVP Monitor", 5 | "main": "index.js", 6 | "scripts": { 7 | "grab": "node ./dist", 8 | "grab-ts": "ts-node ./src", 9 | "build": "tslint -p . && tsc -p .", 10 | "pnp:deploy": "powershell ./provisioning/Deploy.ps1", 11 | "pnp:connect": "sp-auth init --path ./config/private.json" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/koltyakov/mvp-monitor.git" 16 | }, 17 | "author": "", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/koltyakov/mvp-monitor/issues" 21 | }, 22 | "homepage": "https://github.com/koltyakov/mvp-monitor#readme", 23 | "devDependencies": { 24 | "@types/cheerio": "^0.22.31", 25 | "@types/node": "^17.0.17", 26 | "@types/node-fetch": "^3.0.3", 27 | "ts-node": "^10.5.0", 28 | "tslint": "^6.1.3", 29 | "typescript": "^4.5.5" 30 | }, 31 | "dependencies": { 32 | "@pnp/sp-commonjs": "^2.12.0", 33 | "cheerio": "^1.0.0-rc.10", 34 | "crc-32": "^1.2.1", 35 | "node-fetch": "^2.6.7", 36 | "node-sp-auth-config": "^3.0.2", 37 | "sp-pnp-node": "^3.0.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /provisioning/Deploy.ps1: -------------------------------------------------------------------------------- 1 | [CmdletBinding()] 2 | Param( 3 | [Parameter(Mandatory=$False)] 4 | [string]$Template = "$PSScriptRoot\templates\Model.xml", 5 | 6 | [Parameter(Mandatory=$False)] 7 | [string]$Handlers = "All" 8 | ); 9 | 10 | Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force; 11 | 12 | . "$PSScriptRoot\Settings.ps1"; 13 | . "$PSScriptRoot\lib\Functions.ps1"; 14 | 15 | # Private config 16 | $PrivateFilePath = If ($env:PRIVATE_JSON) { $env:PRIVATE_JSON } Else { "$PSScriptRoot\..\config\private.json" } # env var or default setting 17 | Try { Resolve-Path -Path $PrivateFilePath -ErrorAction Stop | Out-Null; } Catch { sp-auth init -p $PrivateFilePath; } # test path if no private file start wizard 18 | 19 | $SETTINGS_PrivateFilePath = Resolve-Path -Path $PrivateFilePath; # Private connection config file path 20 | 21 | Set-PnPTraceLog -on -level Debug; 22 | 23 | $StartTime = Get-Date; 24 | 25 | $Context = Get-SpAuthContext $SETTINGS_PrivateFilePath; 26 | $Connection = Get-SpConnection $Context.siteUrl $Context; 27 | 28 | Print-InfoMessage "Applying template to $($Context.siteUrl)"; 29 | 30 | Apply-PnPProvisioningTemplate ` 31 | -Path $Template ` 32 | -ProvisionContentTypesToSubWebs:$True ` 33 | -ProvisionFieldsToSubWebs:$True ` 34 | -Connection $Connection ` 35 | -Handlers $Handlers; 36 | 37 | $EndTime = Get-Date; 38 | $TimeSpan = New-TimeSpan $StartTime $EndTime; 39 | Print-SuccessMessage "Execution time: $timespan"; 40 | -------------------------------------------------------------------------------- /provisioning/Install.ps1: -------------------------------------------------------------------------------- 1 | [CmdletBinding()] 2 | Param( 3 | [Parameter(Mandatory=$False,Position=1)] 4 | [string]$Module = "SPO" 5 | ); 6 | 7 | Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force; 8 | 9 | . "$PSScriptRoot\lib\Functions.ps1"; 10 | 11 | Install-PackageProvider -Name NuGet -Force -Scope "CurrentUser" | Out-Null; 12 | 13 | $PnPModuleName = "SharePointPnPPowerShell$Module"; 14 | 15 | $modules = Get-Module -Name $PnPModuleName -ListAvailable; 16 | If ($null -eq $modules) { 17 | $rmod = Get-Module -Name SharePointPnPPowerShell* -ListAvailable; 18 | If ($null -ne $rmod) { 19 | Remove-Module -ModuleInfo $rmod -Force; 20 | Uninstall-Module -Name $rmod.Name; 21 | } 22 | Install-Module -Name $PnPModuleName -Scope CurrentUser -Force -MaximumVersion 2.28.1807.0; 23 | Import-Module -Name $PnPModuleName -DisableNameChecking; 24 | } 25 | 26 | # Additional dependencies 27 | $Dependencies = @( 28 | "Set-PsEnv" 29 | ); 30 | 31 | Foreach ($Module in $Dependencies) { 32 | Install-CustomModule($Module) 33 | } 34 | -------------------------------------------------------------------------------- /provisioning/Settings.ps1: -------------------------------------------------------------------------------- 1 | . "$PSScriptRoot\lib\Functions.ps1"; 2 | 3 | # Read .env from the root 4 | Set-PsEnv; 5 | -------------------------------------------------------------------------------- /provisioning/lib/Functions.ps1: -------------------------------------------------------------------------------- 1 | . "$PSScriptRoot\Functions\PsUtils.ps1"; 2 | . "$PSScriptRoot\Functions\JsConfigs.ps1"; 3 | . "$PSScriptRoot\Functions\AuthContext.ps1"; 4 | -------------------------------------------------------------------------------- /provisioning/lib/Functions/AuthContext.ps1: -------------------------------------------------------------------------------- 1 | Function Get-SpAuthContext { 2 | [CmdletBinding()] 3 | 4 | param ( 5 | [Parameter(Mandatory=$False)] 6 | [string] $Path = ".\config\private.json" 7 | ); 8 | 9 | Process { 10 | Write-Host "Auth config locations:" $Path 11 | 12 | $Context = $null; 13 | 14 | $env:SPAUTH_ENV = "production"; # Prevent SPAuth interactive mode 15 | $SpAuthRead = ".\node_modules\.bin\sp-auth read -p ""$Path"""; 16 | 17 | if (Test-Path $Path) { 18 | 19 | # Write-Host $SpAuthRead; 20 | 21 | $Context = Invoke-Expression $SpAuthRead | ConvertFrom-Json; 22 | 23 | $AppId = $Context.authOptions.clientId; 24 | if ($null -ne $AppId) 25 | { 26 | $AppSecret = $Context.authOptions.clientSecret; 27 | $Context | Add-Member -NotePropertyName AppId -NotePropertyValue $AppId; 28 | $Context | Add-Member -NotePropertyName AppSecret -NotePropertyValue $AppSecret; 29 | } 30 | 31 | $Username = $Context.authOptions.username; 32 | if ($null -ne $Username) 33 | { 34 | $Password = $Context.authOptions.password; 35 | $secPassword = ConvertTo-SecureString -String $Password -AsPlainText -Force; 36 | $Credentials = New-Object System.Management.Automation.PSCredential ($Username, $secPassword); 37 | $Context | Add-Member -NotePropertyName Credentials -NotePropertyValue $Credentials; 38 | } 39 | 40 | $TenantHostUrl = ([System.Uri]$Context.siteUrl).Scheme + "://" + ([System.Uri]$Context.siteUrl).IdnHost; 41 | $TenantAdminUrl = $TenantHostUrl.Replace(".sharepoint.com", "-admin.sharepoint.com"); 42 | 43 | $Context | Add-Member -NotePropertyName TenantHostUrl -NotePropertyValue $TenantHostUrl; 44 | $Context | Add-Member -NotePropertyName TenantAdminUrl -NotePropertyValue $TenantAdminUrl; 45 | } 46 | 47 | $Context; 48 | } 49 | } 50 | 51 | Function Get-SpConnection { 52 | [CmdletBinding()] 53 | 54 | param ( 55 | [Parameter(Mandatory=$True)] 56 | [string] $Url, 57 | [Parameter(Mandatory=$True)] 58 | [PSObject] $Context 59 | ); 60 | 61 | Process { 62 | if ($null -ne $Context.Credentials) 63 | { 64 | $Connection = Connect-PnPOnline -Url $Url -Credentials $Context.Credentials -ReturnConnection; 65 | } 66 | 67 | if ($null -ne $Context.AppId) 68 | { 69 | $Connection = Connect-PnPOnline -Url $Url -AppId $Context.AppId -AppSecret $Context.AppSecret -ReturnConnection; 70 | } 71 | 72 | if ($null -eq $Connection) 73 | { 74 | $Connection = Connect-PnPOnline -Url $Url -UseWebLogin -ReturnConnection; 75 | } 76 | 77 | $Connection; 78 | } 79 | } -------------------------------------------------------------------------------- /provisioning/lib/Functions/JsConfigs.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | const [ root, conf ] = process.argv.slice(2); 4 | 5 | const json = require(path.join(root, conf)); 6 | 7 | console.log(JSON.stringify(json).toString('utf8')); -------------------------------------------------------------------------------- /provisioning/lib/Functions/JsConfigs.ps1: -------------------------------------------------------------------------------- 1 | Function Read-JsConfig { 2 | [CmdletBinding()] 3 | param ( 4 | [Parameter(Mandatory=$True)] 5 | [string] $ConfigPath 6 | ); 7 | 8 | Process { 9 | If ($ConfigPath.EndsWith(".js")) { 10 | $JSON = Invoke-Expression "node $PSScriptRoot\JsConfigs.js $((Get-Location).Path) $ConfigPath" | ConvertFrom-Json; 11 | } 12 | Else { 13 | $JSON = Get-Content $ConfigPath -Encoding UTF8 | ConvertFrom-Json; 14 | } 15 | $JSON; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /provisioning/lib/Functions/PsUtils.ps1: -------------------------------------------------------------------------------- 1 | Function Print-InfoMessage($message) { 2 | Write-Host -Foregroundcolor Cyan $message 3 | } 4 | 5 | Function Print-SuccessMessage($message) { 6 | Write-Host -Foregroundcolor Green $message; 7 | } 8 | 9 | Function Print-WarningMessage($message) { 10 | Write-Host -Foregroundcolor Yellow $message; 11 | } 12 | 13 | Function Print-ErrorMessage($message) { 14 | Write-Host -Foregroundcolor Red ""; 15 | Write-Host -Foregroundcolor Red "There was an error running the script. "; 16 | Write-Host -Foregroundcolor Red $message; 17 | Write-Host -Foregroundcolor Red ""; 18 | } 19 | 20 | Function Install-CustomModule { 21 | [CmdletBinding()] 22 | 23 | param ( 24 | [Parameter(Mandatory=$True)] 25 | [string] $PsModuleName 26 | ); 27 | 28 | Process { 29 | $modules = Get-Module -Name $PsModuleName -ListAvailable; 30 | If ($null -eq $modules) { 31 | # Remove other PnP Versiong if it is PnP module 32 | If ($PsModuleName.Contains("SharePointPnPPowerShell")) { 33 | $rmod = Get-Module -Name SharePointPnPPowerShell* -ListAvailable; 34 | If ($null -ne $rmod) { 35 | Remove-Module -ModuleInfo $rmod -Force; 36 | Uninstall-Module -Name $rmod.Name; 37 | } 38 | } 39 | Install-Module -Name $PsModuleName -Scope CurrentUser -Force; 40 | Import-Module -Name $PsModuleName -DisableNameChecking; 41 | } 42 | } 43 | } 44 | 45 | Function Upgrade-CustomModule { 46 | [CmdletBinding()] 47 | 48 | param ( 49 | [Parameter(Mandatory=$True)] 50 | [string] $PsModuleName 51 | ); 52 | 53 | Process { 54 | $modules = Get-Module -Name $PsModuleName -ListAvailable; 55 | If ($null -eq $modules) { 56 | # Remove other PnP Versiong if it is PnP module 57 | If ($PsModuleName.Contains("SharePointPnPPowerShell")) { 58 | $rmod = Get-Module -Name SharePointPnPPowerShell* -ListAvailable; 59 | If ($null -ne $rmod) { 60 | Remove-Module -ModuleInfo $rmod -Force; 61 | Uninstall-Module -Name $rmod.Name; 62 | } 63 | } 64 | Install-Module -Name $PsModuleName -Scope CurrentUser -Force; 65 | Import-Module -Name $PsModuleName -DisableNameChecking; 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /provisioning/script/clean.pnp.ts: -------------------------------------------------------------------------------- 1 | import { sp } from '@pnp/sp'; 2 | 3 | const solutionName = `MVP-MONITOR`; 4 | 5 | (async () => { 6 | const web = sp.web; 7 | 8 | console.log(`\nLists`); 9 | const lists = await web.lists 10 | .get() 11 | .then(ll => ll.filter(l => l.Description.indexOf(solutionName) !== -1)); 12 | for (const list of lists) { 13 | console.log(` ${list.Title}`); 14 | await web.lists.getById(list.Id).delete(); 15 | } 16 | 17 | console.log(`\nContent types`); 18 | const cts = await web.contentTypes.filter(`Group eq '${solutionName}'`).get(); 19 | for (const ct of cts) { 20 | console.log(` ${ct.Name}`); 21 | await web.contentTypes 22 | .getById(ct.Id.StringValue) 23 | .delete() 24 | .catch(_ => { 25 | console.log(` Rerun needed, as ${ct.Name} is used for inheritence`); 26 | }); 27 | } 28 | 29 | console.log(`\nFields`); 30 | const fields = await web.fields.filter(`Group eq '${solutionName}'`).get(); 31 | for (const field of fields) { 32 | console.log(` ${field.Title}`); 33 | await web.fields.getById(field.Id).delete(); 34 | } 35 | 36 | console.log('\nDone'); 37 | 38 | })().catch(console.warn); 39 | -------------------------------------------------------------------------------- /provisioning/templates/Model.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | MVP-MONITOR 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /reports/mvp-stats-mobile.pbix: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/reports/mvp-stats-mobile.pbix -------------------------------------------------------------------------------- /reports/mvp-stats.pbix: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koltyakov/mvp-monitor/b23c78b94a865e0fd51f682be767f526bfab3d8e/reports/mvp-stats.pbix -------------------------------------------------------------------------------- /src/api.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import { load } from 'cheerio'; 3 | 4 | import { handleResponse, timeoutPromise } from './utils'; 5 | import { MVP } from './interface'; 6 | 7 | const portalUrl = 'https://mvp.microsoft.com'; 8 | 9 | export const fetchMVPsPage = (page: number = 1, retries: number = 3): Promise<{ data: MVP[], hasNext: boolean; }> => { 10 | const url = `${portalUrl}/en-us/MvpSearch?&kw=&ps=48&pn=${page}`; 11 | return fetch(url, { 12 | method: 'GET', 13 | headers: { 14 | 'Accept': 'text/html', 15 | 'Content-Type': 'text/html', 16 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' 17 | } 18 | }) 19 | .then((r) => handleResponse(r)) 20 | .then((r) => r.text()) 21 | .then((html) => { 22 | const $ = load(html); 23 | const data: MVP[] = $('.profileListItem').toArray().map((node) => { 24 | return { 25 | id: $(node).find('.profileListItemFullName > span > a').attr('href').split('-').slice(-1)[0], 26 | name: $(node).find('.profileListItemFullName > span > a').text(), 27 | categories: $(node).find('.profileListItemCompetency > .subItemContent').text().trim().split(', '), 28 | country: $(node).find('.profileListItemLocation > .subItemContent').text().trim() 29 | }; 30 | }); 31 | const hasNext = $('.pager_items > a:last-child').find('img').length !== 0; 32 | return { data, hasNext }; 33 | }) 34 | .catch((error) => { 35 | if (retries > 0) { 36 | retries -= 1; 37 | // console.log(` retry, ${retries} left`); 38 | return fetchMVPsPage(page, retries); 39 | } 40 | throw new Error(error); 41 | }); 42 | }; 43 | 44 | export const fetchAllMvps = async ( 45 | data: MVP[] = [], 46 | page: number = 1, 47 | progress?: (page: number) => void, 48 | timeout?: number 49 | ): Promise => { 50 | if (progress) { 51 | progress(page); 52 | } 53 | const { data: mvps, hasNext } = await fetchMVPsPage(page); 54 | data = data.concat(mvps); 55 | if (hasNext) { 56 | if (typeof timeout !== 'undefined') { 57 | await timeoutPromise(1000); 58 | } 59 | return fetchAllMvps(data, page + 1, progress); 60 | } 61 | return data; 62 | }; 63 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { fetchAllMvps } from './api'; 2 | import { trimNames } from './map'; 3 | import { dumpOnDisk, dumpToSP } from './utils'; 4 | 5 | fetchAllMvps([], 1, (p) => console.log(`Fetching page: ${p}`), 0) 6 | .then(dumpOnDisk) 7 | .then(trimNames) 8 | .then(dumpToSP) 9 | .catch((error) => console.error(error)); 10 | -------------------------------------------------------------------------------- /src/interface.ts: -------------------------------------------------------------------------------- 1 | export interface MVP { 2 | id: string; 3 | name?: string; 4 | categories: string[]; 5 | country: string; 6 | } 7 | 8 | export interface PivotItem { 9 | category: string; 10 | country: string; 11 | amount: number; 12 | } 13 | -------------------------------------------------------------------------------- /src/map.ts: -------------------------------------------------------------------------------- 1 | import { MVP, PivotItem } from './interface'; 2 | 3 | export const flattify = (mvps: MVP[]): PivotItem[] => { 4 | return mvps.reduce((pi: PivotItem[], mvp) => { 5 | const { categories, country } = mvp; 6 | categories.forEach((category) => { 7 | const item = pi.find((p) => p.category === category && p.country === country); 8 | if (item) { 9 | item.amount += 1; 10 | } else { 11 | pi.push({ country, category, amount: 1 }); 12 | } 13 | }); 14 | return pi; 15 | }, []); 16 | }; 17 | 18 | export const trimNames = (mvps: MVP[]): MVP[] => { 19 | return mvps.map((mvp) => { 20 | delete mvp.name; 21 | return mvp; 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as path from 'path'; 3 | import { Response } from 'node-fetch'; 4 | import { sp, Web } from '@pnp/sp-commonjs'; 5 | import { PnpNode } from 'sp-pnp-node'; 6 | import { AuthConfig } from 'node-sp-auth-config'; 7 | import * as crc from 'crc-32'; 8 | 9 | export const handleResponse = (response: Response): Response => { 10 | if (!response.ok) { 11 | throw Error(response.statusText); 12 | } 13 | return response; 14 | }; 15 | 16 | export const dumpOnDisk = (data: T[]): T[] => { 17 | const folder = path.join(process.cwd(), './data'); 18 | if (!fs.existsSync(folder)) { 19 | fs.mkdirSync(folder); 20 | } 21 | const filePath = path.join(folder, `${new Date().toISOString().replace(/:/g, '-')}.json`); 22 | fs.writeFileSync(filePath, JSON.stringify(data, null, 2), { encoding: 'utf8' }); 23 | return data; 24 | }; 25 | 26 | export const dumpToSP = async (data: T[]): Promise => { 27 | const { siteUrl, authOptions } = await new AuthConfig().getContext(); 28 | const nodeFetch = new PnpNode({ siteUrl, authOptions }); 29 | sp.setup({ 30 | sp: { 31 | fetchClientFactory: () => nodeFetch 32 | } 33 | }); 34 | const fetchDate = new Date(); 35 | const web = Web(siteUrl); 36 | const list = web.lists.getByTitle('MVP Stats'); 37 | const items = await list.items.select('Id').filter(`Title eq '${dayFormat(fetchDate)}'`).get(); 38 | const stats = JSON.stringify(data); 39 | const payload = { 40 | Title: dayFormat(fetchDate), 41 | MvpStats: stats, 42 | StatsCRC: crc.str(stats).toString(16), 43 | StatsDate: fetchDate.toISOString() 44 | }; 45 | if (items.length > 0) { 46 | await list.items.getById(items[0].Id).update(payload); 47 | } else { 48 | await list.items.add(payload); 49 | } 50 | return data; 51 | }; 52 | 53 | export const dayFormat = (d: Date = new Date()): string => { 54 | return `${d.getFullYear()}-${`${d.getMonth() + 1}`.padStart(2, '0')}-${`${d.getDate()}`.padStart(2, '0')}`; 55 | }; 56 | 57 | export const timeoutPromise = (timeout: number): Promise => { 58 | return new Promise((resolve) => setTimeout(resolve, timeout)); 59 | }; 60 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "commonjs", 5 | "lib": ["es2017", "dom"], 6 | "sourceMap": true, 7 | "declaration": true, 8 | "moduleResolution": "node", 9 | "noImplicitAny": false, 10 | "removeComments": true, 11 | "newLine": "LF", 12 | "skipLibCheck": true, 13 | "types": ["node"], 14 | "outDir": "dist" 15 | }, 16 | "include": [ 17 | "src/**/*.ts", 18 | "test/**/*.ts" 19 | ], 20 | "exclude": [ 21 | "node_modules", 22 | "dist", 23 | "test" 24 | ] 25 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest", 3 | "rules": { 4 | "semicolon": [true, "always", "ignore-interfaces"], 5 | "space-before-function-paren": false, 6 | "trailing-comma": true, 7 | "no-unused-variable": false, 8 | "strict-type-predicates": false, 9 | "no-console": false 10 | } 11 | } --------------------------------------------------------------------------------