├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── LICENSE.md ├── README.md ├── SECURITY.md ├── extension.ts ├── images ├── install.gif ├── linkcheckermdicon.png └── working.gif ├── package-lock.json ├── package.json ├── test ├── testfile.md └── virtual-machines-linux-opensource.md └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | { 3 | "version": "0.1.0", 4 | "configurations": [ 5 | { 6 | "name": "Launch Extension", 7 | "type": "extensionHost", 8 | "request": "launch", 9 | "runtimeExecutable": "${execPath}", 10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], 11 | "stopOnEntry": false, 12 | "sourceMaps": true, 13 | "outDir": "out", 14 | "preLaunchTask": "npm" 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | // A task runner that calls a custom npm script that compiles the extension. 10 | { 11 | "version": "0.1.0", 12 | 13 | // we want to run npm 14 | "command": "npm", 15 | 16 | // the command is a shell script 17 | "isShellCommand": true, 18 | 19 | // show the output window only if unrecognized errors occur. 20 | "showOutput": "silent", 21 | 22 | // we run the custom script "compile" as defined in package.json 23 | "args": ["run", "compile"], 24 | 25 | // The tsc compiler is started in watching mode 26 | "isWatching": true, 27 | 28 | // use the standard tsc in watch mode problem matcher to find compile problems in the output. 29 | "problemMatcher": "$tsc-watch" 30 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | typings/** 3 | **/*.ts 4 | **/*.map 5 | .gitignore 6 | tsconfig.json 7 | vsc-extension-quickstart.md 8 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Microsoft 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LinkCheckMD 2 | Load a Markdown file and get highlights and hovers for links that contain a country code (en-us for example.) 3 | 4 | If you use Alt+L, it will generate a report on the links in the document, including broken links. It attempts to check broken links by trying to resolve HTTP & HTTPS links, and relative links (../folder/file.md) by checking if the file exist on the local file system. The result of these checks are logged in an output window on the right of the editor. 5 | 6 | ![Animated GIF of URLs being flagged as warnings and Alt+L functionality](./images/working.gif) 7 | 8 | Note that checking for broken links is more of an art than a science. Some sites don't actually return 404, but send you to a landing page. For example, Azure.com works this way. You can go to https://Azure.com/foo/bar and it will happily redirect you to https://Azure.com, with no 404 status returned. So take a status of "OK" with a grain of salt - you may not be arriving at the page you intend. 9 | 10 | ## Install 11 | 12 | Open Visual Studio Code and press `F1`; a field will appear at the top of the window. Type `ext install linkcheck`, hit enter, and reload the window to enable. 13 | 14 | ![Animated GIF of installing the extension](./images/install.gif) 15 | 16 | ## Rules 17 | 18 | ### LNK0001: Check for country code 19 | 20 | This rule checks links for language identifiers, such as `en-us`. 21 | 22 | ## Check for broken links 23 | 24 | To check for broken links, use Alt+L. This will open a new column to the right of the VSCode window and display the status of the links as they are checked. 25 | 26 | ## Changes 27 | 28 | ### 0.3.0 29 | 30 | - Added configuration setting to disable the country code rule 31 | 32 | ### 0.2.0 33 | 34 | - Fixed a bug preventing links with parentheses from being correctly parsed 35 | 36 | ### 0.1.5 37 | 38 | - Added country code warnings to the output window for Alt+L checking 39 | - Updated vscode dependency for the latest version 40 | 41 | ## TODO 42 | 43 | * Refactor broken link checking to display the actual URL that you arrived at for "OK" results that were redirects to a different URL. 44 | 45 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /extension.ts: -------------------------------------------------------------------------------- 1 | // The some things from 'vscode', which contains the VS Code extensibility API 2 | import { 3 | workspace, 4 | window, 5 | commands, 6 | languages, 7 | Diagnostic, 8 | DiagnosticSeverity, 9 | DiagnosticCollection, 10 | Range, 11 | OutputChannel, 12 | Position, 13 | Uri, 14 | Disposable, 15 | TextDocument, 16 | TextLine, 17 | ViewColumn, 18 | WorkspaceConfiguration} from 'vscode'; 19 | // For HTTP/s address validation 20 | import validator = require('validator'); 21 | // For checking broken links 22 | import brokenLink = require('broken-link'); 23 | // For checking relative URIs against the local file system 24 | import path = require('path'); 25 | import fs = require('fs'); 26 | 27 | //Interface for links 28 | interface Link { 29 | text: string 30 | address: string 31 | lineText: TextLine 32 | } 33 | 34 | const configSection = "linkcheckmd"; 35 | 36 | let configuration: WorkspaceConfiguration = workspace.getConfiguration(configSection); 37 | 38 | // this method is called when your extension is activated 39 | // your extension is activated the very first time the command is executed 40 | export function activate(disposables: Disposable[]) { 41 | // Create the diagnostics collection 42 | let diagnostics = languages.createDiagnosticCollection(); 43 | 44 | console.log("Link checker active"); 45 | 46 | // Wire up onChange events 47 | workspace.onDidChangeTextDocument(event => { 48 | checkLinks(event.document, diagnostics) 49 | }, undefined, disposables); 50 | 51 | workspace.onDidOpenTextDocument(event => { 52 | checkLinks(event, diagnostics); 53 | }, undefined, disposables); 54 | 55 | workspace.onDidChangeConfiguration(event => { 56 | if (event.affectsConfiguration(configSection)) { 57 | configuration = workspace.getConfiguration(configSection); 58 | } 59 | }); 60 | 61 | commands.registerCommand('extension.generateLinkReport', generateLinkReport); 62 | } 63 | 64 | /* 65 | * Checks links for errors. Currently this is just checking for a country code. 66 | * For example, /en-us/ in the URL. 67 | * 68 | * NOTE: Checking for broken links is not integrated in this, as checking for 69 | * those takes a long time, and this function needs to generate diagnostics every 70 | * time the document changes, so needs to complete quickly 71 | */ 72 | function checkLinks(document: TextDocument, diagnostics: DiagnosticCollection) { 73 | //Clear the diagnostics because we're sending new ones each time 74 | diagnostics.clear(); 75 | // Get all Markdown style links in the document 76 | getLinks(document).then((links) => { 77 | if (configuration.get("enableCountryCodeCheck", true)) { 78 | // Iterate over the array, generating an array of promises 79 | let countryCodePromise = Promise.all(links.map((link): Diagnostic => { 80 | // For each link, check the country code... 81 | return isCountryCodeLink(link); 82 | // Then, when they are all done.. 83 | })); 84 | // Finally, let's complete the promise for country code... 85 | countryCodePromise.then((countryCodeDiag) => { 86 | // Then filter out null ones 87 | let filteredDiag = countryCodeDiag.filter(diagnostic => diagnostic != null); 88 | // Then add the diagnostics 89 | diagnostics.set(document.uri, filteredDiag); 90 | }) 91 | } 92 | }).catch(); 93 | } 94 | 95 | // Generate a report of broken, country code, etc. links and the line they occur on 96 | function generateLinkReport() { 97 | // Get the current document 98 | let document = window.activeTextEditor.document; 99 | // Create an output channel for displaying broken links 100 | let outputChannel = window.createOutputChannel("Checked links"); 101 | // Show the output channel in column three 102 | outputChannel.show(ViewColumn.Three); 103 | 104 | // Get all Markdown style lnks in the document 105 | getLinks(document).then((links) => { 106 | // Loop over the links 107 | links.forEach(link => { 108 | // Get the line number, because internally it's 0 based, but not in display 109 | let lineNumber = link.lineText.lineNumber + 1; 110 | 111 | // Is it an HTTPS link or a relative link? 112 | if(isHttpLink(link.address)) { 113 | // And check if they are broken or not. 114 | brokenLink(link.address, {allowRedirects: true}).then((answer) => { 115 | // Also check for country code 116 | if(configuration.get("enableCountryCodeCheck", true) && hasCountryCode(link.address)) { 117 | outputChannel.appendLine(`Warning: ${link.address} on line ${lineNumber} contains a language reference code.`); 118 | } 119 | // Log to the outputChannel 120 | if(answer) { 121 | outputChannel.appendLine(`Error: ${link.address} on line ${lineNumber} is unreachable.`); 122 | } else { 123 | outputChannel.appendLine(`Info: ${link.address} on line ${lineNumber}.`); 124 | } 125 | }); 126 | } else { 127 | if(isFtpLink(link.address)) { 128 | // We don't do anything with FTP 129 | outputChannel.appendLine(`Info: ${link.address} on line ${lineNumber} is an FTP link.`); 130 | } else { 131 | // Must be a relative path, but might not be, so try it... 132 | try { 133 | // Find the directory from the path to the current document 134 | let currentWorkingDirectory = path.dirname(document.fileName); 135 | // Use that to resolve the full path from the relative link address 136 | // The `.split('#')[0]` at the end is so that relative links that also reference an anchor in the document will work with file checking. 137 | let fullPath = path.resolve(currentWorkingDirectory, link.address).split('#')[0]; 138 | // Check if the file exists and log appropriately 139 | if(fs.existsSync(fullPath)) { 140 | outputChannel.appendLine(`Info: ${link.address} on line ${lineNumber}.`); 141 | } else { 142 | outputChannel.appendLine(`Error: ${link.address} on line ${lineNumber} does not exist.`); 143 | } 144 | } catch (error) { 145 | // If there's an error, log the link 146 | outputChannel.appendLine(`Error: ${link.address} on line ${lineNumber} is not an HTTP/s or relative link.`); 147 | } 148 | } 149 | } 150 | }); 151 | }); 152 | } 153 | 154 | // Parse the MD style links out of the document 155 | function getLinks(document: TextDocument): Promise { 156 | // Return a promise, since this might take a while for large documents 157 | return new Promise((resolve, reject) => { 158 | // Create arrays to hold links as we parse them out 159 | let linksToReturn = new Array(); 160 | // Get lines in the document 161 | let lineCount = document.lineCount; 162 | 163 | //Loop over the lines in a document 164 | for(let lineNumber = 0; lineNumber < lineCount; lineNumber++) { 165 | // Get the text for the current line 166 | let lineText = document.lineAt(lineNumber); 167 | // Are there links? 168 | let links = lineText.text.match(/\[[^\[]+\]\(([^\)]+(\)[a-zA-Z0-9-]*.\w*\)|\)))|\[[a-zA-z0-9_-]+\]:\s*(\S+)/g); 169 | if(links) { 170 | // Iterate over the links found on this line 171 | for(let i = 0; i< links.length; i++) { 172 | // Get the URL from each individual link 173 | // ([^\)]+) captures inline style link address 174 | // (\S+) captures reference style link address 175 | var link = links[i].match(/\[[^\[]+\]\(([^\)]+(\)[a-zA-Z0-9-]*.\w+\)|\)))|\[[a-zA-z0-9_-]+\]:\s*(\S+)/); 176 | // Figure out which capture contains the address; inline style or reference 177 | let address = (link[3] == null) ? link[1].slice(0, -1) : link[3]; 178 | //Push it to the array 179 | linksToReturn.push({ 180 | text: link[0], 181 | address: address, 182 | lineText: lineText 183 | }); 184 | } 185 | } 186 | } 187 | if(linksToReturn.length > 0) { 188 | //Return the populated array, which completes the promise. 189 | resolve(linksToReturn); 190 | } else { 191 | //Reject, because we found no links 192 | reject; 193 | } 194 | }).catch(); 195 | } 196 | 197 | // Check for addresses that contain country codes 198 | function isCountryCodeLink(link: Link): Diagnostic { 199 | let countryCodeDiag=null; 200 | 201 | //If one was found... 202 | if(hasCountryCode(link.address)) { 203 | //Create the diagnostics object 204 | countryCodeDiag = createDiagnostic( 205 | DiagnosticSeverity.Warning, 206 | link.text, 207 | link.lineText, 208 | `Link ${link.address} contains a language reference code.`, 209 | 'LNK0001' 210 | ); 211 | } 212 | return countryCodeDiag; 213 | } 214 | 215 | function hasCountryCode(linkToCheck: string): boolean { 216 | //Regex for country-code 217 | let hasCountryCode = linkToCheck.match(/(.com|aka\.ms)\/[a-z]{2}\-[a-z]{2}\//); 218 | return hasCountryCode ? true : false; 219 | } 220 | 221 | // Is this a valid HTTP/S link? 222 | function isHttpLink(linkToCheck: string): boolean { 223 | // Use the validator to avoid writing URL checking logic 224 | return validator.isURL(linkToCheck, {require_protocol: true, protocols: ['http','https']}) ? true : false; 225 | } 226 | 227 | // Is this an FTP link? 228 | function isFtpLink(linkToCheck: string): boolean { 229 | return linkToCheck.toLowerCase().startsWith('ftp'); 230 | } 231 | 232 | // Generate a diagnostic object 233 | function createDiagnostic(severity: DiagnosticSeverity, markdownLink, lineText: TextLine, message, code): Diagnostic { 234 | // Get the location of the text in the document 235 | // based on position within the line of text it occurs in 236 | let startPos = lineText.text.indexOf(markdownLink); 237 | let endPos = startPos + markdownLink.length -1; 238 | let start = new Position(lineText.lineNumber,startPos); 239 | let end = new Position(lineText.lineNumber, endPos); 240 | let range = new Range(start, end); 241 | // Create the diagnostic object 242 | let diag = new Diagnostic(range, message, severity); 243 | diag.code = code; 244 | diag.source = "linkcheckmd"; 245 | // Return the diagnostic 246 | return diag; 247 | } -------------------------------------------------------------------------------- /images/install.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/linkcheckermd/0b067c046a31f831ce8aa62c05152a70d2c15ad0/images/install.gif -------------------------------------------------------------------------------- /images/linkcheckermdicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/linkcheckermd/0b067c046a31f831ce8aa62c05152a70d2c15ad0/images/linkcheckermdicon.png -------------------------------------------------------------------------------- /images/working.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/linkcheckermd/0b067c046a31f831ce8aa62c05152a70d2c15ad0/images/working.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LinkCheckMD", 3 | "version": "0.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/mocha": { 8 | "version": "2.2.48", 9 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", 10 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", 11 | "dev": true 12 | }, 13 | "@types/node": { 14 | "version": "6.14.9", 15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.9.tgz", 16 | "integrity": "sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w==", 17 | "dev": true 18 | }, 19 | "agent-base": { 20 | "version": "4.3.0", 21 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 22 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 23 | "dev": true, 24 | "requires": { 25 | "es6-promisify": "^5.0.0" 26 | } 27 | }, 28 | "ajv": { 29 | "version": "6.12.6", 30 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 31 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 32 | "requires": { 33 | "fast-deep-equal": "^3.1.1", 34 | "fast-json-stable-stringify": "^2.0.0", 35 | "json-schema-traverse": "^0.4.1", 36 | "uri-js": "^4.2.2" 37 | }, 38 | "dependencies": { 39 | "fast-deep-equal": { 40 | "version": "3.1.3", 41 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 42 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 43 | } 44 | } 45 | }, 46 | "ansi-colors": { 47 | "version": "4.1.1", 48 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 49 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 50 | "dev": true 51 | }, 52 | "ansi-regex": { 53 | "version": "5.0.1", 54 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 55 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 56 | "dev": true 57 | }, 58 | "ansi-styles": { 59 | "version": "4.3.0", 60 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 61 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 62 | "dev": true, 63 | "requires": { 64 | "color-convert": "^2.0.1" 65 | } 66 | }, 67 | "anymatch": { 68 | "version": "3.1.3", 69 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 70 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 71 | "dev": true, 72 | "requires": { 73 | "normalize-path": "^3.0.0", 74 | "picomatch": "^2.0.4" 75 | } 76 | }, 77 | "argparse": { 78 | "version": "2.0.1", 79 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 80 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 81 | "dev": true 82 | }, 83 | "asn1": { 84 | "version": "0.2.4", 85 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 86 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 87 | "requires": { 88 | "safer-buffer": "~2.1.0" 89 | } 90 | }, 91 | "assert-plus": { 92 | "version": "1.0.0", 93 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 94 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 95 | }, 96 | "asynckit": { 97 | "version": "0.4.0", 98 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 99 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 100 | }, 101 | "aws-sign2": { 102 | "version": "0.7.0", 103 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 104 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 105 | }, 106 | "aws4": { 107 | "version": "1.9.0", 108 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", 109 | "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" 110 | }, 111 | "balanced-match": { 112 | "version": "1.0.0", 113 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 114 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 115 | }, 116 | "bcrypt-pbkdf": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 119 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 120 | "requires": { 121 | "tweetnacl": "^0.14.3" 122 | } 123 | }, 124 | "binary-extensions": { 125 | "version": "2.2.0", 126 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 127 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 128 | "dev": true 129 | }, 130 | "brace-expansion": { 131 | "version": "1.1.11", 132 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 133 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 134 | "requires": { 135 | "balanced-match": "^1.0.0", 136 | "concat-map": "0.0.1" 137 | } 138 | }, 139 | "braces": { 140 | "version": "3.0.2", 141 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 142 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 143 | "dev": true, 144 | "requires": { 145 | "fill-range": "^7.0.1" 146 | } 147 | }, 148 | "broken-link": { 149 | "version": "1.0.1", 150 | "resolved": "https://registry.npmjs.org/broken-link/-/broken-link-1.0.1.tgz", 151 | "integrity": "sha1-+l7LqTHqnWa0AOEsqDzczxJqtrs=", 152 | "requires": { 153 | "object-assign": "^3.0.0", 154 | "pinkie-promise": "^1.0.0", 155 | "request": "^2.60.0", 156 | "tape": "^4.2.0" 157 | } 158 | }, 159 | "browser-stdout": { 160 | "version": "1.3.1", 161 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 162 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 163 | "dev": true 164 | }, 165 | "buffer-from": { 166 | "version": "1.1.1", 167 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 168 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 169 | "dev": true 170 | }, 171 | "camelcase": { 172 | "version": "6.3.0", 173 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 174 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 175 | "dev": true 176 | }, 177 | "caseless": { 178 | "version": "0.12.0", 179 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 180 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 181 | }, 182 | "chalk": { 183 | "version": "4.1.2", 184 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 185 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 186 | "dev": true, 187 | "requires": { 188 | "ansi-styles": "^4.1.0", 189 | "supports-color": "^7.1.0" 190 | }, 191 | "dependencies": { 192 | "has-flag": { 193 | "version": "4.0.0", 194 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 195 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 196 | "dev": true 197 | }, 198 | "supports-color": { 199 | "version": "7.2.0", 200 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 201 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 202 | "dev": true, 203 | "requires": { 204 | "has-flag": "^4.0.0" 205 | } 206 | } 207 | } 208 | }, 209 | "chokidar": { 210 | "version": "3.5.3", 211 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 212 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 213 | "dev": true, 214 | "requires": { 215 | "anymatch": "~3.1.2", 216 | "braces": "~3.0.2", 217 | "fsevents": "~2.3.2", 218 | "glob-parent": "~5.1.2", 219 | "is-binary-path": "~2.1.0", 220 | "is-glob": "~4.0.1", 221 | "normalize-path": "~3.0.0", 222 | "readdirp": "~3.6.0" 223 | } 224 | }, 225 | "cliui": { 226 | "version": "7.0.4", 227 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 228 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 229 | "dev": true, 230 | "requires": { 231 | "string-width": "^4.2.0", 232 | "strip-ansi": "^6.0.0", 233 | "wrap-ansi": "^7.0.0" 234 | } 235 | }, 236 | "color-convert": { 237 | "version": "2.0.1", 238 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 239 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 240 | "dev": true, 241 | "requires": { 242 | "color-name": "~1.1.4" 243 | } 244 | }, 245 | "color-name": { 246 | "version": "1.1.4", 247 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 248 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 249 | "dev": true 250 | }, 251 | "combined-stream": { 252 | "version": "1.0.8", 253 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 254 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 255 | "requires": { 256 | "delayed-stream": "~1.0.0" 257 | } 258 | }, 259 | "concat-map": { 260 | "version": "0.0.1", 261 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 262 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 263 | }, 264 | "core-util-is": { 265 | "version": "1.0.2", 266 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 267 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 268 | }, 269 | "dashdash": { 270 | "version": "1.14.1", 271 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 272 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 273 | "requires": { 274 | "assert-plus": "^1.0.0" 275 | } 276 | }, 277 | "debug": { 278 | "version": "3.1.0", 279 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 280 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 281 | "dev": true, 282 | "requires": { 283 | "ms": "2.0.0" 284 | } 285 | }, 286 | "decamelize": { 287 | "version": "4.0.0", 288 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 289 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 290 | "dev": true 291 | }, 292 | "deep-equal": { 293 | "version": "1.0.1", 294 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 295 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 296 | }, 297 | "define-properties": { 298 | "version": "1.1.3", 299 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 300 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 301 | "requires": { 302 | "object-keys": "^1.0.12" 303 | } 304 | }, 305 | "defined": { 306 | "version": "1.0.0", 307 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 308 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 309 | }, 310 | "delayed-stream": { 311 | "version": "1.0.0", 312 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 313 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 314 | }, 315 | "diff": { 316 | "version": "5.0.0", 317 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 318 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 319 | "dev": true 320 | }, 321 | "ecc-jsbn": { 322 | "version": "0.1.2", 323 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 324 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 325 | "requires": { 326 | "jsbn": "~0.1.0", 327 | "safer-buffer": "^2.1.0" 328 | } 329 | }, 330 | "emoji-regex": { 331 | "version": "8.0.0", 332 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 333 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 334 | "dev": true 335 | }, 336 | "es-abstract": { 337 | "version": "1.16.3", 338 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", 339 | "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", 340 | "requires": { 341 | "es-to-primitive": "^1.2.1", 342 | "function-bind": "^1.1.1", 343 | "has": "^1.0.3", 344 | "has-symbols": "^1.0.1", 345 | "is-callable": "^1.1.4", 346 | "is-regex": "^1.0.4", 347 | "object-inspect": "^1.7.0", 348 | "object-keys": "^1.1.1", 349 | "string.prototype.trimleft": "^2.1.0", 350 | "string.prototype.trimright": "^2.1.0" 351 | }, 352 | "dependencies": { 353 | "object-inspect": { 354 | "version": "1.7.0", 355 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 356 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 357 | } 358 | } 359 | }, 360 | "es-to-primitive": { 361 | "version": "1.2.1", 362 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 363 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 364 | "requires": { 365 | "is-callable": "^1.1.4", 366 | "is-date-object": "^1.0.1", 367 | "is-symbol": "^1.0.2" 368 | } 369 | }, 370 | "es6-promise": { 371 | "version": "4.2.8", 372 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 373 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 374 | "dev": true 375 | }, 376 | "es6-promisify": { 377 | "version": "5.0.0", 378 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 379 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 380 | "dev": true, 381 | "requires": { 382 | "es6-promise": "^4.0.3" 383 | } 384 | }, 385 | "escalade": { 386 | "version": "3.1.1", 387 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 388 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 389 | "dev": true 390 | }, 391 | "escape-string-regexp": { 392 | "version": "4.0.0", 393 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 394 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 395 | "dev": true 396 | }, 397 | "extend": { 398 | "version": "3.0.2", 399 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 400 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 401 | }, 402 | "extsprintf": { 403 | "version": "1.3.0", 404 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 405 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 406 | }, 407 | "fast-json-stable-stringify": { 408 | "version": "2.0.0", 409 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 410 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 411 | }, 412 | "fill-range": { 413 | "version": "7.0.1", 414 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 415 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 416 | "dev": true, 417 | "requires": { 418 | "to-regex-range": "^5.0.1" 419 | } 420 | }, 421 | "find-up": { 422 | "version": "5.0.0", 423 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 424 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 425 | "dev": true, 426 | "requires": { 427 | "locate-path": "^6.0.0", 428 | "path-exists": "^4.0.0" 429 | } 430 | }, 431 | "flat": { 432 | "version": "5.0.2", 433 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 434 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 435 | "dev": true 436 | }, 437 | "for-each": { 438 | "version": "0.3.3", 439 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 440 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 441 | "requires": { 442 | "is-callable": "^1.1.3" 443 | } 444 | }, 445 | "forever-agent": { 446 | "version": "0.6.1", 447 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 448 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 449 | }, 450 | "form-data": { 451 | "version": "2.3.3", 452 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 453 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 454 | "requires": { 455 | "asynckit": "^0.4.0", 456 | "combined-stream": "^1.0.6", 457 | "mime-types": "^2.1.12" 458 | } 459 | }, 460 | "fs.realpath": { 461 | "version": "1.0.0", 462 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 463 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 464 | }, 465 | "fsevents": { 466 | "version": "2.3.2", 467 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 468 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 469 | "dev": true, 470 | "optional": true 471 | }, 472 | "function-bind": { 473 | "version": "1.1.1", 474 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 475 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 476 | }, 477 | "get-caller-file": { 478 | "version": "2.0.5", 479 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 480 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 481 | "dev": true 482 | }, 483 | "getpass": { 484 | "version": "0.1.7", 485 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 486 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 487 | "requires": { 488 | "assert-plus": "^1.0.0" 489 | } 490 | }, 491 | "glob": { 492 | "version": "7.1.6", 493 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 494 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 495 | "requires": { 496 | "fs.realpath": "^1.0.0", 497 | "inflight": "^1.0.4", 498 | "inherits": "2", 499 | "minimatch": "^3.0.4", 500 | "once": "^1.3.0", 501 | "path-is-absolute": "^1.0.0" 502 | } 503 | }, 504 | "glob-parent": { 505 | "version": "5.1.2", 506 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 507 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 508 | "dev": true, 509 | "requires": { 510 | "is-glob": "^4.0.1" 511 | } 512 | }, 513 | "har-schema": { 514 | "version": "2.0.0", 515 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 516 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 517 | }, 518 | "har-validator": { 519 | "version": "5.1.3", 520 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 521 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 522 | "requires": { 523 | "ajv": "^6.5.5", 524 | "har-schema": "^2.0.0" 525 | } 526 | }, 527 | "has": { 528 | "version": "1.0.3", 529 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 530 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 531 | "requires": { 532 | "function-bind": "^1.1.1" 533 | } 534 | }, 535 | "has-flag": { 536 | "version": "3.0.0", 537 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 538 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 539 | "dev": true 540 | }, 541 | "has-symbols": { 542 | "version": "1.0.1", 543 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 544 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 545 | }, 546 | "he": { 547 | "version": "1.1.1", 548 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 549 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 550 | "dev": true 551 | }, 552 | "http-proxy-agent": { 553 | "version": "2.1.0", 554 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 555 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 556 | "dev": true, 557 | "requires": { 558 | "agent-base": "4", 559 | "debug": "3.1.0" 560 | } 561 | }, 562 | "http-signature": { 563 | "version": "1.2.0", 564 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 565 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 566 | "requires": { 567 | "assert-plus": "^1.0.0", 568 | "jsprim": "^1.2.2", 569 | "sshpk": "^1.7.0" 570 | } 571 | }, 572 | "https-proxy-agent": { 573 | "version": "2.2.4", 574 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 575 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 576 | "dev": true, 577 | "requires": { 578 | "agent-base": "^4.3.0", 579 | "debug": "^3.1.0" 580 | } 581 | }, 582 | "inflight": { 583 | "version": "1.0.6", 584 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 585 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 586 | "requires": { 587 | "once": "^1.3.0", 588 | "wrappy": "1" 589 | } 590 | }, 591 | "inherits": { 592 | "version": "2.0.4", 593 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 594 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 595 | }, 596 | "is-binary-path": { 597 | "version": "2.1.0", 598 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 599 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 600 | "dev": true, 601 | "requires": { 602 | "binary-extensions": "^2.0.0" 603 | } 604 | }, 605 | "is-callable": { 606 | "version": "1.1.4", 607 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 608 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 609 | }, 610 | "is-date-object": { 611 | "version": "1.0.1", 612 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 613 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 614 | }, 615 | "is-extglob": { 616 | "version": "2.1.1", 617 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 618 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 619 | "dev": true 620 | }, 621 | "is-fullwidth-code-point": { 622 | "version": "3.0.0", 623 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 624 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 625 | "dev": true 626 | }, 627 | "is-glob": { 628 | "version": "4.0.3", 629 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 630 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 631 | "dev": true, 632 | "requires": { 633 | "is-extglob": "^2.1.1" 634 | } 635 | }, 636 | "is-number": { 637 | "version": "7.0.0", 638 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 639 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 640 | "dev": true 641 | }, 642 | "is-plain-obj": { 643 | "version": "2.1.0", 644 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 645 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 646 | "dev": true 647 | }, 648 | "is-regex": { 649 | "version": "1.0.4", 650 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 651 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 652 | "requires": { 653 | "has": "^1.0.1" 654 | } 655 | }, 656 | "is-symbol": { 657 | "version": "1.0.3", 658 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 659 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 660 | "requires": { 661 | "has-symbols": "^1.0.1" 662 | } 663 | }, 664 | "is-typedarray": { 665 | "version": "1.0.0", 666 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 667 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 668 | }, 669 | "is-unicode-supported": { 670 | "version": "0.1.0", 671 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 672 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 673 | "dev": true 674 | }, 675 | "isstream": { 676 | "version": "0.1.2", 677 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 678 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 679 | }, 680 | "js-yaml": { 681 | "version": "4.1.0", 682 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 683 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 684 | "dev": true, 685 | "requires": { 686 | "argparse": "^2.0.1" 687 | } 688 | }, 689 | "jsbn": { 690 | "version": "0.1.1", 691 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 692 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 693 | }, 694 | "json-schema-traverse": { 695 | "version": "0.4.1", 696 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 697 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 698 | }, 699 | "json-stringify-safe": { 700 | "version": "5.0.1", 701 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 702 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 703 | }, 704 | "jsprim": { 705 | "version": "1.4.2", 706 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 707 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 708 | "requires": { 709 | "assert-plus": "1.0.0", 710 | "extsprintf": "1.3.0", 711 | "json-schema": "0.4.0", 712 | "verror": "1.10.0" 713 | }, 714 | "dependencies": { 715 | "json-schema": { 716 | "version": "0.4.0", 717 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 718 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 719 | } 720 | } 721 | }, 722 | "locate-path": { 723 | "version": "6.0.0", 724 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 725 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 726 | "dev": true, 727 | "requires": { 728 | "p-locate": "^5.0.0" 729 | } 730 | }, 731 | "log-symbols": { 732 | "version": "4.1.0", 733 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 734 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 735 | "dev": true, 736 | "requires": { 737 | "chalk": "^4.1.0", 738 | "is-unicode-supported": "^0.1.0" 739 | } 740 | }, 741 | "mime-db": { 742 | "version": "1.42.0", 743 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", 744 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" 745 | }, 746 | "mime-types": { 747 | "version": "2.1.25", 748 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", 749 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", 750 | "requires": { 751 | "mime-db": "1.42.0" 752 | } 753 | }, 754 | "minimatch": { 755 | "version": "3.0.4", 756 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 757 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 758 | "requires": { 759 | "brace-expansion": "^1.1.7" 760 | } 761 | }, 762 | "minimist": { 763 | "version": "1.2.0", 764 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 765 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 766 | }, 767 | "mkdirp": { 768 | "version": "0.5.1", 769 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 770 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 771 | "dev": true, 772 | "requires": { 773 | "minimist": "0.0.8" 774 | }, 775 | "dependencies": { 776 | "minimist": { 777 | "version": "0.0.8", 778 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 779 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 780 | "dev": true 781 | } 782 | } 783 | }, 784 | "mocha": { 785 | "version": "10.2.0", 786 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 787 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 788 | "dev": true, 789 | "requires": { 790 | "ansi-colors": "4.1.1", 791 | "browser-stdout": "1.3.1", 792 | "chokidar": "3.5.3", 793 | "debug": "4.3.4", 794 | "diff": "5.0.0", 795 | "escape-string-regexp": "4.0.0", 796 | "find-up": "5.0.0", 797 | "glob": "7.2.0", 798 | "he": "1.2.0", 799 | "js-yaml": "4.1.0", 800 | "log-symbols": "4.1.0", 801 | "minimatch": "5.0.1", 802 | "ms": "2.1.3", 803 | "nanoid": "3.3.3", 804 | "serialize-javascript": "6.0.0", 805 | "strip-json-comments": "3.1.1", 806 | "supports-color": "8.1.1", 807 | "workerpool": "6.2.1", 808 | "yargs": "16.2.0", 809 | "yargs-parser": "20.2.4", 810 | "yargs-unparser": "2.0.0" 811 | }, 812 | "dependencies": { 813 | "debug": { 814 | "version": "4.3.4", 815 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 816 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 817 | "dev": true, 818 | "requires": { 819 | "ms": "2.1.2" 820 | }, 821 | "dependencies": { 822 | "ms": { 823 | "version": "2.1.2", 824 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 825 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 826 | "dev": true 827 | } 828 | } 829 | }, 830 | "glob": { 831 | "version": "7.2.0", 832 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 833 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 834 | "dev": true, 835 | "requires": { 836 | "fs.realpath": "^1.0.0", 837 | "inflight": "^1.0.4", 838 | "inherits": "2", 839 | "minimatch": "^3.0.4", 840 | "once": "^1.3.0", 841 | "path-is-absolute": "^1.0.0" 842 | }, 843 | "dependencies": { 844 | "minimatch": { 845 | "version": "3.1.2", 846 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 847 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 848 | "dev": true, 849 | "requires": { 850 | "brace-expansion": "^1.1.7" 851 | } 852 | } 853 | } 854 | }, 855 | "he": { 856 | "version": "1.2.0", 857 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 858 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 859 | "dev": true 860 | }, 861 | "minimatch": { 862 | "version": "5.0.1", 863 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 864 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 865 | "dev": true, 866 | "requires": { 867 | "brace-expansion": "^2.0.1" 868 | }, 869 | "dependencies": { 870 | "brace-expansion": { 871 | "version": "2.0.1", 872 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 873 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 874 | "dev": true, 875 | "requires": { 876 | "balanced-match": "^1.0.0" 877 | } 878 | } 879 | } 880 | }, 881 | "ms": { 882 | "version": "2.1.3", 883 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 884 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 885 | "dev": true 886 | } 887 | } 888 | }, 889 | "ms": { 890 | "version": "2.0.0", 891 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 892 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 893 | "dev": true 894 | }, 895 | "nanoid": { 896 | "version": "3.3.3", 897 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 898 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 899 | "dev": true 900 | }, 901 | "normalize-path": { 902 | "version": "3.0.0", 903 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 904 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 905 | "dev": true 906 | }, 907 | "oauth-sign": { 908 | "version": "0.9.0", 909 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 910 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 911 | }, 912 | "object-assign": { 913 | "version": "3.0.0", 914 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", 915 | "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" 916 | }, 917 | "object-inspect": { 918 | "version": "1.6.0", 919 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 920 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" 921 | }, 922 | "object-keys": { 923 | "version": "1.1.1", 924 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 925 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 926 | }, 927 | "once": { 928 | "version": "1.4.0", 929 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 930 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 931 | "requires": { 932 | "wrappy": "1" 933 | } 934 | }, 935 | "p-limit": { 936 | "version": "3.1.0", 937 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 938 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 939 | "dev": true, 940 | "requires": { 941 | "yocto-queue": "^0.1.0" 942 | } 943 | }, 944 | "p-locate": { 945 | "version": "5.0.0", 946 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 947 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 948 | "dev": true, 949 | "requires": { 950 | "p-limit": "^3.0.2" 951 | } 952 | }, 953 | "path-exists": { 954 | "version": "4.0.0", 955 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 956 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 957 | "dev": true 958 | }, 959 | "path-is-absolute": { 960 | "version": "1.0.1", 961 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 962 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 963 | }, 964 | "path-parse": { 965 | "version": "1.0.7", 966 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 967 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 968 | }, 969 | "performance-now": { 970 | "version": "2.1.0", 971 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 972 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 973 | }, 974 | "picomatch": { 975 | "version": "2.3.1", 976 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 977 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 978 | "dev": true 979 | }, 980 | "pinkie": { 981 | "version": "1.0.0", 982 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", 983 | "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=" 984 | }, 985 | "pinkie-promise": { 986 | "version": "1.0.0", 987 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", 988 | "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", 989 | "requires": { 990 | "pinkie": "^1.0.0" 991 | } 992 | }, 993 | "psl": { 994 | "version": "1.6.0", 995 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", 996 | "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" 997 | }, 998 | "punycode": { 999 | "version": "2.1.1", 1000 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1001 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1002 | }, 1003 | "qs": { 1004 | "version": "6.5.3", 1005 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1006 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" 1007 | }, 1008 | "querystringify": { 1009 | "version": "2.1.1", 1010 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", 1011 | "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", 1012 | "dev": true 1013 | }, 1014 | "randombytes": { 1015 | "version": "2.1.0", 1016 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1017 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1018 | "dev": true, 1019 | "requires": { 1020 | "safe-buffer": "^5.1.0" 1021 | } 1022 | }, 1023 | "readdirp": { 1024 | "version": "3.6.0", 1025 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1026 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1027 | "dev": true, 1028 | "requires": { 1029 | "picomatch": "^2.2.1" 1030 | } 1031 | }, 1032 | "request": { 1033 | "version": "2.88.0", 1034 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1035 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1036 | "requires": { 1037 | "aws-sign2": "~0.7.0", 1038 | "aws4": "^1.8.0", 1039 | "caseless": "~0.12.0", 1040 | "combined-stream": "~1.0.6", 1041 | "extend": "~3.0.2", 1042 | "forever-agent": "~0.6.1", 1043 | "form-data": "~2.3.2", 1044 | "har-validator": "~5.1.0", 1045 | "http-signature": "~1.2.0", 1046 | "is-typedarray": "~1.0.0", 1047 | "isstream": "~0.1.2", 1048 | "json-stringify-safe": "~5.0.1", 1049 | "mime-types": "~2.1.19", 1050 | "oauth-sign": "~0.9.0", 1051 | "performance-now": "^2.1.0", 1052 | "qs": "~6.5.2", 1053 | "safe-buffer": "^5.1.2", 1054 | "tough-cookie": "~2.4.3", 1055 | "tunnel-agent": "^0.6.0", 1056 | "uuid": "^3.3.2" 1057 | } 1058 | }, 1059 | "require-directory": { 1060 | "version": "2.1.1", 1061 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1062 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1063 | "dev": true 1064 | }, 1065 | "requires-port": { 1066 | "version": "1.0.0", 1067 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1068 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 1069 | "dev": true 1070 | }, 1071 | "resolve": { 1072 | "version": "1.11.1", 1073 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 1074 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 1075 | "requires": { 1076 | "path-parse": "^1.0.6" 1077 | } 1078 | }, 1079 | "resumer": { 1080 | "version": "0.0.0", 1081 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1082 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 1083 | "requires": { 1084 | "through": "~2.3.4" 1085 | } 1086 | }, 1087 | "safe-buffer": { 1088 | "version": "5.2.0", 1089 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 1090 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 1091 | }, 1092 | "safer-buffer": { 1093 | "version": "2.1.2", 1094 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1095 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1096 | }, 1097 | "semver": { 1098 | "version": "5.7.1", 1099 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1100 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1101 | "dev": true 1102 | }, 1103 | "serialize-javascript": { 1104 | "version": "6.0.0", 1105 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1106 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1107 | "dev": true, 1108 | "requires": { 1109 | "randombytes": "^2.1.0" 1110 | } 1111 | }, 1112 | "source-map": { 1113 | "version": "0.6.1", 1114 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1115 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1116 | "dev": true 1117 | }, 1118 | "source-map-support": { 1119 | "version": "0.5.16", 1120 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 1121 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 1122 | "dev": true, 1123 | "requires": { 1124 | "buffer-from": "^1.0.0", 1125 | "source-map": "^0.6.0" 1126 | } 1127 | }, 1128 | "sshpk": { 1129 | "version": "1.16.1", 1130 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1131 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1132 | "requires": { 1133 | "asn1": "~0.2.3", 1134 | "assert-plus": "^1.0.0", 1135 | "bcrypt-pbkdf": "^1.0.0", 1136 | "dashdash": "^1.12.0", 1137 | "ecc-jsbn": "~0.1.1", 1138 | "getpass": "^0.1.1", 1139 | "jsbn": "~0.1.0", 1140 | "safer-buffer": "^2.0.2", 1141 | "tweetnacl": "~0.14.0" 1142 | } 1143 | }, 1144 | "string-width": { 1145 | "version": "4.2.3", 1146 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1147 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1148 | "dev": true, 1149 | "requires": { 1150 | "emoji-regex": "^8.0.0", 1151 | "is-fullwidth-code-point": "^3.0.0", 1152 | "strip-ansi": "^6.0.1" 1153 | } 1154 | }, 1155 | "string.prototype.trim": { 1156 | "version": "1.1.2", 1157 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 1158 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 1159 | "requires": { 1160 | "define-properties": "^1.1.2", 1161 | "es-abstract": "^1.5.0", 1162 | "function-bind": "^1.0.2" 1163 | } 1164 | }, 1165 | "string.prototype.trimleft": { 1166 | "version": "2.1.0", 1167 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1168 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1169 | "requires": { 1170 | "define-properties": "^1.1.3", 1171 | "function-bind": "^1.1.1" 1172 | } 1173 | }, 1174 | "string.prototype.trimright": { 1175 | "version": "2.1.0", 1176 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1177 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1178 | "requires": { 1179 | "define-properties": "^1.1.3", 1180 | "function-bind": "^1.1.1" 1181 | } 1182 | }, 1183 | "strip-ansi": { 1184 | "version": "6.0.1", 1185 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1186 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1187 | "dev": true, 1188 | "requires": { 1189 | "ansi-regex": "^5.0.1" 1190 | } 1191 | }, 1192 | "strip-json-comments": { 1193 | "version": "3.1.1", 1194 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1195 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1196 | "dev": true 1197 | }, 1198 | "supports-color": { 1199 | "version": "8.1.1", 1200 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1201 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1202 | "dev": true, 1203 | "requires": { 1204 | "has-flag": "^4.0.0" 1205 | }, 1206 | "dependencies": { 1207 | "has-flag": { 1208 | "version": "4.0.0", 1209 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1210 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1211 | "dev": true 1212 | } 1213 | } 1214 | }, 1215 | "tape": { 1216 | "version": "4.11.0", 1217 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", 1218 | "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", 1219 | "requires": { 1220 | "deep-equal": "~1.0.1", 1221 | "defined": "~1.0.0", 1222 | "for-each": "~0.3.3", 1223 | "function-bind": "~1.1.1", 1224 | "glob": "~7.1.4", 1225 | "has": "~1.0.3", 1226 | "inherits": "~2.0.4", 1227 | "minimist": "~1.2.0", 1228 | "object-inspect": "~1.6.0", 1229 | "resolve": "~1.11.1", 1230 | "resumer": "~0.0.0", 1231 | "string.prototype.trim": "~1.1.2", 1232 | "through": "~2.3.8" 1233 | } 1234 | }, 1235 | "through": { 1236 | "version": "2.3.8", 1237 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1238 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1239 | }, 1240 | "to-regex-range": { 1241 | "version": "5.0.1", 1242 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1243 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1244 | "dev": true, 1245 | "requires": { 1246 | "is-number": "^7.0.0" 1247 | } 1248 | }, 1249 | "tough-cookie": { 1250 | "version": "2.4.3", 1251 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1252 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1253 | "requires": { 1254 | "psl": "^1.1.24", 1255 | "punycode": "^1.4.1" 1256 | }, 1257 | "dependencies": { 1258 | "punycode": { 1259 | "version": "1.4.1", 1260 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1261 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1262 | } 1263 | } 1264 | }, 1265 | "tunnel-agent": { 1266 | "version": "0.6.0", 1267 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1268 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1269 | "requires": { 1270 | "safe-buffer": "^5.0.1" 1271 | } 1272 | }, 1273 | "tweetnacl": { 1274 | "version": "0.14.5", 1275 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1276 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1277 | }, 1278 | "typescript": { 1279 | "version": "2.9.2", 1280 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", 1281 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", 1282 | "dev": true 1283 | }, 1284 | "uri-js": { 1285 | "version": "4.2.2", 1286 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1287 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1288 | "requires": { 1289 | "punycode": "^2.1.0" 1290 | } 1291 | }, 1292 | "url-parse": { 1293 | "version": "1.5.10", 1294 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 1295 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 1296 | "dev": true, 1297 | "requires": { 1298 | "querystringify": "^2.1.1", 1299 | "requires-port": "^1.0.0" 1300 | } 1301 | }, 1302 | "uuid": { 1303 | "version": "3.3.3", 1304 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1305 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 1306 | }, 1307 | "validator": { 1308 | "version": "13.7.0", 1309 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", 1310 | "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" 1311 | }, 1312 | "verror": { 1313 | "version": "1.10.0", 1314 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1315 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1316 | "requires": { 1317 | "assert-plus": "^1.0.0", 1318 | "core-util-is": "1.0.2", 1319 | "extsprintf": "^1.2.0" 1320 | } 1321 | }, 1322 | "vscode": { 1323 | "version": "1.1.36", 1324 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.36.tgz", 1325 | "integrity": "sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ==", 1326 | "dev": true, 1327 | "requires": { 1328 | "glob": "^7.1.2", 1329 | "mocha": "^5.2.0", 1330 | "request": "^2.88.0", 1331 | "semver": "^5.4.1", 1332 | "source-map-support": "^0.5.0", 1333 | "url-parse": "^1.4.4", 1334 | "vscode-test": "^0.4.1" 1335 | }, 1336 | "dependencies": { 1337 | "commander": { 1338 | "version": "2.15.1", 1339 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 1340 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 1341 | "dev": true 1342 | }, 1343 | "diff": { 1344 | "version": "3.5.0", 1345 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 1346 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 1347 | "dev": true 1348 | }, 1349 | "escape-string-regexp": { 1350 | "version": "1.0.5", 1351 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1352 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1353 | "dev": true 1354 | }, 1355 | "growl": { 1356 | "version": "1.10.5", 1357 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 1358 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 1359 | "dev": true 1360 | }, 1361 | "mocha": { 1362 | "version": "5.2.0", 1363 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 1364 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 1365 | "dev": true, 1366 | "requires": { 1367 | "browser-stdout": "1.3.1", 1368 | "commander": "2.15.1", 1369 | "debug": "3.1.0", 1370 | "diff": "3.5.0", 1371 | "escape-string-regexp": "1.0.5", 1372 | "glob": "7.1.2", 1373 | "growl": "1.10.5", 1374 | "he": "1.1.1", 1375 | "minimatch": "3.0.4", 1376 | "mkdirp": "0.5.1", 1377 | "supports-color": "5.4.0" 1378 | }, 1379 | "dependencies": { 1380 | "glob": { 1381 | "version": "7.1.2", 1382 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1383 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1384 | "dev": true, 1385 | "requires": { 1386 | "fs.realpath": "^1.0.0", 1387 | "inflight": "^1.0.4", 1388 | "inherits": "2", 1389 | "minimatch": "^3.0.4", 1390 | "once": "^1.3.0", 1391 | "path-is-absolute": "^1.0.0" 1392 | } 1393 | } 1394 | } 1395 | }, 1396 | "supports-color": { 1397 | "version": "5.4.0", 1398 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1399 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1400 | "dev": true, 1401 | "requires": { 1402 | "has-flag": "^3.0.0" 1403 | } 1404 | } 1405 | } 1406 | }, 1407 | "vscode-test": { 1408 | "version": "0.4.3", 1409 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 1410 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 1411 | "dev": true, 1412 | "requires": { 1413 | "http-proxy-agent": "^2.1.0", 1414 | "https-proxy-agent": "^2.2.1" 1415 | } 1416 | }, 1417 | "workerpool": { 1418 | "version": "6.2.1", 1419 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 1420 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 1421 | "dev": true 1422 | }, 1423 | "wrap-ansi": { 1424 | "version": "7.0.0", 1425 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1426 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1427 | "dev": true, 1428 | "requires": { 1429 | "ansi-styles": "^4.0.0", 1430 | "string-width": "^4.1.0", 1431 | "strip-ansi": "^6.0.0" 1432 | } 1433 | }, 1434 | "wrappy": { 1435 | "version": "1.0.2", 1436 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1437 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1438 | }, 1439 | "y18n": { 1440 | "version": "5.0.8", 1441 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1442 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1443 | "dev": true 1444 | }, 1445 | "yargs": { 1446 | "version": "16.2.0", 1447 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1448 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1449 | "dev": true, 1450 | "requires": { 1451 | "cliui": "^7.0.2", 1452 | "escalade": "^3.1.1", 1453 | "get-caller-file": "^2.0.5", 1454 | "require-directory": "^2.1.1", 1455 | "string-width": "^4.2.0", 1456 | "y18n": "^5.0.5", 1457 | "yargs-parser": "^20.2.2" 1458 | } 1459 | }, 1460 | "yargs-parser": { 1461 | "version": "20.2.4", 1462 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1463 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1464 | "dev": true 1465 | }, 1466 | "yargs-unparser": { 1467 | "version": "2.0.0", 1468 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1469 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1470 | "dev": true, 1471 | "requires": { 1472 | "camelcase": "^6.0.0", 1473 | "decamelize": "^4.0.0", 1474 | "flat": "^5.0.2", 1475 | "is-plain-obj": "^2.1.0" 1476 | } 1477 | }, 1478 | "yocto-queue": { 1479 | "version": "0.1.0", 1480 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1481 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1482 | "dev": true 1483 | } 1484 | } 1485 | } 1486 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LinkCheckMD", 3 | "displayName": "HTTP/s and relative link checker", 4 | "description": "Checks Markdown links for the presence of a country-code as you type and flags as a warning. Checks whether HTTP/s links or relative links are reachable when you press Alt+L.", 5 | "icon": "images/linkcheckermdicon.png", 6 | "version": "0.3.0", 7 | "publisher": "blackmist", 8 | "galleryBanner": { 9 | "color": "#0000FF", 10 | "theme": "dark" 11 | }, 12 | "license": "SEE LICENSE IN LICENSE.md", 13 | "bugs": { 14 | "url": "https://github.com/microsoft/linkcheckermd/issues", 15 | "email": "larryfr@microsoft.com" 16 | }, 17 | "homepage": "https://github.com/microsoft/linkcheckermd/blob/master/README.md", 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/microsoft/linkcheckermd.git" 21 | }, 22 | "categories": [ 23 | "Linters", 24 | "Other" 25 | ], 26 | "engines": { 27 | "vscode": "0.10.x" 28 | }, 29 | "activationEvents": [ 30 | "onLanguage:markdown" 31 | ], 32 | "main": "./out/extension", 33 | "scripts": { 34 | "vscode:prepublish": "tsc -p ./", 35 | "compile": "tsc -watch -p ./", 36 | "postinstall": "node ./node_modules/vscode/bin/install" 37 | }, 38 | "contributes": { 39 | "commands": [ 40 | { 41 | "command": "extension.generateLinkReport", 42 | "title": "Generate a link report" 43 | } 44 | ], 45 | "keybindings": [ 46 | { 47 | "command": "extension.generateLinkReport", 48 | "key": "Alt+L" 49 | } 50 | ], 51 | "configuration": { 52 | "title": "LinkCheckMD", 53 | "properties": { 54 | "linkcheckmd.enableCountryCodeCheck": { 55 | "type": "boolean", 56 | "default": true, 57 | "description": "Enable checking links for hard-coded language identifiers (LNK0001)." 58 | } 59 | } 60 | } 61 | }, 62 | "devDependencies": { 63 | "@types/mocha": "^2.2.32", 64 | "@types/node": "^6.0.40", 65 | "mocha": "^10.2.0", 66 | "typescript": "^2.0.3", 67 | "vscode": "^1.0.0" 68 | }, 69 | "dependencies": { 70 | "broken-link": "^1.0.1", 71 | "validator": "^13.7.0" 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /test/testfile.md: -------------------------------------------------------------------------------- 1 | Some random text [with a link](./to/a/missing/file.md). And now for a link [to a valid URL](https://microsoft.com). Or maybe an [invalid one](https://microsoft.com/sporf). Or how about one that is to a [country code](http://azure.com/en-us/somethign) (but it actually validates because Azure.com redirects bad links). 2 | 3 | Now with [two links](http://azure.com/en-us/somethning) [on the same line](http://azure.com/en-us/somethingelse/). 4 | 5 | How about a [link with parentheses](https://download.microsoft.com/download/6/0/2/602A459E-E1A3-4FB9-B07F-FC2B60881900/On-premises%20data%20gateway%20(personal%20mode)-19-10.exe) in the url? 6 | 7 | How about another? [tricky (yes)](https://download.microsoft.com/download/6/0/2/602A459E-E1A3-4FB9-B07F-FC2B60881900/On-premises%20data%20gateway%20(personal%20mode).exe) 8 | 9 | How about a [reference style link?][refstyle] 10 | 11 | Or a [ftp link](ftp://microsoft.com). 12 | How about a relative link to [an existing file](./virtual-machines-linux-opensource.md). 13 | 14 | What if we have [something besides /en-us/?](http://Azure.com/en-gb/) 15 | 16 | [refstyle]: https://microsoft.com 17 | [lang-link]: https://microsoft.com/en-us -------------------------------------------------------------------------------- /test/virtual-machines-linux-opensource.md: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | 21 | 22 | # Linux and open-source computing on Azure 23 | 24 | This document attempts to list in one place all the topics written by Microsoft and its partners about running Linux-based Virtual Machines as well as other open-source compute environments and applications on Microsoft Azure. As both Azure and the open-source computing world are fast-moving targets, it is almost certain that this document is out of date, *despite* the fact that we shall do our best to continually add newer topics and remove out-of-date ones. If we've missed one, please let us know in the comments, or submit a pull request to our [GitHub repo](https://github.com/Azure/azure-content/). 25 | 26 | [AZURE.INCLUDE [learn-about-deployment-models](../../includes/learn-about-deployment-models-both-include.md)] 27 | 28 | 29 | ## General notes 30 | The sections are broken down on the right of this page. (Links may occur in more than one section, as topics can be about more than one concept, distro, or technology.) In addition, there are several topics that describe various Linux options, image repositories, case studies, and how-to topics to upload your own custom images: 31 | 32 | - [Azure Marketplace](http://azure.microsoft.com/marketplace/virtual-machines/) 33 | - [MSOpenTech VM Depot](https://vmdepot.msopentech.com/List/Index) 34 | - [Events and Demonstrations: Microsoft Openness CEE](http://www.opennessatcee.com/) 35 | - [How to: Uploading your own Distro Image](virtual-machines-linux-create-upload-vhd.md) (and also instructions using an [Azure-Endorsed Distribution](virtual-machines-linux-endorsed-distributions.md)) 36 | - [Notes: General Linux Requirements to Run in Azure](virtual-machines-linux-create-upload-vhd-generic.md) 37 | - [Notes: General Introduction for Linux on Azure](virtual-machines-linux-introduction.md) 38 | 39 | 49 | 50 | ## Distros 51 | 52 | There are tons of Linux distributions, usually broken down by the package management systems: Some are dpkg-based, like Debian and Ubuntu, and others are rpm-based, like CentOS, SUSE, and RedHat. Some companies provide distro images as formal partners of Microsoft and are endorsed. Others are provided by the community. The distros in this section have formal articles about them, even if they were only used in examples of other technologies. 53 | 54 | ### [Ubuntu](http://azure.microsoft.com/marketplace/partners/Canonical/) 55 | 56 | Ubuntu is a very popular and Azure-endorsed Linux distribution based on dpkg and apt-get package management. 57 | 58 | 1. [How to: Upload your own Ubuntu Image](virtual-machines-linux-create-upload-vhd-ubuntu.md) 59 | 2. [How to: Ubuntu LAMP Stack](virtual-machines-linux-install-lamp-stack.md) 60 | 2. [Images: LAPP Stack](http://azure.microsoft.com/marketplace/partners/bitnami/lappstack54310ubuntu1404/) 61 | 3. [How to: MySQL Clusters](virtual-machines-linux-mysql-cluster.md) 62 | 4. [How to: Node.js and Cassandra](virtual-machines-linux-nodejs-running-cassandra.md) 63 | 5. [How to: IPython Notebook](virtual-machines-python-ipython-notebook.md) 64 | 6. [Geeking out: Running ASP.NET 5 on Linux using Docker Containers](http://blogs.msdn.com/b/webdev/archive/2015/01/14/running-asp-net-5-applications-in-linux-containers-with-docker.aspx) 65 | 7. [Images: Redis Server](http://azure.microsoft.com/marketplace/partners/cognosys/redisserver269ubuntu1204lts/) 66 | 8. [Images: Minecraft Server](http://azure.microsoft.com/marketplace/partners/bitnami/craftbukkitminecraft179r030ubuntu1210/) 67 | 9. [Images: Moodle](http://azure.microsoft.com/marketplace/partners/bitnami/moodle270ubuntu1404/) 68 | 11. [Images: Mono as a Service](http://azure.microsoft.com/marketplace/partners/aegis/monoasaserviceubuntu1204/) 69 | 70 | 71 | ### [Debian](https://vmdepot.msopentech.com/List/Index?sort=Featured&search=Debian) 72 | 73 | Debian is an important distribution for the Linux and open-source world based on dpkg and apt-get package management. The MSOpenTech VM Depot has several images to use. 74 | 75 | ### CentOS 76 | 77 | The CentOS Linux distribution is a stable, predictable, manageable and reproduceable platform derived from the sources of Red Hat Enterprise Linux (RHEL). 78 | 79 | 1. [MSOpenTech VM Depot](https://vmdepot.msopentech.com/List/Index?sort=Featured&search=centos) 80 | 2. [Image Gallery](http://azure.microsoft.com/en-in/marketplace/partners/OpenLogic/) 81 | 3. [How to: Prepare a Custom CentOS-Based VM for Azure](virtual-machines-linux-create-upload-vhd-centos.md) 82 | 4. [Blog: How to Deploy a CentOS VM Image from OpenLogic](http://azure.microsoft.com/blog/2013/01/11/deploying-openlogic-centos-images-on-windows-azure-virtual-machines/) 83 | 6. [How to: Install Apache Qpid Proton-C for AMQP and Service Bus](http://msdn.microsoft.com/library/azure/dn235560.aspx) 84 | 7. [Images: Apache 2.2.15 on OpenLogic CentOS 6.3](http://azure.microsoft.com/marketplace/partners/cognosys/apache2215onopenlogiccentos63/) 85 | 8. [Images: Drupal 7.2, LAMP Server on OpenLogic CentOS 6.3](http://azure.microsoft.com/marketplace/partners/cognosys/drupal720lampserveronopenlogiccentos63/) 86 | 87 | ### SUSE Linux Enterprise Server and openSUSE 88 | 89 | 9. [MSOpenTech VM Depot](https://vmdepot.msopentech.com/List/Index?sort=Featured&search=OpenSUSE) 90 | 11. [How to: Install and Run MySQL](virtual-machines-linux-mysql-use-opensuse.md) 91 | 12. [How To: Prep a Custom SLES or openSUSE VM](virtual-machines-linux-create-upload-vhd-suse.md) 92 | 13. [[SUSE forum] How to: Move to a New Patch Server](https://forums.suse.com/showthread.php?5622-New-Update-Infrastructure) 93 | 14. [Images: SUSE Linux Enterprise Server for SAP Cloud Appliance Library](http://azure.microsoft.com/marketplace/partners/suse/suselinuxenterpriseserver11sp3forsapcloudappliance/) 94 | 95 | ### CoreOS 96 | 97 | CoreOS is a small, optimized distro for pure compute scale with a high degree of control for customization. 98 | 99 | 10. [Image Gallery](http://azure.microsoft.com/en-in/marketplace/partners/coreos/) 100 | 11. [How to: Use CoreOS on Azure](virtual-machines-linux-coreos-how-to.md) 101 | 12. [How to: Get Started with Fleet and Docker on CoreOS on Azure](virtual-machines-linux-coreos-fleet-get-started.md) 102 | 13. [Blog: TechEd Europe -- Windows Docker Client and Linux Containers](http://azure.microsoft.com/blog/2014/10/28/new-docker-coreos-topics-linux-on-azure/) 103 | 14. [Blog: Azure's getting bigger, faster, and more open](http://azure.microsoft.com/blog/2014/10/20/azures-getting-bigger-faster-and-more-open/) 104 | 15. [GitHub: Quickstart for Deploying CoreOS on Azure](https://github.com/timfpark/coreos-azure) 105 | 16. [GitHub: Deploying Java app with Spring Boot, MongoDB, and CoreOS](https://github.com/chanezon/azure-linux/tree/master/coreos/cloud-init) 106 | 107 | #### [Oracle Linux](http://azure.microsoft.com/marketplace/?term=Oracle+Linux) 108 | 2. [Prepare an Oracle Linux Virtual Machine for Azure](virtual-machines-linux-create-upload-vhd-oracle.md) 109 | 110 | ### FreeBSD 111 | 112 | 12. [MSOpenTech VM Depot](https://vmdepot.msopentech.com/List/Index?sort=Date&search=FreeBSD) 113 | 13. [Blog: Running FreeBSD in Azure](http://azure.microsoft.com/blog/2014/05/22/running-freebsd-in-azure/) 114 | 14. [Blog: Easy Deploy FreeBSD](http://msopentech.com/blog/2014/10/24/easy-deploy-freebsd-microsoft-azure-vm-depot/) 115 | 15. [Blog: Deploying a Customized FreeBSD Image](http://msopentech.com/blog/2014/05/14/deploy-customize-freebsd-virtual-machine-image-microsoft-azure/) 116 | 17. [How to: Install the Azure Linux Agent](virtual-machines-linux-agent-user-guide.md) 117 | 18. [Marketplace: Kaspersky AV for Linux File Server](http://azure.microsoft.com/marketplace/partners/kaspersky-lab/kav-for-lfs-kav-for-lfs/) 118 | 119 | ## The basics 120 | 121 | 1. [The basics: Azure Command-Line Interface (Azure CLI)](../xplat-cli-install.md) 122 | 4. [The basics: Certificate Use and Management](http://msdn.microsoft.com/library/azure/gg981929.aspx) 123 | 5. [The basics: Selecting Linux Usernames](virtual-machines-linux-usernames.md) 124 | 6. [The basics: Log on to a Linux VM Using the Azure Portal](virtual-machines-linux-how-to-log-on.md) 125 | 7. [The basics: SSH](virtual-machines-linux-use-ssh-key.md) 126 | 8. [The basics: How to Reset a Password or SSH Properties for Linux](virtual-machines-linux-use-vmaccess-reset-password-or-ssh.md) 127 | 9. [The basics: Using Root](virtual-machines-linux-use-root-privileges.md) 128 | 10. [The basics: Attaching a Data Disk to a Linux VM](virtual-machines-linux-how-to-attach-disk.md) 129 | 11. [The basics: Detaching a Data Disk from a Linux VM](virtual-machines-linux-how-to-detach-disk.md) 130 | 12. [Blogging the basics: Optimizing Storage, Disks, and Performance with Linux and Azure](http://blogs.msdn.com/b/igorpag/archive/2014/10/23/azure-storage-secrets-and-linux-i-o-optimizations.aspx) 131 | 13. [The basics: RAID](virtual-machines-linux-configure-raid.md) 132 | 14. [The basics: Capturing a Linux VM to Make a Template](virtual-machines-linux-capture-image.md) 133 | 15. [The basics: The Azure Linux Agent](virtual-machines-linux-agent-user-guide.md) 134 | 16. [The basics: Azure VM Extensions and Features](http://msdn.microsoft.com/library/azure/dn606311.aspx) 135 | 17. [The basics: Injecting Custom Data into a VM to use with Cloud-init](virtual-machines-how-to-inject-custom-data.md) 136 | 18. [Blogging the basics: Building Highly Available Linux on Azure in 12 Steps](http://blogs.technet.com/b/keithmayer/archive/2014/10/03/quick-start-guide-building-highly-available-linux-servers-in-the-cloud-on-microsoft-azure.aspx) 137 | 19. [Blogging the basics: Automate Provisioning Linux on Azure with Azure CLI, node.js, jhawk](http://blogs.technet.com/b/keithmayer/archive/2014/11/24/step-by-step-automated-provisioning-for-linux-in-the-cloud-with-microsoft-azure-xplat-cli-json-and-node-js-part-1.aspx) 138 | 19. [Create a multi-VM deployment using the Azure CLI](virtual-machines-create-multi-vm-deployment-../xplat-cli-install.md) 139 | 20. [The basics: The Azure Docker VM Extension](virtual-machines-docker-vm-extension.md) 140 | 23. [Azure Service Management REST API](https://msdn.microsoft.com/library/azure/ee460799.aspx) reference 141 | 24. [GlusterFS on Azure](http://dastouri.azurewebsites.net/gluster-on-azure-part-1/) 142 | 143 | ## Community images and repositories 144 | 3. [MSOpenTech VM Depot](https://vmdepot.msopentech.com/List/Index) — for community provided virtual machine images. 145 | 4. [GitHub](https://github.com/Azure/) — for the Azure CLI, and many other tools and projects. 146 | 5. [Docker Hub Registry](https://registry.hub.docker.com/) — the registry for Docker container images. 147 | 148 | ## Languages and platforms 149 | ### [Azure Java dev center](http://azure.microsoft.com/develop/java/) 150 | 151 | 1. [Images](https://vmdepot.msopentech.com/List/Index?sort=Featured&search=java) 152 | 2. [How to: Use Service Bus from Java with AMQP 1.0](http://msdn.microsoft.com/library/azure/jj841073.aspx) 153 | 3. [How to: Set up Tomcat7 on Linux Using the Azure Portal](virtual-machines-linux-setup-tomcat7-linux.md) 154 | 4. [Video: Azure Java SDK for Service Management](http://channel9.msdn.com/Shows/Cloud+Cover/Episode-157-The-Java-SDK-for-Azure-Management-with-Brady-Gaster) 155 | 5. [Blog: Getting Started with Azure Management Libraries for Java](http://azure.microsoft.com/blog/2014/09/15/getting-started-with-the-azure-java-management-libraries/) 156 | 5. [GitHub repo: Azure Toolkit for Eclipse with Java](https://github.com/MSOpenTech/WindowsAzureToolkitForEclipseWithJava) 157 | 6. [Reference: Azure Toolkit for Eclipse with Java](http://msdn.microsoft.com/library/azure/hh694271.aspx) 158 | 7. [GitHub repo: MS Open Tech Tools plugin for IntelliJ IDEA and Android Studio](https://github.com/MSOpenTech/msopentech-tools-for-intellij) 159 | 7. [Blog: MSOpenTech Contributes to the OpenJDK](http://msopentech.com/blog/2014/10/21/ms-open-techs-first-contribution-openjdk/) 160 | 8. [Images: WebSphere](http://azure.microsoft.com/marketplace/partners/msopentech/was-8-5-was-8-5-5-3/) 161 | 9. [Images: WebLogic](http://azure.microsoft.com/marketplace/?term=weblogic) 162 | 10. [Images: JDK6 on Windows](http://azure.microsoft.com/marketplace/partners/msopentech/jdk6onwindowsserver2012/) 163 | 11. [Images: JDK7 on Windows](http://azure.microsoft.com/marketplace/partners/msopentech/jdk7onwindowsserver2012/) 164 | 12. [Images: JDK8 on Windows](http://azure.microsoft.com/marketplace/partners/msopentech/jdk8onwindowsserver2012r2/) 165 | 166 | ### JVM languages 167 | 168 | 1. [Scala: Running Play Framework Applications in Azure Cloud Services](http://msopentech.com/blog/2014/09/25/tutorial-running-play-framework-applications-microsoft-azure-cloud-services-2/) 169 | 170 | ### SDK types, installations, upgrades 171 | 4. [Azure Service Management SDK: Java](http://dl.windowsazure.com/javadoc/) 172 | 5. [Azure Service Management SDK: Go](https://github.com/MSOpenTech/azure-sdk-for-go) 173 | 5. [Azure Service Management SDK: Ruby](https://github.com/MSOpenTech/azure-sdk-for-ruby) 174 | - [How to: Install Ruby on Rails](virtual-machines-ruby-rails-web-app-linux.md) 175 | 6. [Azure Service Management SDK: Python](https://github.com/Azure/azure-sdk-for-python) 176 | - [How to: Django Hello World Web Application (Mac-Linux)](virtual-machines-python-django-web-app-linux.md) 177 | 7. [Azure Service Management SDK: Node.js](https://github.com/MSOpenTech/azure-sdk-for-node) 178 | 8. [Azure Service Management SDK: PHP](https://github.com/MSOpenTech/azure-sdk-for-php) 179 | - [How to: Install the LAMP Stack on an Azure VM](virtual-machines-linux-install-lamp-stack.md) 180 | - [Video: Install a LAMP Stack on an Azure VM](http://channel9.msdn.com/Shows/Azure-Friday/LAMP-stack-on-Azure-VMs-with-Guy-Bowerman) 181 | 9. [Azure Service Management SDK: .NET](https://github.com/Azure/azure-sdk-for-net) 182 | 10. [Blog: Mono, ASP.NET 5, Linux, and Docker](http://blogs.msdn.com/b/webdev/archive/2015/01/14/running-asp-net-5-applications-in-linux-containers-with-docker.aspx) 183 | 184 | ## Samples and scripts 185 | 186 | Look for this section to fill up quickly. If you have suggestions, send us a PR or leave them in comments, below. 187 | 188 | 1. [Create a multi-VM deployment using the Azure CLI](virtual-machines-create-multi-vm-deployment-../xplat-cli-install.md) 189 | 2. [Patrick Chanezon's Azure Linux GitHub repository](https://github.com/chanezon/azure-linux) 190 | 3. [Video: How to Move On-Premises USB data on Linux to Azure using **usbip**](http://channel9.msdn.com/Blogs/Open/On-premises-USB-devices-on-Linux-on-Azure-via-usbip) 191 | 4. [Video: Accessing Linux-based GUI on Azure in the Browser with fernapp](http://channel9.msdn.com/Blogs/Open/Accessing-Linux-based-GUI-on-Azure-over-browser-with-fernapp) 192 | 5. [Video: Shared Storage on Linux Using Azure Files Preview -- Part 1](http://channel9.msdn.com/Blogs/Open/Shared-storage-on-Linux-via-Azure-Files-Preview-Part-1) 193 | 6. [Video: Embracing Linux Devices on Azure using Service Bus and Web Sites](http://channel9.msdn.com/Blogs/Open/Embracing-Linux-devices-on-Azure-via-Service-Bus-and-Web-Sites) 194 | 7. [Video: Connecting a Native Linux-based memcached application to Azure](http://channel9.msdn.com/Blogs/Open/Connecting-a-Linux-based-native-memcache-application-to-Windows-Azure) 195 | 8. [Video: Load Balancing Highly Available Linux Services on Azure: OpenLDAP and MySQL](http://channel9.msdn.com/Blogs/Open/Load-balancing-highly-available-Linux-services-on-Windows-Azure-OpenLDAP-and-MySQL) 196 | 197 | 198 | ## Data 199 | 200 | This section contains information about several different storage approaches and technologies, including NoSQL, Relational, and Big Data. 201 | 202 | ### NoSQL 203 | 204 | 1. [Blog: 8 Open-source NoSql Databases for Azure](http://openness.microsoft.com/blog/2014/11/03/open-source-nosql-databases-microsoft-azure/) 205 | 2. Couchdb 206 | - [Slideshare (MSOpenTech): Experiences with CouchDb on Azure](http://www.slideshare.net/brianbenz/experiences-using-couchdb-inside-microsofts-azure-team) 207 | - [Blog: Running CouchDB-as-a-Service with node.js, CORS, and Grunt](http://msopentech.com/blog/2013/12/19/tutorial-building-multi-tier-windows-azure-web-application-use-cloudants-couchdb-service-node-js-cors-grunt-2/) 208 | 3. MongoDB 209 | - [How to: Create a Node.js Application on Azure with MongoDB using the MongoLab Add-On](store-mongolab-web-sites-nodejs-store-data-mongodb.md) 210 | 4. Cassandra 211 | - [How to: Running Cassandra with Linux on Azure and Accessing it from Node.js](virtual-machines-linux-nodejs-running-cassandra.md) 212 | 5. Redis 213 | - [Blog: Redis on Windows in the Azure Redis Cache Service](http://msopentech.com/blog/2014/05/12/redis-on-windows/) 214 | - [Blog: Announcing ASP.NET Session State Provider for Redis Preview Release](http://blogs.msdn.com/b/webdev/archive/2014/05/12/announcing-asp-net-session-state-provider-for-redis-preview-release.aspx) 215 | 6. RavenHQ 216 | - [Blog: RavenHQ Now Available in the Azure Marketplace](http://azure.microsoft.com/blog/2014/08/12/ravenhq-now-available-in-the-azure-store/) 217 | 218 | ### Big Data 219 | 2. Hadoop/Cloudera 220 | - [Blog: Installing Hadoop on Azure Linux VMs](http://blogs.msdn.com/b/benjguin/archive/2013/04/05/how-to-install-hadoop-on-windows-azure-linux-virtual-machines.aspx) 221 | - [How to: Get Started with Hadoop and Hive using HDInsight](hdinsight-get-started.md) 222 | 3. [Azure HDInsight](http://azure.microsoft.com/services/hdinsight/) -- a fully managed Hadoop service on Azure. 223 | 224 | ### Relational database 225 | 2. MySQL 226 | - [How to: Install and Run MySQL](virtual-machines-linux-mysql-use-opensuse.md) 227 | - [How to: Optimize Performance of MySQL on Azure](virtual-machines-linux-optimize-mysql-perf.md) 228 | - [How to: MySQL Clusters](virtual-machines-linux-mysql-cluster.md) 229 | - [How to: Create a MySQL Database using the Marketplace](store-php-create-mysql-database.md) 230 | - [How to: Django and MySQL on Azure Websites with Python and Visual Studio](web-sites-python-ptvs-django-mysql.md) 231 | - [How to: PHP and MySQL on Azure Websites with WebMatrix](web-sites-php-mysql-use-webmatrix.md) 232 | - [MySQL High Availability Architecture in Microsoft Azure](http://download.microsoft.com/download/6/1/C/61C0E37C-F252-4B33-9557-42B90BA3E472/MySQL_HADR_solution_in_Azure.pdf) 233 | 7. MariaDB 234 | - [How to: Create a Multi-Master cluster of MariaDbs](virtual-machines-mariadb-cluster.md) 235 | 8. [Installing Postgres with corosync, pg_bouncer using ILB](https://github.com/chgeuer/postgres-azure) 236 | 237 | 238 | ## Auth and encryption 239 | 240 | Authentication and encryption are critical topics in software development, and there are many, many topics on the web that describe how to learn and use proper security techniques for both. We describe some of the basic usage to get up and running quickly with Linux and opensource workloads, as well pointing to tools to use to reset or remove remote security features on Azure. These are basic procedures, and we will be adding more complex scenarios soon. 241 | 242 | 4. [The basics: Certificate Use and Management](http://msdn.microsoft.com/library/azure/gg981929.aspx) 243 | 7. [The basics: SSH](virtual-machines-linux-use-ssh-key.md) 244 | 8. [The basics: How to Reset a Password or SSH Properties for Linux](virtual-machines-linux-use-vmaccess-reset-password-or-ssh.md) 245 | 9. [The basics: Using Root](virtual-machines-linux-use-root-privileges.md) 246 | 247 | ## Linux high performance computing (HPC) 248 | 249 | Run HPC workloads on Linux VM clusters built with open-source tools or with Microsoft HPC Pack. 250 | 251 | 1. [Quickstart template: Spin up a SLURM cluster](http://azure.microsoft.com/documentation/templates/slurm/) 252 | (and [blog post](http://blogs.technet.com/b/windowshpc/archive/2015/06/06/deploy-a-slurm-cluster-on-azure.aspx)) 253 | 2. [Quickstart template: Spin up a Torque cluster](http://azure.microsoft.com/documentation/templates/torque-cluster/) 254 | 3. [Quickstart template: Create an HPC cluster with Linux compute nodes](https://azure.microsoft.com/documentation/templates/create-hpc-cluster-linux-cn/) 255 | 4. [Tutorial: Get started with Linux compute nodes in an HPC Pack cluster in Azure](virtual-machines-linux-cluster-hpcpack.md) 256 | 5. [Tutorial: Run NAMD with Microsoft HPC Pack on Linux compute nodes in Azure](virtual-machines-linux-cluster-hpcpack-namd.md) 257 | 6. [Tutorial: Set up a Linux RDMA cluster to run MPI applications](virtual-machines-linux-cluster-rdma.md) 258 | 259 | 260 | ## Devops, management, and optimization 261 | 262 | This section starts with a blog entry containing a series of videos on [Video: Azure Virtual Machines : Using Chef, Puppet and Docker for managing Linux VMs](http://azure.microsoft.com/blog/2014/12/15/azure-virtual-machines-using-chef-puppet-and-docker-for-managing-linux-vms/). However, the world of devops, management, and optimization is quite expansive and changing very quickly, so you should consider the list below a starting point. 263 | 264 | 1. Docker 265 | - [Docker VM Extension for Linux on Azure](virtual-machines-docker-vm-extension.md) 266 | - [Using the Docker VM Extension from the Azure Command-line Interface (Azure CLI)](virtual-machines-docker-with-../xplat-cli-install.md) 267 | - [Using the Docker VM Extension from the Azure Preview Portal](virtual-machines-docker-with-portal.md) 268 | - [Getting Started Quickly with Docker in the Azure Marketplace](virtual-machines-docker-ubuntu-quickstart.md) 269 | - [How to use docker-machine on Azure](virtual-machines-docker-machine.md) 270 | - [How to use docker with swarm on Azure](virtual-machines-docker-swarm.md) 271 | - [Get Started with Docker and Compose on Azure](virtual-machines-docker-compose-quickstart.md) 272 | 273 | 2. [Fleet with CoreOS](virtual-machines-linux-coreos-how-to.md) 274 | 3. Deis 275 | - [GitHub repo: Installing Deis on a CoreOS cluster on Azure](https://github.com/chanezon/azure-linux/tree/master/coreos/deis) 276 | 4. Kubernetes 277 | - [Complete guide to automated Kubernetes cluster deployment with CoreOS and Weave](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/getting-started-guides/coreos/azure/README.md#kubernetes-on-azure-with-coreos-and-weave) 278 | - [Kubernetes Visualizer](http://azure.microsoft.com/blog/2014/08/28/hackathon-with-kubernetes-on-azure) 279 | 5. Jenkins and Hudson 280 | - [Blog: Jenkins Slave Plug-in for Azure](http://msopentech.com/blog/2014/09/23/announcing-jenkins-slave-plugin-azure/) 281 | - [GitHub repo: Jenkins Storage Plug-in for Azure](https://github.com/jenkinsci/windows-azure-storage-plugin) 282 | - [Third Party: Hudson Slave Plug-in for Azure](http://wiki.hudson-ci.org/display/HUDSON/Azure+Slave+Plugin) 283 | - [Third Party: Hudson Storage Plug-in for Azure](https://github.com/hudson3-plugins/windows-azure-storage-plugin) 284 | 10. Chef 285 | - [Chef and Virtual Machines](virtual-machines-windows-install-chef-client.md) 286 | - [Video: What is Chef and How does it Work?](https://msopentech.com/blog/2014/03/31/using-chef-to-manage-azure-resources/) 287 | 288 | 12. Azure Automation 289 | - [Video: How to Use Azure Automation with Linux VMs](http://channel9.msdn.com/Shows/Azure-Friday/Azure-Automation-104-managing-Linux-and-creating-Modules-with-Joe-Levy) 290 | 13. Powershell DSC for Linux 291 | - [Blog: How to do Powershell DSC for Linux](http://blogs.technet.com/b/privatecloud/archive/2014/05/19/powershell-dsc-for-linux-step-by-step.aspx) 292 | - [GitHub: Docker Client DSC](https://github.com/anweiss/DockerClientDSC) 293 | 13. [Ubuntu Juju](https://juju.ubuntu.com/docs/config-azure.html) 294 | 14. [Packer plugin for Azure](https://github.com/msopentech/packer-azure) 295 | 296 | ## Support, troubleshooting, and "it just doesn't work" 297 | 298 | 1. Microsoft support documentation 299 | - [Support: Support for Linux Images on Microsoft Azure](http://support2.microsoft.com/kb/2941892) 300 | 301 | 302 | [Distros]: #distros 303 | [The Basics]: #basics 304 | [Community Images and Repositories]: #images 305 | [Languages and Platforms]: #langsandplats 306 | [Samples and Scripts]: #samples 307 | [Auth and Encryption]: #security 308 | [Devops, Management, and Optimization]: #devops 309 | [Support, Troubleshooting, and "It Just Doesn't Work"]: #supportdebug 310 | 311 | 312 | [How to use docker-machine on Azure]: virtual-machines-docker-machine.md 313 | [How to use docker with swarm on Azure]: virtual-machines-docker-swarm.md 314 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": ["es6"], 7 | "sourceMap": true, 8 | "rootDir": "." 9 | }, 10 | "exclude": ["node_modules"] 11 | } --------------------------------------------------------------------------------