├── .gitignore ├── jest.config.js ├── .gitattributes ├── docs └── images │ ├── icon.png │ ├── example.png │ └── symbols.png ├── .vscodeignore ├── server ├── __tests__ │ └── server.test.ts ├── tsconfig.json ├── package.json ├── package-lock.json └── src │ └── server.ts ├── client ├── tsconfig.json ├── package.json ├── src │ └── extension.ts └── package-lock.json ├── CHANGELOG.md ├── tsconfig.json ├── .vscode └── launch.json ├── language-configuration.json ├── tslint.json ├── README.md ├── LICENSE ├── package.json └── syntaxes ├── hlasm.tmLanguage.yaml └── hlasm.tmLanguage.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.vsix 3 | out -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | }; -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set default behavior to automatically normalize line endings. 2 | * text=auto 3 | 4 | -------------------------------------------------------------------------------- /docs/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dkelosky/vscode-ibm-hlasm/HEAD/docs/images/icon.png -------------------------------------------------------------------------------- /docs/images/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dkelosky/vscode-ibm-hlasm/HEAD/docs/images/example.png -------------------------------------------------------------------------------- /docs/images/symbols.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dkelosky/vscode-ibm-hlasm/HEAD/docs/images/symbols.png -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | .gitignore 4 | vsc-extension-quickstart.md 5 | **/__tests__/** 6 | **/tsconfig.json 7 | **/*.ts -------------------------------------------------------------------------------- /server/__tests__/server.test.ts: -------------------------------------------------------------------------------- 1 | describe("server tests", () => { 2 | it("should serve as a placeholder for refactoring to add tests", () => { 3 | expect(true).toBe(true); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "rootDir": "src", 7 | "sourceMap": true 8 | }, 9 | "include": [ 10 | "src" 11 | ], 12 | "exclude": [ 13 | "node_modules", 14 | ".vscode-test" 15 | ] 16 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [0.7.0] - 2020-05-09 9 | 10 | ### Updated 11 | 12 | - Dependency updates 13 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "sourceMap": true, 7 | "strict": true, 8 | "outDir": "out", 9 | "rootDir": "src" 10 | }, 11 | "include": [ 12 | "src" 13 | ], 14 | "exclude": [ 15 | "node_modules", 16 | ".vscode-test" 17 | ] 18 | } -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ibm-assembler-server", 3 | "description": "HLASM implementation of a language server in node.", 4 | "version": "1.0.0", 5 | "author": "Microsoft Corporation", 6 | "license": "MIT", 7 | "engines": { 8 | "node": "*" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/dkelosky/vscode-ibm-hlasm" 13 | }, 14 | "dependencies": { 15 | "vscode-languageserver": "^4.1.3" 16 | }, 17 | "scripts": {} 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "rootDir": "src", 7 | "sourceMap": true 8 | }, 9 | "include": [ 10 | "src" 11 | ], 12 | "exclude": [ 13 | "node_modules", 14 | ".vscode-test" 15 | ], 16 | "references": [ 17 | { 18 | "path": "./client" 19 | }, 20 | { 21 | "path": "./server" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that launches the extension inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "*" 4 | }, 5 | // symbols used as brackets 6 | "brackets": [ 7 | ["{", "}"], 8 | ["[", "]"], 9 | ["(", ")"] 10 | ], 11 | // symbols that are auto closed when typing 12 | "autoClosingPairs": [ 13 | ["{", "}"], 14 | ["[", "]"], 15 | ["(", ")"], 16 | ["\"", "\""], 17 | ["'", "'"] 18 | ], 19 | // symbols that that can be used to surround a selection 20 | "surroundingPairs": [ 21 | ["{", "}"], 22 | ["[", "]"], 23 | ["(", ")"], 24 | ["\"", "\""], 25 | ["'", "'"] 26 | ] 27 | } -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ibm-assembler-client", 3 | "description": "VSCode part of a language server", 4 | "author": "kelosky", 5 | "license": "MIT", 6 | "version": "0.0.1", 7 | "publisher": "vscode", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/dkelosky/vscode-ibm-hlasm" 11 | }, 12 | "engines": { 13 | "vscode": "^1.28.0" 14 | }, 15 | "scripts": { 16 | "update-vscode": "vscode-install", 17 | "postinstall": "vscode-install" 18 | }, 19 | "dependencies": { 20 | "vscode-languageclient": "^4.1.4" 21 | }, 22 | "devDependencies": { 23 | "vscode": "^1.1.35" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest", 3 | "rules": { 4 | "object-literal-sort-keys": false, 5 | "ordered-imports": false, 6 | "one-line": false, 7 | "space-within-parens": false, 8 | "no-var-requires": false, 9 | "trailing-comma": false, 10 | "max-line-length": [ 11 | true, 12 | 150 13 | ], 14 | "no-magic-numbers": [ 15 | true, 16 | -1, 17 | 0, 18 | 1 19 | ], 20 | "no-consecutive-blank-lines": [ 21 | true, 22 | 2 23 | ], 24 | "prefer-conditional-expression": false, 25 | "indent": [true, "spaces", 4], 26 | "whitespace": [true, "check-module"] 27 | }, 28 | "type-check": true 29 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![downloads](https://img.shields.io/visual-studio-marketplace/d/kelosky.ibm-assembler)](https://marketplace.visualstudio.com/items?itemName=kelosky.ibm-assembler) 2 | [![license](https://img.shields.io/github/license/dkelosky/vscode-ibm-hlasm)](https://github.com/dkelosky/vscode-ibm-hlasm) 3 | 4 | # HLASM Highlighting Extension for VS Code 5 | 6 | Minimum featured HLASM highlighter and LSP extension for VS Code. 7 | 8 | > Tip: Add editor configuration in `user.settings` to highlight continuation column, e.g. `[hlasm] : { "editor.rulers" : [71, 72, 80]},` 9 | 10 | ## Acknowledgements 11 | 12 | Special thanks to [CoderCoco](https://github.com/CoderCoco) for creating the base version of this extension! 13 | 14 | Thanks to [mhammack](https://github.com/mhammack) for extra updates! 15 | 16 | ## Features 17 | 18 | Go to definition via `Ctrl + click` or `F12`. 19 | 20 | Highlighting and symbol resolution via `Ctrl + Shift + O`: 21 | 22 | ![Highlighting](./docs/images/symbols.png) 23 | 24 | ## Contributing 25 | 26 | `npm run build:syntax` to convert `.yaml` to required `.json`. 27 | 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Dan Kelosky 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ibm-assembler-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "vscode-jsonrpc": { 8 | "version": "4.0.0", 9 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", 10 | "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" 11 | }, 12 | "vscode-languageserver": { 13 | "version": "4.4.2", 14 | "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-4.4.2.tgz", 15 | "integrity": "sha512-61y8Raevi9EigDgg9NelvT9cUAohiEbUl1LOwQQgOCAaNX62yKny/ddi0uC+FUTm4CzsjhBu+06R+vYgfCYReA==", 16 | "requires": { 17 | "vscode-languageserver-protocol": "^3.10.3", 18 | "vscode-uri": "^1.0.5" 19 | } 20 | }, 21 | "vscode-languageserver-protocol": { 22 | "version": "3.14.1", 23 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", 24 | "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", 25 | "requires": { 26 | "vscode-jsonrpc": "^4.0.0", 27 | "vscode-languageserver-types": "3.14.0" 28 | } 29 | }, 30 | "vscode-languageserver-types": { 31 | "version": "3.14.0", 32 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", 33 | "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" 34 | }, 35 | "vscode-uri": { 36 | "version": "1.0.8", 37 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", 38 | "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /client/src/extension.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as path from 'path'; 7 | import { workspace, ExtensionContext } from 'vscode'; 8 | 9 | import { 10 | LanguageClient, 11 | LanguageClientOptions, 12 | ServerOptions, 13 | TransportKind 14 | } from 'vscode-languageclient'; 15 | 16 | let client: LanguageClient; 17 | 18 | export function activate(context: ExtensionContext) { 19 | // The server is implemented in node 20 | let serverModule = context.asAbsolutePath( 21 | path.join('server', 'out', 'server.js') 22 | ); 23 | // The debug options for the server 24 | // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging 25 | let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] }; 26 | 27 | // If the extension is launched in debug mode then the debug server options are used 28 | // Otherwise the run options are used 29 | let serverOptions: ServerOptions = { 30 | run: { module: serverModule, transport: TransportKind.ipc }, 31 | debug: { 32 | module: serverModule, 33 | transport: TransportKind.ipc, 34 | options: debugOptions 35 | }, 36 | }; 37 | 38 | // Options to control the language client 39 | let clientOptions: LanguageClientOptions = { 40 | // Register the server for IBM assembler documents 41 | documentSelector: [{ language: 'hlasm' }], 42 | // documentSelector: [{ scheme: 'file', language: 'hlasm' }], 43 | synchronize: { 44 | // Notify the server about file changes to '.clientrc files contained in the workspace 45 | fileEvents: workspace.createFileSystemWatcher('**/.asm') 46 | } 47 | }; 48 | 49 | // Create the language client and start the client. 50 | client = new LanguageClient( 51 | 'hlasmServer', 52 | 'HLASM Server', 53 | serverOptions, 54 | clientOptions 55 | ); 56 | 57 | // Start the client. This will also launch the server 58 | client.start(); 59 | } 60 | 61 | export function deactivate(): Thenable | undefined { 62 | if (!client) { 63 | return undefined; 64 | } 65 | return client.stop(); 66 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ibm-assembler", 3 | "license": "MIT", 4 | "displayName": "ibm-assembler", 5 | "description": "IBM Assembler Language Highlighter", 6 | "repository": "https://github.com/dkelosky/vscode-ibm-hlasm", 7 | "version": "0.8.1", 8 | "keywords": [ 9 | "z/OS", 10 | "s390", 11 | "mvs", 12 | "assembler", 13 | "mainframe", 14 | "s390x", 15 | "HLASM", 16 | "ASMA90", 17 | "assembly" 18 | ], 19 | "publisher": "kelosky", 20 | "icon": "docs/images/icon.png", 21 | "engines": { 22 | "vscode": "^1.28.0" 23 | }, 24 | "categories": [ 25 | "Programming Languages" 26 | ], 27 | "main": "./client/out/extension", 28 | "contributes": { 29 | "configuration": { 30 | "type": "object", 31 | "title": "HLASM configuration", 32 | "properties": { 33 | "hlasmServer.maxNumberOfProblems": { 34 | "scope": "resource", 35 | "type": "number", 36 | "default": 100, 37 | "description": "Controls the maximum number of problems produced by the server." 38 | }, 39 | "hlasmServer.trace.server": { 40 | "scope": "window", 41 | "type": "string", 42 | "enum": [ 43 | "off", 44 | "messages", 45 | "verbose" 46 | ], 47 | "default": "off", 48 | "description": "Traces the communication between VS Code and the language server." 49 | } 50 | } 51 | }, 52 | "languages": [ 53 | { 54 | "id": "hlasm", 55 | "aliases": [ 56 | "IBM HLASM", 57 | "hlasm" 58 | ], 59 | "extensions": [ 60 | ".hlasm", 61 | ".asm", 62 | ".s", 63 | ".asmpgm", 64 | ".mac", 65 | ".asmmac" 66 | ], 67 | "configuration": "./language-configuration.json" 68 | } 69 | ], 70 | "grammars": [ 71 | { 72 | "language": "hlasm", 73 | "scopeName": "source.hlasm", 74 | "path": "./syntaxes/hlasm.tmLanguage.json" 75 | } 76 | ], 77 | "configurationDefaults": { 78 | "[hlasm]": { 79 | "editor.autoIndent": "none", 80 | "editor.rulers": [ 81 | 71, 82 | 72, 83 | 80 84 | ] 85 | } 86 | } 87 | }, 88 | "activationEvents": [ 89 | "onLanguage:hlasm" 90 | ], 91 | "scripts": { 92 | "vscode:prepublish": "npm run build:syntax && cd client && npm run update-vscode && cd .. && npm run compile", 93 | "compile": "tsc -b", 94 | "watch": "tsc -b -w", 95 | "build:syntax": "js-yaml syntaxes/hlasm.tmLanguage.yaml > syntaxes/hlasm.tmLanguage.json", 96 | "postinstall": "cd client && npm install && cd ../server && npm install && cd .." 97 | }, 98 | "devDependencies": { 99 | "@types/jest": "^24.0.16", 100 | "@types/node": "^8.0.0", 101 | "jest": "^24.8.0", 102 | "js-yaml": "^3.13.1", 103 | "ts-jest": "^24.0.2", 104 | "tslint": "^5.16.0", 105 | "typescript": "^3.5.1" 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /syntaxes/hlasm.tmLanguage.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | "$schema": https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json 3 | name: IBM HLASM 4 | patterns: 5 | - include: "#hlasm_syntax" 6 | repository: 7 | hlasm_syntax: 8 | patterns: 9 | - include: "#lineTooLong" 10 | - include: "#lineComment" 11 | - include: "#parseLine" 12 | - include: "#asmArgumentLine" 13 | - include: "#asmLineStart" 14 | additionalAsmHighlight: 15 | patterns: 16 | - include: "#labels" 17 | - include: "#asmSpecialStatements" 18 | - include: "#operators" 19 | - include: "#numbers" 20 | lineTooLong: 21 | # Assembler lines should only be 72 chars, at 73 the entire line should 22 | # be in error 23 | patterns: 24 | - name: invalid.illegal.hlasm 25 | match: "^.{81,}" 26 | lineComment: 27 | # All statements that have a * in column 1 28 | patterns: 29 | - name: comment.line.double-slash.hlasm 30 | match: "^(\\*.{70,70})(.*)" 31 | captures: 32 | '1': 33 | name: comment.line.double-slash.hlasm 34 | '2': 35 | patterns: 36 | - match: "\\s(.{0,8})" 37 | captures: 38 | '1': 39 | # SEQUENCE NUMBERS!!!!! 40 | patterns: 41 | - include: "#sequenceNumbers" 42 | - match: "([^\\s])(.{0,8})" 43 | captures: 44 | '1': 45 | name: invalid.illegal.hlasm 46 | '2': 47 | # SEQUENCE NUMBERS!!!!! 48 | patterns: 49 | - include: "#sequenceNumbers" 50 | - name: comment.line.double-slash.hlasm 51 | match: "\\*.*" 52 | parseLine: 53 | patterns: 54 | - # Continuation character that appears in column 72 55 | match: "^(.{71,71})([^\\s])(.{0,8})" 56 | captures: 57 | '1': 58 | # Allow syntax highlighting of the rest of the line 59 | patterns: 60 | - include: "#asmArgumentLine" 61 | - include: "#asmLineStart" 62 | '2': 63 | name: keyword.other.hlasm 64 | '3': 65 | # SEQUENCE NUMBERS!!!!! 66 | patterns: 67 | - include: "#sequenceNumbers" 68 | '5': 69 | # This next capture group is the entire next line 70 | patterns: 71 | - match: "\\S.*" 72 | name: invalid.illegal 73 | # Sequence numbers for non-continuation lines 74 | - match: "^(.{71,71})(\\s?)(.{0,8})$" 75 | captures: 76 | '1': 77 | # Allow syntax highlighting of the rest of the line 78 | patterns: 79 | - include: "#asmArgumentLine" 80 | - include: "#asmLineStart" 81 | '3': 82 | # SEQUENCE NUMBERS!!!!! 83 | patterns: 84 | - include: "#sequenceNumbers" 85 | asmLineStart: 86 | # The various parts of an assembler line 87 | patterns: 88 | - match: "^([^*]\\S*)?\\s+(.*)$" 89 | captures: 90 | '1': 91 | # The label for a line. 92 | name: entity.name.function.hlasm 93 | '2': 94 | # The assembler instructions for this statement 95 | patterns: 96 | - include: "#asmInstruction" 97 | asmInstruction: 98 | # A simple assembler source statement with 3 things. An instruction, 99 | # parameters, and comment 100 | patterns: 101 | - match: "(\\S+)\\s*(.*)" 102 | captures: 103 | '1': 104 | name: keyword.other.hlasm 105 | '2': 106 | patterns: 107 | - include: "#asmArguments" 108 | asmArgumentLine: 109 | # This is for a line consisting of only an argument. This implies 110 | # the previous line was a continuation 111 | patterns: 112 | # A line matching this syntax should follow the argument syntax 113 | - match: "^\\s+(\\S+=.*)$" 114 | captures: 115 | '1': 116 | patterns: 117 | - include: "#asmArguments" 118 | asmArguments: 119 | patterns: 120 | - include: "#stringType" 121 | - include: "#quoteType" 122 | # Handle no strings in instruction 123 | - match: "(\\S*)(.*)" 124 | captures: 125 | '1': 126 | # This group refers to an instruction operator 127 | name: keyword.control.hlasm 128 | patterns: 129 | - include: "#additionalAsmHighlight" 130 | '2': 131 | # The rest of the line is a comment. 132 | name: comment.line.double-slash.hlasm 133 | # If the current pattern starts with a space, then we should comment 134 | # the rest of the string 135 | - match: "\\s.*" 136 | name: comment.line.double-slash.hlasm 137 | stringType: 138 | patterns: 139 | # Handle strings in an instruction 140 | - match: "(\\S*?)('.*?')(.*)" 141 | captures: 142 | '1': 143 | # This group refers to an instruction operator 144 | name: keyword.control.hlasm 145 | patterns: 146 | - include: "#additionalAsmHighlight" 147 | '2': 148 | # A string was found, so we can't be sure this is the end of 149 | # the line 150 | name: string.quoted.single.hlasm 151 | '3': 152 | # Recursively call this rule to get all patterns. 153 | patterns: 154 | - include: "#asmArguments" 155 | quoteType: 156 | patterns: 157 | # Handle a length instruction 158 | - match: "(\\S*?)([LKNT]')(.*)" 159 | captures: 160 | '1': 161 | # This group refers to an instruction operator 162 | name: keyword.control.hlasm 163 | patterns: 164 | - include: "#additionalAsmHighlight" 165 | '2': 166 | # Highlight the L' operator as a type 167 | name: support.type.hlasm 168 | '3': 169 | # Recursively call this rule to get all patterns. 170 | patterns: 171 | - include: "#asmArguments" 172 | labels: 173 | # marks special labels in the code 174 | match: "[*]" 175 | name: support.function.hlasm 176 | operators: 177 | # marks operators properly 178 | match: "[=(),+]" 179 | name: keyword.operator.hlasm 180 | numbers: 181 | # marks numbers properly 182 | match: "(?<=[=(),*\\s+])-?\\d*(?=[=(),*+\\s]|$)" 183 | name: constant.numeric.hlasm 184 | asmSpecialStatements: 185 | # allows for special assembler statements 186 | match: "(?<=[=(),*+\\s])=?\\d*(A|B|C|D|E|F|G|H|P|V|X|Z)(L\\d*)?(?=[=(),*\\s+]|$)" 187 | name: support.type.hlasm 188 | sequenceNumbers: 189 | name: constant.numeric.hlasm 190 | match: ".*" 191 | scopeName: source.hlasm 192 | -------------------------------------------------------------------------------- /syntaxes/hlasm.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", 3 | "name": "IBM HLASM", 4 | "patterns": [ 5 | { 6 | "include": "#hlasm_syntax" 7 | } 8 | ], 9 | "repository": { 10 | "hlasm_syntax": { 11 | "patterns": [ 12 | { 13 | "include": "#lineTooLong" 14 | }, 15 | { 16 | "include": "#lineComment" 17 | }, 18 | { 19 | "include": "#parseLine" 20 | }, 21 | { 22 | "include": "#asmArgumentLine" 23 | }, 24 | { 25 | "include": "#asmLineStart" 26 | } 27 | ] 28 | }, 29 | "additionalAsmHighlight": { 30 | "patterns": [ 31 | { 32 | "include": "#labels" 33 | }, 34 | { 35 | "include": "#asmSpecialStatements" 36 | }, 37 | { 38 | "include": "#operators" 39 | }, 40 | { 41 | "include": "#numbers" 42 | } 43 | ] 44 | }, 45 | "lineTooLong": { 46 | "patterns": [ 47 | { 48 | "name": "invalid.illegal.hlasm", 49 | "match": "^.{81,}" 50 | } 51 | ] 52 | }, 53 | "lineComment": { 54 | "patterns": [ 55 | { 56 | "name": "comment.line.double-slash.hlasm", 57 | "match": "^(\\*.{70,70})(.*)", 58 | "captures": { 59 | "1": { 60 | "name": "comment.line.double-slash.hlasm" 61 | }, 62 | "2": { 63 | "patterns": [ 64 | { 65 | "match": "\\s(.{0,8})", 66 | "captures": { 67 | "1": { 68 | "patterns": [ 69 | { 70 | "include": "#sequenceNumbers" 71 | } 72 | ] 73 | } 74 | } 75 | }, 76 | { 77 | "match": "([^\\s])(.{0,8})", 78 | "captures": { 79 | "1": { 80 | "name": "invalid.illegal.hlasm" 81 | }, 82 | "2": { 83 | "patterns": [ 84 | { 85 | "include": "#sequenceNumbers" 86 | } 87 | ] 88 | } 89 | } 90 | } 91 | ] 92 | } 93 | } 94 | }, 95 | { 96 | "name": "comment.line.double-slash.hlasm", 97 | "match": "\\*.*" 98 | } 99 | ] 100 | }, 101 | "parseLine": { 102 | "patterns": [ 103 | { 104 | "match": "^(.{71,71})([^\\s])(.{0,8})", 105 | "captures": { 106 | "1": { 107 | "patterns": [ 108 | { 109 | "include": "#asmArgumentLine" 110 | }, 111 | { 112 | "include": "#asmLineStart" 113 | } 114 | ] 115 | }, 116 | "2": { 117 | "name": "keyword.other.hlasm" 118 | }, 119 | "3": { 120 | "patterns": [ 121 | { 122 | "include": "#sequenceNumbers" 123 | } 124 | ] 125 | }, 126 | "5": { 127 | "patterns": [ 128 | { 129 | "match": "\\S.*", 130 | "name": "invalid.illegal" 131 | } 132 | ] 133 | } 134 | } 135 | }, 136 | { 137 | "match": "^(.{71,71})(\\s?)(.{0,8})$", 138 | "captures": { 139 | "1": { 140 | "patterns": [ 141 | { 142 | "include": "#asmArgumentLine" 143 | }, 144 | { 145 | "include": "#asmLineStart" 146 | } 147 | ] 148 | }, 149 | "3": { 150 | "patterns": [ 151 | { 152 | "include": "#sequenceNumbers" 153 | } 154 | ] 155 | } 156 | } 157 | } 158 | ] 159 | }, 160 | "asmLineStart": { 161 | "patterns": [ 162 | { 163 | "match": "^([^*]\\S*)?\\s+(.*)$", 164 | "captures": { 165 | "1": { 166 | "name": "entity.name.function.hlasm" 167 | }, 168 | "2": { 169 | "patterns": [ 170 | { 171 | "include": "#asmInstruction" 172 | } 173 | ] 174 | } 175 | } 176 | } 177 | ] 178 | }, 179 | "asmInstruction": { 180 | "patterns": [ 181 | { 182 | "match": "(\\S+)\\s*(.*)", 183 | "captures": { 184 | "1": { 185 | "name": "keyword.other.hlasm" 186 | }, 187 | "2": { 188 | "patterns": [ 189 | { 190 | "include": "#asmArguments" 191 | } 192 | ] 193 | } 194 | } 195 | } 196 | ] 197 | }, 198 | "asmArgumentLine": { 199 | "patterns": [ 200 | { 201 | "match": "^\\s+(\\S+=.*)$", 202 | "captures": { 203 | "1": { 204 | "patterns": [ 205 | { 206 | "include": "#asmArguments" 207 | } 208 | ] 209 | } 210 | } 211 | } 212 | ] 213 | }, 214 | "asmArguments": { 215 | "patterns": [ 216 | { 217 | "include": "#stringType" 218 | }, 219 | { 220 | "include": "#quoteType" 221 | }, 222 | { 223 | "match": "(\\S*)(.*)", 224 | "captures": { 225 | "1": { 226 | "name": "keyword.control.hlasm", 227 | "patterns": [ 228 | { 229 | "include": "#additionalAsmHighlight" 230 | } 231 | ] 232 | }, 233 | "2": { 234 | "name": "comment.line.double-slash.hlasm" 235 | } 236 | } 237 | }, 238 | { 239 | "match": "\\s.*", 240 | "name": "comment.line.double-slash.hlasm" 241 | } 242 | ] 243 | }, 244 | "stringType": { 245 | "patterns": [ 246 | { 247 | "match": "(\\S*?)('.*?')(.*)", 248 | "captures": { 249 | "1": { 250 | "name": "keyword.control.hlasm", 251 | "patterns": [ 252 | { 253 | "include": "#additionalAsmHighlight" 254 | } 255 | ] 256 | }, 257 | "2": { 258 | "name": "string.quoted.single.hlasm" 259 | }, 260 | "3": { 261 | "patterns": [ 262 | { 263 | "include": "#asmArguments" 264 | } 265 | ] 266 | } 267 | } 268 | } 269 | ] 270 | }, 271 | "quoteType": { 272 | "patterns": [ 273 | { 274 | "match": "(\\S*?)([LKNT]')(.*)", 275 | "captures": { 276 | "1": { 277 | "name": "keyword.control.hlasm", 278 | "patterns": [ 279 | { 280 | "include": "#additionalAsmHighlight" 281 | } 282 | ] 283 | }, 284 | "2": { 285 | "name": "support.type.hlasm" 286 | }, 287 | "3": { 288 | "patterns": [ 289 | { 290 | "include": "#asmArguments" 291 | } 292 | ] 293 | } 294 | } 295 | } 296 | ] 297 | }, 298 | "labels": { 299 | "match": "[*]", 300 | "name": "support.function.hlasm" 301 | }, 302 | "operators": { 303 | "match": "[=(),+]", 304 | "name": "keyword.operator.hlasm" 305 | }, 306 | "numbers": { 307 | "match": "(?<=[=(),*\\s+])-?\\d*(?=[=(),*+\\s]|$)", 308 | "name": "constant.numeric.hlasm" 309 | }, 310 | "asmSpecialStatements": { 311 | "match": "(?<=[=(),*+\\s])=?\\d*(A|B|C|D|E|F|G|H|P|V|X|Z)(L\\d*)?(?=[=(),*\\s+]|$)", 312 | "name": "support.type.hlasm" 313 | }, 314 | "sequenceNumbers": { 315 | "name": "constant.numeric.hlasm", 316 | "match": ".*" 317 | } 318 | }, 319 | "scopeName": "source.hlasm" 320 | } 321 | -------------------------------------------------------------------------------- /server/src/server.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import { 7 | createConnection, 8 | TextDocuments, 9 | ProposedFeatures, 10 | InitializeParams, 11 | DidChangeConfigurationNotification, 12 | SymbolKind, 13 | SymbolInformation, 14 | TextDocument, 15 | Diagnostic, 16 | DiagnosticSeverity, 17 | Location 18 | } from "vscode-languageserver"; 19 | 20 | const MAX_LEN = 80; 21 | 22 | const connection = createConnection(ProposedFeatures.all); 23 | 24 | const documents: TextDocuments = new TextDocuments(); 25 | 26 | let hasConfigurationCapability: boolean = false; 27 | let hasWorkspaceFolderCapability: boolean = false; 28 | let hasDiagnosticRelatedInformationCapability: boolean = false; 29 | 30 | connection.onInitialize((params: InitializeParams) => { 31 | const capabilities = params.capabilities; 32 | 33 | hasConfigurationCapability = !!( 34 | capabilities.workspace && !!capabilities.workspace.configuration 35 | ); 36 | hasWorkspaceFolderCapability = !!( 37 | capabilities.workspace && !!capabilities.workspace.workspaceFolders 38 | ); 39 | hasDiagnosticRelatedInformationCapability = !!( 40 | capabilities.textDocument && 41 | capabilities.textDocument.publishDiagnostics && 42 | capabilities.textDocument.publishDiagnostics.relatedInformation 43 | ); 44 | 45 | return { 46 | capabilities: { 47 | textDocumentSync: documents.syncKind, 48 | documentSymbolProvider: true, 49 | definitionProvider: true, 50 | } 51 | }; 52 | }); 53 | 54 | connection.onInitialized(() => { 55 | if (hasConfigurationCapability) { 56 | connection.client.register(DidChangeConfigurationNotification.type, undefined); 57 | } 58 | if (hasWorkspaceFolderCapability) { 59 | connection.workspace.onDidChangeWorkspaceFolders((event) => { 60 | connection.console.log("Workspace folder change event received."); 61 | }); 62 | } 63 | }); 64 | 65 | interface IHlasmSettings { 66 | maxNumberOfProblems: number; 67 | } 68 | 69 | const defaultSettings: IHlasmSettings = { maxNumberOfProblems: 1000 }; 70 | let globalSettings: IHlasmSettings = defaultSettings; 71 | const documentSettings: Map> = new Map(); 72 | const symbolsCache: Map = new Map(); 73 | 74 | connection.onDidChangeConfiguration((change) => { 75 | if (hasConfigurationCapability) { 76 | // Reset all cached document settings 77 | documentSettings.clear(); 78 | } else { 79 | globalSettings = 80 | (change.settings.languageServerExample || defaultSettings); 81 | } 82 | 83 | // Revalidate all open text documents 84 | documents.all().forEach(validateTextDocument); 85 | }); 86 | 87 | function getDocumentSettings(resource: string): Thenable { 88 | if (!hasConfigurationCapability) { 89 | return Promise.resolve(globalSettings); 90 | } 91 | let result = documentSettings.get(resource); 92 | if (!result) { 93 | result = connection.workspace.getConfiguration({ 94 | scopeUri: resource, 95 | section: "hlasmServer" 96 | }); 97 | documentSettings.set(resource, result); 98 | } 99 | return result; 100 | } 101 | 102 | // Only keep settings for open documents 103 | documents.onDidClose((e) => { 104 | documentSettings.delete(e.document.uri); 105 | }); 106 | 107 | documents.onDidChangeContent((change) => { 108 | validateTextDocument(change.document); 109 | }); 110 | 111 | async function validateTextDocument(textDocument: TextDocument): Promise { 112 | 113 | const settings = await getDocumentSettings(textDocument.uri); 114 | connection.console.info(`validateTextDocument() called - settings are: ${JSON.stringify(settings, null, 2)}`); 115 | 116 | const text = textDocument.getText(); 117 | 118 | // TODO(Kelosky): stay within settings threshold 119 | let problems = 0; 120 | const diagnostics: Diagnostic[] = []; 121 | 122 | const lines = text.split(/\r?\n/); 123 | for (let i = 0; i < lines.length; i++) { 124 | if (lines[i].length > MAX_LEN) { 125 | problems++; 126 | 127 | const diagnostic: Diagnostic = { 128 | severity: DiagnosticSeverity.Error, 129 | range: { 130 | start: { line: i, character: MAX_LEN }, 131 | end: { line: i, character: lines[i].length }, 132 | }, 133 | message: `Exceeded ${MAX_LEN} characters`, 134 | source: "hlasm" 135 | }; 136 | 137 | diagnostics.push(diagnostic); 138 | } 139 | } 140 | 141 | connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); 142 | } 143 | 144 | connection.onDefinition((parm) => { 145 | connection.console.info(`onDefinition invoked ${JSON.stringify(parm, null, 2)}`); 146 | 147 | const document = documents.get(parm.textDocument.uri); 148 | if (!document) { 149 | return null; 150 | } 151 | 152 | const lines = document.getText().split(/\r?\n/); 153 | 154 | connection.console.info(`Definition ${parm.position.character} on line '${lines[parm.position.line]}'`); 155 | connection.console.info(`There are ${symbolsCache.size} entries in cached symbols`); 156 | 157 | // if (lines[parm.position.line].trim() === "") { 158 | // connection.console.info(`No definition for blank line`); 159 | // return; 160 | // } 161 | 162 | // if (parm.position.character === 0) { 163 | // connection.console.info(`No definition for something in column 0`); 164 | // return; 165 | // } 166 | 167 | // if (lines[parm.position.line][parm.position.character] === " ") { 168 | // connection.console.info(`No definition for spaces`); 169 | // return; 170 | // } 171 | 172 | // if (lines[parm.position.line][parm.position.character] === "*") { 173 | // connection.console.info(`No definition for asterisks`); 174 | // return; 175 | // } 176 | 177 | const len = lines[parm.position.line].length; 178 | const reg = new RegExp(/[a-z|A-Z|0-9|@|#|$]/); 179 | if (reg.test(lines[parm.position.line][parm.position.character])) { 180 | connection.console.info(`Matched`); 181 | let left = parm.position.character; 182 | let right = parm.position.character; 183 | 184 | while(left > 0) { 185 | connection.console.info(`Left is ${left} - ${lines[parm.position.line][left]}`); 186 | left--; 187 | if (!reg.test(lines[parm.position.line][left])) { 188 | break; 189 | } 190 | } 191 | while(right < lines[parm.position.line].length) { 192 | connection.console.info(`Right is ${right} - ${lines[parm.position.line][right]}`); 193 | right++; 194 | if (!reg.test(lines[parm.position.line][right])) { 195 | break; 196 | } 197 | } 198 | 199 | const symb = lines[parm.position.line].substring(left + 1, right); 200 | connection.console.info(`Left is ${left} and right is ${right}, '${symb}'`); 201 | return symbolsCache.get(symb); 202 | } else { 203 | connection.console.info(`Did not match valid symbol`); 204 | return; 205 | } 206 | 207 | // for (let i = 0; i < lines.length - 1; i++) { 208 | 209 | // // if space or * in column one, it's not a symbol 210 | // if (lines[i][0] !== " " && lines[i][0] !== "*") { 211 | 212 | // // compress multiple spaces to a single space 213 | // let tokenizedLine = lines[i].replace(/\s+/g, " ").split(" "); 214 | 215 | // // remove blank entries 216 | // tokenizedLine = tokenizedLine.filter((entry) => entry !== ""); 217 | 218 | // if (tokenizedLine.length > 0) { 219 | 220 | // let kind: SymbolKind = SymbolKind.Constant; 221 | // if (tokenizedLine[1]) { 222 | // if (tokenizedLine[1] === "DSECT") { 223 | // kind = SymbolKind.Object; 224 | // } 225 | // } 226 | 227 | // const entry: Location = { 228 | // uri: parm.textDocument.uri, 229 | // range: { 230 | // start: { line: i, character: 0 }, 231 | // end: { line: i, character: tokenizedLine[0].length - 1 } 232 | // } 233 | // }; 234 | 235 | // symbols.push(entry); 236 | // } 237 | 238 | // } 239 | // } 240 | // return symbols; 241 | }); 242 | 243 | 244 | // TODO(Kelosky): workspace symbols 245 | connection.onDocumentSymbol((parm) => { 246 | 247 | connection.console.info(`onDocumentSymbol invoked ${JSON.stringify(parm, null, 2)}`); 248 | 249 | const symbols: SymbolInformation[] = []; 250 | const document = documents.get(parm.textDocument.uri); 251 | if (!document) { 252 | return null; 253 | } 254 | 255 | connection.console.info(`Clearing symbol cache...`); 256 | symbolsCache.clear(); 257 | 258 | const lines = document.getText().split(/\r?\n/); 259 | for (let i = 0; i < lines.length; i++) { 260 | 261 | // if space or * in column one, it's not a symbol 262 | if (lines[i][0] !== " " && lines[i][0] !== "*") { 263 | 264 | // compress multiple spaces to a single space 265 | let tokenizedLine = lines[i].replace(/\s+/g, " ").split(" "); 266 | 267 | // remove blank entries 268 | tokenizedLine = tokenizedLine.filter((entry) => entry !== ""); 269 | 270 | if (tokenizedLine.length > 0) { 271 | 272 | let kind: SymbolKind = SymbolKind.Constant; 273 | 274 | // TODO(Kelosky): put all DSECT items under the object 275 | if (tokenizedLine[1]) { 276 | if (tokenizedLine[1] === "DSECT") { 277 | kind = SymbolKind.Object; 278 | } 279 | } 280 | 281 | // TODO(Kelosky): put all ORG items in groups 282 | const entry: SymbolInformation = { 283 | name: tokenizedLine[0], 284 | kind, 285 | location: { 286 | uri: parm.textDocument.uri, 287 | range: { 288 | start: { line: i, character: 0 }, 289 | end: { line: i, character: tokenizedLine[0].length } 290 | } 291 | } 292 | }; 293 | 294 | symbols.push(entry); 295 | 296 | // Node(Kelosky): if this performs poorly, consider symbols being created 297 | symbolsCache.set(entry.name, [entry.location]); 298 | } 299 | 300 | } 301 | } 302 | return symbols; 303 | }); 304 | 305 | documents.listen(connection); 306 | 307 | connection.listen(); 308 | -------------------------------------------------------------------------------- /client/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ibm-assembler-client", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "agent-base": { 8 | "version": "4.3.0", 9 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 10 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 11 | "dev": true, 12 | "requires": { 13 | "es6-promisify": "^5.0.0" 14 | } 15 | }, 16 | "ajv": { 17 | "version": "6.10.2", 18 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 19 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 20 | "dev": true, 21 | "requires": { 22 | "fast-deep-equal": "^2.0.1", 23 | "fast-json-stable-stringify": "^2.0.0", 24 | "json-schema-traverse": "^0.4.1", 25 | "uri-js": "^4.2.2" 26 | } 27 | }, 28 | "asn1": { 29 | "version": "0.2.4", 30 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 31 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 32 | "dev": true, 33 | "requires": { 34 | "safer-buffer": "~2.1.0" 35 | } 36 | }, 37 | "assert-plus": { 38 | "version": "1.0.0", 39 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 40 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 41 | "dev": true 42 | }, 43 | "asynckit": { 44 | "version": "0.4.0", 45 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 46 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 47 | "dev": true 48 | }, 49 | "aws-sign2": { 50 | "version": "0.7.0", 51 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 52 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 53 | "dev": true 54 | }, 55 | "aws4": { 56 | "version": "1.8.0", 57 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 58 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 59 | "dev": true 60 | }, 61 | "balanced-match": { 62 | "version": "1.0.0", 63 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 64 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 65 | "dev": true 66 | }, 67 | "bcrypt-pbkdf": { 68 | "version": "1.0.2", 69 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 70 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 71 | "dev": true, 72 | "requires": { 73 | "tweetnacl": "^0.14.3" 74 | } 75 | }, 76 | "brace-expansion": { 77 | "version": "1.1.11", 78 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 79 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 80 | "dev": true, 81 | "requires": { 82 | "balanced-match": "^1.0.0", 83 | "concat-map": "0.0.1" 84 | } 85 | }, 86 | "browser-stdout": { 87 | "version": "1.3.1", 88 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 89 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 90 | "dev": true 91 | }, 92 | "buffer-from": { 93 | "version": "1.1.1", 94 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 95 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 96 | "dev": true 97 | }, 98 | "caseless": { 99 | "version": "0.12.0", 100 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 101 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 102 | "dev": true 103 | }, 104 | "combined-stream": { 105 | "version": "1.0.8", 106 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 107 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 108 | "dev": true, 109 | "requires": { 110 | "delayed-stream": "~1.0.0" 111 | } 112 | }, 113 | "commander": { 114 | "version": "2.15.1", 115 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 116 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 117 | "dev": true 118 | }, 119 | "concat-map": { 120 | "version": "0.0.1", 121 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 122 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 123 | "dev": true 124 | }, 125 | "core-util-is": { 126 | "version": "1.0.2", 127 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 128 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 129 | "dev": true 130 | }, 131 | "dashdash": { 132 | "version": "1.14.1", 133 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 134 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 135 | "dev": true, 136 | "requires": { 137 | "assert-plus": "^1.0.0" 138 | } 139 | }, 140 | "debug": { 141 | "version": "3.1.0", 142 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 143 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 144 | "dev": true, 145 | "requires": { 146 | "ms": "2.0.0" 147 | } 148 | }, 149 | "delayed-stream": { 150 | "version": "1.0.0", 151 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 152 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 153 | "dev": true 154 | }, 155 | "diff": { 156 | "version": "3.5.0", 157 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 158 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 159 | "dev": true 160 | }, 161 | "ecc-jsbn": { 162 | "version": "0.1.2", 163 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 164 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 165 | "dev": true, 166 | "requires": { 167 | "jsbn": "~0.1.0", 168 | "safer-buffer": "^2.1.0" 169 | } 170 | }, 171 | "es6-promise": { 172 | "version": "4.2.8", 173 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 174 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 175 | "dev": true 176 | }, 177 | "es6-promisify": { 178 | "version": "5.0.0", 179 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 180 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 181 | "dev": true, 182 | "requires": { 183 | "es6-promise": "^4.0.3" 184 | } 185 | }, 186 | "escape-string-regexp": { 187 | "version": "1.0.5", 188 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 189 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 190 | "dev": true 191 | }, 192 | "extend": { 193 | "version": "3.0.2", 194 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 195 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 196 | "dev": true 197 | }, 198 | "extsprintf": { 199 | "version": "1.3.0", 200 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 201 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 202 | "dev": true 203 | }, 204 | "fast-deep-equal": { 205 | "version": "2.0.1", 206 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 207 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 208 | "dev": true 209 | }, 210 | "fast-json-stable-stringify": { 211 | "version": "2.0.0", 212 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 213 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 214 | "dev": true 215 | }, 216 | "forever-agent": { 217 | "version": "0.6.1", 218 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 219 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 220 | "dev": true 221 | }, 222 | "form-data": { 223 | "version": "2.3.3", 224 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 225 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 226 | "dev": true, 227 | "requires": { 228 | "asynckit": "^0.4.0", 229 | "combined-stream": "^1.0.6", 230 | "mime-types": "^2.1.12" 231 | } 232 | }, 233 | "fs.realpath": { 234 | "version": "1.0.0", 235 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 236 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 237 | "dev": true 238 | }, 239 | "getpass": { 240 | "version": "0.1.7", 241 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 242 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 243 | "dev": true, 244 | "requires": { 245 | "assert-plus": "^1.0.0" 246 | } 247 | }, 248 | "glob": { 249 | "version": "7.1.4", 250 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 251 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 252 | "dev": true, 253 | "requires": { 254 | "fs.realpath": "^1.0.0", 255 | "inflight": "^1.0.4", 256 | "inherits": "2", 257 | "minimatch": "^3.0.4", 258 | "once": "^1.3.0", 259 | "path-is-absolute": "^1.0.0" 260 | } 261 | }, 262 | "growl": { 263 | "version": "1.10.5", 264 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 265 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 266 | "dev": true 267 | }, 268 | "har-schema": { 269 | "version": "2.0.0", 270 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 271 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 272 | "dev": true 273 | }, 274 | "har-validator": { 275 | "version": "5.1.3", 276 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 277 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 278 | "dev": true, 279 | "requires": { 280 | "ajv": "^6.5.5", 281 | "har-schema": "^2.0.0" 282 | } 283 | }, 284 | "has-flag": { 285 | "version": "3.0.0", 286 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 287 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 288 | "dev": true 289 | }, 290 | "he": { 291 | "version": "1.1.1", 292 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 293 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 294 | "dev": true 295 | }, 296 | "http-proxy-agent": { 297 | "version": "2.1.0", 298 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 299 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 300 | "dev": true, 301 | "requires": { 302 | "agent-base": "4", 303 | "debug": "3.1.0" 304 | } 305 | }, 306 | "http-signature": { 307 | "version": "1.2.0", 308 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 309 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 310 | "dev": true, 311 | "requires": { 312 | "assert-plus": "^1.0.0", 313 | "jsprim": "^1.2.2", 314 | "sshpk": "^1.7.0" 315 | } 316 | }, 317 | "https-proxy-agent": { 318 | "version": "2.2.4", 319 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 320 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 321 | "dev": true, 322 | "requires": { 323 | "agent-base": "^4.3.0", 324 | "debug": "^3.1.0" 325 | } 326 | }, 327 | "inflight": { 328 | "version": "1.0.6", 329 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 330 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 331 | "dev": true, 332 | "requires": { 333 | "once": "^1.3.0", 334 | "wrappy": "1" 335 | } 336 | }, 337 | "inherits": { 338 | "version": "2.0.4", 339 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 340 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 341 | "dev": true 342 | }, 343 | "is-typedarray": { 344 | "version": "1.0.0", 345 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 346 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 347 | "dev": true 348 | }, 349 | "isstream": { 350 | "version": "0.1.2", 351 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 352 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 353 | "dev": true 354 | }, 355 | "jsbn": { 356 | "version": "0.1.1", 357 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 358 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 359 | "dev": true 360 | }, 361 | "json-schema": { 362 | "version": "0.2.3", 363 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 364 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 365 | "dev": true 366 | }, 367 | "json-schema-traverse": { 368 | "version": "0.4.1", 369 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 370 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 371 | "dev": true 372 | }, 373 | "json-stringify-safe": { 374 | "version": "5.0.1", 375 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 376 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 377 | "dev": true 378 | }, 379 | "jsprim": { 380 | "version": "1.4.1", 381 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 382 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 383 | "dev": true, 384 | "requires": { 385 | "assert-plus": "1.0.0", 386 | "extsprintf": "1.3.0", 387 | "json-schema": "0.2.3", 388 | "verror": "1.10.0" 389 | } 390 | }, 391 | "mime-db": { 392 | "version": "1.40.0", 393 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 394 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", 395 | "dev": true 396 | }, 397 | "mime-types": { 398 | "version": "2.1.24", 399 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 400 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 401 | "dev": true, 402 | "requires": { 403 | "mime-db": "1.40.0" 404 | } 405 | }, 406 | "minimatch": { 407 | "version": "3.0.4", 408 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 409 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 410 | "dev": true, 411 | "requires": { 412 | "brace-expansion": "^1.1.7" 413 | } 414 | }, 415 | "minimist": { 416 | "version": "0.0.8", 417 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 418 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 419 | "dev": true 420 | }, 421 | "mkdirp": { 422 | "version": "0.5.1", 423 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 424 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 425 | "dev": true, 426 | "requires": { 427 | "minimist": "0.0.8" 428 | } 429 | }, 430 | "mocha": { 431 | "version": "5.2.0", 432 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 433 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 434 | "dev": true, 435 | "requires": { 436 | "browser-stdout": "1.3.1", 437 | "commander": "2.15.1", 438 | "debug": "3.1.0", 439 | "diff": "3.5.0", 440 | "escape-string-regexp": "1.0.5", 441 | "glob": "7.1.2", 442 | "growl": "1.10.5", 443 | "he": "1.1.1", 444 | "minimatch": "3.0.4", 445 | "mkdirp": "0.5.1", 446 | "supports-color": "5.4.0" 447 | }, 448 | "dependencies": { 449 | "glob": { 450 | "version": "7.1.2", 451 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 452 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 453 | "dev": true, 454 | "requires": { 455 | "fs.realpath": "^1.0.0", 456 | "inflight": "^1.0.4", 457 | "inherits": "2", 458 | "minimatch": "^3.0.4", 459 | "once": "^1.3.0", 460 | "path-is-absolute": "^1.0.0" 461 | } 462 | } 463 | } 464 | }, 465 | "ms": { 466 | "version": "2.0.0", 467 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 468 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 469 | "dev": true 470 | }, 471 | "oauth-sign": { 472 | "version": "0.9.0", 473 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 474 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 475 | "dev": true 476 | }, 477 | "once": { 478 | "version": "1.4.0", 479 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 480 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 481 | "dev": true, 482 | "requires": { 483 | "wrappy": "1" 484 | } 485 | }, 486 | "path-is-absolute": { 487 | "version": "1.0.1", 488 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 489 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 490 | "dev": true 491 | }, 492 | "performance-now": { 493 | "version": "2.1.0", 494 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 495 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 496 | "dev": true 497 | }, 498 | "psl": { 499 | "version": "1.2.0", 500 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", 501 | "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", 502 | "dev": true 503 | }, 504 | "punycode": { 505 | "version": "2.1.1", 506 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 507 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 508 | "dev": true 509 | }, 510 | "qs": { 511 | "version": "6.5.2", 512 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 513 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 514 | "dev": true 515 | }, 516 | "querystringify": { 517 | "version": "2.1.1", 518 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", 519 | "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", 520 | "dev": true 521 | }, 522 | "request": { 523 | "version": "2.88.0", 524 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 525 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 526 | "dev": true, 527 | "requires": { 528 | "aws-sign2": "~0.7.0", 529 | "aws4": "^1.8.0", 530 | "caseless": "~0.12.0", 531 | "combined-stream": "~1.0.6", 532 | "extend": "~3.0.2", 533 | "forever-agent": "~0.6.1", 534 | "form-data": "~2.3.2", 535 | "har-validator": "~5.1.0", 536 | "http-signature": "~1.2.0", 537 | "is-typedarray": "~1.0.0", 538 | "isstream": "~0.1.2", 539 | "json-stringify-safe": "~5.0.1", 540 | "mime-types": "~2.1.19", 541 | "oauth-sign": "~0.9.0", 542 | "performance-now": "^2.1.0", 543 | "qs": "~6.5.2", 544 | "safe-buffer": "^5.1.2", 545 | "tough-cookie": "~2.4.3", 546 | "tunnel-agent": "^0.6.0", 547 | "uuid": "^3.3.2" 548 | } 549 | }, 550 | "requires-port": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 553 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 554 | "dev": true 555 | }, 556 | "safe-buffer": { 557 | "version": "5.2.0", 558 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 559 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 560 | "dev": true 561 | }, 562 | "safer-buffer": { 563 | "version": "2.1.2", 564 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 565 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 566 | "dev": true 567 | }, 568 | "semver": { 569 | "version": "5.7.0", 570 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 571 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 572 | "dev": true 573 | }, 574 | "source-map": { 575 | "version": "0.6.1", 576 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 577 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 578 | "dev": true 579 | }, 580 | "source-map-support": { 581 | "version": "0.5.12", 582 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", 583 | "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", 584 | "dev": true, 585 | "requires": { 586 | "buffer-from": "^1.0.0", 587 | "source-map": "^0.6.0" 588 | } 589 | }, 590 | "sshpk": { 591 | "version": "1.16.1", 592 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 593 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 594 | "dev": true, 595 | "requires": { 596 | "asn1": "~0.2.3", 597 | "assert-plus": "^1.0.0", 598 | "bcrypt-pbkdf": "^1.0.0", 599 | "dashdash": "^1.12.0", 600 | "ecc-jsbn": "~0.1.1", 601 | "getpass": "^0.1.1", 602 | "jsbn": "~0.1.0", 603 | "safer-buffer": "^2.0.2", 604 | "tweetnacl": "~0.14.0" 605 | } 606 | }, 607 | "supports-color": { 608 | "version": "5.4.0", 609 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 610 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 611 | "dev": true, 612 | "requires": { 613 | "has-flag": "^3.0.0" 614 | } 615 | }, 616 | "tough-cookie": { 617 | "version": "2.4.3", 618 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 619 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 620 | "dev": true, 621 | "requires": { 622 | "psl": "^1.1.24", 623 | "punycode": "^1.4.1" 624 | }, 625 | "dependencies": { 626 | "punycode": { 627 | "version": "1.4.1", 628 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 629 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 630 | "dev": true 631 | } 632 | } 633 | }, 634 | "tunnel-agent": { 635 | "version": "0.6.0", 636 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 637 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 638 | "dev": true, 639 | "requires": { 640 | "safe-buffer": "^5.0.1" 641 | } 642 | }, 643 | "tweetnacl": { 644 | "version": "0.14.5", 645 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 646 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 647 | "dev": true 648 | }, 649 | "uri-js": { 650 | "version": "4.2.2", 651 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 652 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 653 | "dev": true, 654 | "requires": { 655 | "punycode": "^2.1.0" 656 | } 657 | }, 658 | "url-parse": { 659 | "version": "1.5.10", 660 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 661 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 662 | "dev": true, 663 | "requires": { 664 | "querystringify": "^2.1.1", 665 | "requires-port": "^1.0.0" 666 | } 667 | }, 668 | "uuid": { 669 | "version": "3.3.2", 670 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 671 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 672 | "dev": true 673 | }, 674 | "verror": { 675 | "version": "1.10.0", 676 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 677 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 678 | "dev": true, 679 | "requires": { 680 | "assert-plus": "^1.0.0", 681 | "core-util-is": "1.0.2", 682 | "extsprintf": "^1.2.0" 683 | } 684 | }, 685 | "vscode": { 686 | "version": "1.1.35", 687 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.35.tgz", 688 | "integrity": "sha512-xPnxzQU40LOS2yPyzWW+WKpTV6qA3z16TcgpZ9O38UWLA157Zz4GxUx5H7Gd07pxzw0GqvusbF4D+5GBgNxvEQ==", 689 | "dev": true, 690 | "requires": { 691 | "glob": "^7.1.2", 692 | "mocha": "^5.2.0", 693 | "request": "^2.88.0", 694 | "semver": "^5.4.1", 695 | "source-map-support": "^0.5.0", 696 | "url-parse": "^1.4.4", 697 | "vscode-test": "^0.4.1" 698 | } 699 | }, 700 | "vscode-jsonrpc": { 701 | "version": "4.0.0", 702 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", 703 | "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" 704 | }, 705 | "vscode-languageclient": { 706 | "version": "4.4.2", 707 | "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-4.4.2.tgz", 708 | "integrity": "sha512-9TUzsg1UM6n1UEyPlWbDf7tK1wJAK7UGFRmGDN8sz4KmbbDiVRh6YicaB/5oRSVTpuV47PdJpYlOl3SJ0RiK1Q==", 709 | "requires": { 710 | "vscode-languageserver-protocol": "^3.10.3" 711 | } 712 | }, 713 | "vscode-languageserver-protocol": { 714 | "version": "3.14.1", 715 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", 716 | "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", 717 | "requires": { 718 | "vscode-jsonrpc": "^4.0.0", 719 | "vscode-languageserver-types": "3.14.0" 720 | } 721 | }, 722 | "vscode-languageserver-types": { 723 | "version": "3.14.0", 724 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", 725 | "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" 726 | }, 727 | "vscode-test": { 728 | "version": "0.4.3", 729 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 730 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 731 | "dev": true, 732 | "requires": { 733 | "http-proxy-agent": "^2.1.0", 734 | "https-proxy-agent": "^2.2.1" 735 | } 736 | }, 737 | "wrappy": { 738 | "version": "1.0.2", 739 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 740 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 741 | "dev": true 742 | } 743 | } 744 | } 745 | --------------------------------------------------------------------------------