diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000000..2637ada347
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,45 @@
+module.exports = {
+ root: true,
+ env: {
+ browser: false,
+ es2020: true,
+ },
+ extends: [
+ "airbnb-typescript/base",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:@typescript-eslint/recommended-requiring-type-checking",
+ "plugin:wc/recommended",
+ "prettier/@typescript-eslint",
+ "plugin:prettier/recommended",
+ ],
+ parser: "@typescript-eslint/parser",
+ parserOptions: {
+ ecmaVersion: 2020,
+ sourceType: "module",
+ project: "./tsconfig.json",
+ },
+ rules: {
+ "@typescript-eslint/ban-ts-comment": 0,
+ "@typescript-eslint/ban-ts-ignore": 0,
+ "@typescript-eslint/explicit-function-return-type": 0,
+ "@typescript-eslint/no-explicit-any": 0,
+ "@typescript-eslint/no-misused-promises": 0, // This one really needs to go
+ "@typescript-eslint/no-unsafe-assignment": 0,
+ "@typescript-eslint/no-unsafe-member-access": 0,
+ "@typescript-eslint/no-unused-vars": 0,
+ "@typescript-eslint/no-use-before-define": 0,
+ "@typescript-eslint/restrict-template-expressions": 0,
+ "class-methods-use-this": 0,
+ "default-case": 0,
+ "import/no-cycle": 0,
+ "import/prefer-default-export": 0,
+ "no-console": 0,
+ "no-continue": 0,
+ "no-param-reassign": 0,
+ "no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"],
+ "no-void": 0,
+ "prefer-destructuring": 0,
+ "vars-on-top": 0,
+ strict: 0,
+ },
+};
diff --git a/.github/workflows/github-actions-language-service.yml b/.github/workflows/github-actions-language-service.yml
index 8ea35edbd2..9696b5d8cb 100644
--- a/.github/workflows/github-actions-language-service.yml
+++ b/.github/workflows/github-actions-language-service.yml
@@ -1,56 +1,58 @@
name: Language Sevice
-on:
+on:
push:
paths:
- - 'src/language-service/*'
- - '.github/*'
+ - "src/language-service/*"
+ - ".github/*"
pull_request:
paths:
- - 'src/language-service/*'
- - '.github/*'
+ - "src/language-service/*"
+ - ".github/*"
jobs:
language-service:
name: Language Service
- runs-on: ubuntu-latest
+ runs-on: ubuntu-latest
steps:
-
- - uses: actions/checkout@master
-
- - name: Use Node.js 12.x
- uses: actions/setup-node@master
- with:
- node-version: 12.x
-
- - name: NPM Install
- working-directory: src/language-service
- run: |
- rm package-lock.json
- npm install
-
- - name: NPM Compile
- working-directory: src/language-service
- run: npm run compile
-
- - name: Create .npmrc
- run: echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" >> ~/.npmrc
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- - name: NPM Publish to Registry
- if: success() && github.ref == 'refs/heads/master'
- env:
- NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- run: |
- npm publish src/language-service
-
+ - uses: actions/checkout@master
+
+ - name: Use Node.js 12.x
+ uses: actions/setup-node@master
+ with:
+ node-version: 12.x
+
+ - name: NPM Install
+ working-directory: src/language-service
+ run: |
+ rm package-lock.json
+ npm install
+
+ - name: NPM Lint
+ working-directory: src/language-service
+ run: npm run lint
+
+ - name: NPM Compile
+ working-directory: src/language-service
+ run: npm run compile
+
+ - name: Create .npmrc
+ run: echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" >> ~/.npmrc
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: NPM Publish to Registry
+ if: success() && github.ref == 'refs/heads/master'
+ env:
+ NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+ run: |
+ npm publish src/language-service
# - name: NPM Publish to Registry
- # uses: actions/npm@master
+ # uses: actions/npm@master
# if: success() && github.ref == 'refs/heads/master'
# env:
# NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# with:
- # args: publish src/language-service
\ No newline at end of file
+ # args: publish src/language-service
diff --git a/.github/workflows/github-actions-vscode-extension.yml b/.github/workflows/github-actions-vscode-extension.yml
index b04d17aaa6..2b68f94a7b 100644
--- a/.github/workflows/github-actions-vscode-extension.yml
+++ b/.github/workflows/github-actions-vscode-extension.yml
@@ -1,30 +1,33 @@
name: VS Code Extension
-on: [ push, pull_request]
+on: [push, pull_request]
jobs:
vscode-extension:
name: VS Code Extension
- runs-on: ubuntu-latest
+ runs-on: ubuntu-latest
steps:
-
- - uses: actions/checkout@v1
-
- - name: Use Node.js 12.x
- uses: actions/setup-node@v1
- with:
- node-version: 12.x
-
- - name: NPM Install & Compile
- run: |
- npm install
- npm run compile
-
- - name: VS Marketplace Publish
- if: success() && github.ref == 'refs/heads/master'
- run: |
- npm install -g vsce
- vsce publish -p $VSCE_TOKEN
- env:
- VSCE_TOKEN: ${{ secrets.VSCE_TOKEN }}
\ No newline at end of file
+ - uses: actions/checkout@v1
+
+ - name: Use Node.js 12.x
+ uses: actions/setup-node@v1
+ with:
+ node-version: 12.x
+
+ - name: NPM Install & Compile
+ run: npm install
+
+ - name: NPM Lint
+ run: npm run lint
+
+ - name: NPM Compile
+ run: npm run compile
+
+ - name: VS Marketplace Publish
+ if: success() && github.ref == 'refs/heads/master'
+ run: |
+ npm install -g vsce
+ vsce publish -p $VSCE_TOKEN
+ env:
+ VSCE_TOKEN: ${{ secrets.VSCE_TOKEN }}
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000000..40e6bd96a6
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+12.1
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000000..6d3d842729
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,5 @@
+.vscode-test/
+node_modules
+out
+src/language-service/dist
+src/language-service/src/schemas/json
diff --git a/README.md b/README.md
index 0f44d538d7..a94cce9879 100644
--- a/README.md
+++ b/README.md
@@ -7,13 +7,13 @@
# Getting started
-
+
1. Install via the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=keesschollaart.vscode-home-assistant)
2. Open your (local copy of the) Home Assistant Configuration with VS Code
3. Configure the connection to Home Assistant via the HA Section in the VS Code Settings UI
-
+
More details in [the How-To in the Wiki](https://github.com/keesschollaart81/vscode-home-assistant/wiki/Configure-connection-to-HA)
4. Enjoy the features showcased below 👇
@@ -30,28 +30,29 @@
## Completion for Entity ID's & Services
When connected with your Home Assistant server, entity id' and services will be auto-completed.
-
-
+
+
## Completion & Validation for Configuration & Lovelace Schema
Most of the scheme's of Home Assistant will be validated and things like properties, values and enums will be auto-completed. This extension understands the behaviour of Home Assistant '!include...' behaviour and use this to provide scoped validation for all your files.
-
-
+
+
## Go to Definition for Includes
Easy navigate between your files references via the different !include... tags using 'f12' / 'Go to Definition'.
-
-
+
+
## Snippets
-Snippets allow you to create commonly used data structures very quickly.
+Snippets allow you to create commonly used data structures very quickly.
-
+
## Commands
+
Commands allow you to quickly interact with Home Assistant! Find them using Cmd+shift+P and type 'Home Assistant'
![image](https://user-images.githubusercontent.com/6755359/69496084-6b089d80-0ece-11ea-8496-50251b91732f.png)
@@ -63,7 +64,7 @@ Commands allow you to quickly interact with Home Assistant! Find them using Cmd+
# Release Notes
-Read all the recent changes in the [GitHub releases section](https://github.com/keesschollaart81/vscode-home-assistant/releases)
+Read all the recent changes in the [GitHub releases section](https://github.com/keesschollaart81/vscode-home-assistant/releases)
# Feedback / Ideas
@@ -72,9 +73,8 @@ Create an [issue](https://github.com/keesschollaart81/vscode-home-assistant/issu
# Things to do / up for grabs
- [ ] Go to Definition for entities, scripts and automations
-- [ ] Render Jinja2 template locally (like/via CLI?) in preview pane
+- [ ] Render Jinja2 template locally (like/via CLI?) in preview pane
- [ ] Autocomplete !secrets
-- [ ] Autocomplete triggers
- [ ] Check local config with HA Server
# Build & Deployment status
diff --git a/package-lock.json b/package-lock.json
index ef5c308a26..bc766d1152 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,31 +5,151 @@
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
- "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.0.0"
+ "@babel/highlight": "^7.10.4"
}
},
+ "@babel/generator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz",
+ "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.13",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
+ "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
"@babel/highlight": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
- "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
- "esutils": "^2.0.2",
"js-tokens": "^4.0.0"
}
},
+ "@babel/parser": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz",
+ "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==",
+ "dev": true
+ },
"@babel/runtime": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
- "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz",
+ "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz",
+ "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.0.0",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz",
+ "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.13"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz",
+ "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==",
+ "dev": true,
"requires": {
- "regenerator-runtime": "^0.13.2"
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.13",
+ "to-fast-properties": "^2.0.0"
}
},
"@types/caseless": {
@@ -38,28 +158,52 @@
"integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
"dev": true
},
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
+ "@types/eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
+ "dev": true
+ },
"@types/json-schema": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
- "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
+ "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+ "dev": true
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
"@types/mocha": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
- "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.0.tgz",
+ "integrity": "sha512-jWeYcTo3sCH/rMgsdYXDTO85GNRyTCII5dayMIu/ZO4zbEot1E3iNGaOwpLReLUHjeNQFkgeNNVYlY4dX6azQQ==",
"dev": true
},
"@types/node": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.0.tgz",
- "integrity": "sha512-0ARSQootUG1RljH2HncpsY2TJBfGQIKOOi7kxzUY6z54ePu/ZD+wJA8zI2Q6v8rol2qpG/rvqsReco8zNMPvhQ==",
+ "version": "14.0.22",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.22.tgz",
+ "integrity": "sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g==",
+ "dev": true
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true
},
"@types/request": {
- "version": "2.48.3",
- "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.3.tgz",
- "integrity": "sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==",
+ "version": "2.48.5",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz",
+ "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==",
"dev": true,
"requires": {
"@types/caseless": "*",
@@ -82,24 +226,153 @@
}
},
"@types/tough-cookie": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz",
- "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz",
+ "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.47.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.47.0.tgz",
+ "integrity": "sha512-nJA37ykkz9FYA0ZOQUSc3OZnhuzEW2vUhUEo4MiduUo82jGwwcLfyvmgd/Q7b0WrZAAceojGhZybg319L24bTA==",
"dev": true
},
"@types/ws": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.2.tgz",
- "integrity": "sha512-oqnI3DbGCVI9zJ/WHdFo3CUE8jQ8CVQDUIKaDtlTcNeT4zs6UCg9Gvk5QrFx2QPkRszpM6yc8o0p4aGjCsTi+w==",
+ "version": "7.2.6",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz",
+ "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
- "@types/yaml": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.2.0.tgz",
- "integrity": "sha512-GW8b9qM+ebgW3/zjzPm0I1NxMvLaz/YKT9Ph6tTb+Fkeyzd9yLTvQ6ciQ2MorTRmb/qXmfjMerRpG4LviixaqQ==",
+ "@typescript-eslint/eslint-plugin": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.0.tgz",
+ "integrity": "sha512-ubHlHVt1lsPQB/CZdEov9XuOFhNG9YRC//kuiS1cMQI6Bs1SsqKrEmZnpgRwthGR09/kEDtr9MywlqXyyYd8GA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/experimental-utils": "3.6.0",
+ "debug": "^4.1.1",
+ "functional-red-black-tree": "^1.0.1",
+ "regexpp": "^3.0.0",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/experimental-utils": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.0.tgz",
+ "integrity": "sha512-4Vdf2hvYMUnTdkCNZu+yYlFtL2v+N2R7JOynIOkFbPjf9o9wQvRwRkzUdWlFd2YiiUwJLbuuLnl5civNg5ykOQ==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.3",
+ "@typescript-eslint/types": "3.6.0",
+ "@typescript-eslint/typescript-estree": "3.6.0",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.6.0.tgz",
+ "integrity": "sha512-taghDxuLhbDAD1U5Fk8vF+MnR0yiFE9Z3v2/bYScFb0N1I9SK8eKHkdJl1DAD48OGFDMFTeOTX0z7g0W6SYUXw==",
+ "dev": true,
+ "requires": {
+ "@types/eslint-visitor-keys": "^1.0.0",
+ "@typescript-eslint/experimental-utils": "3.6.0",
+ "@typescript-eslint/types": "3.6.0",
+ "@typescript-eslint/typescript-estree": "3.6.0",
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.6.0.tgz",
+ "integrity": "sha512-JwVj74ohUSt0ZPG+LZ7hb95fW8DFOqBuR6gE7qzq55KDI3BepqsCtHfBIoa0+Xi1AI7fq5nCu2VQL8z4eYftqg==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.0.tgz",
+ "integrity": "sha512-G57NDSABHjvob7zVV09ehWyD1K6/YUKjz5+AufObFyjNO4DVmKejj47MHjVHHlZZKgmpJD2yyH9lfCXHrPITFg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "3.6.0",
+ "@typescript-eslint/visitor-keys": "3.6.0",
+ "debug": "^4.1.1",
+ "glob": "^7.1.6",
+ "is-glob": "^4.0.1",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.0.tgz",
+ "integrity": "sha512-p1izllL2Ubwunite0ITjubuMQRBGgjdVYwyG7lXPX8GbrA6qF0uwSRz9MnXZaHMxID4948gX0Ez8v9tUDi/KfQ==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "acorn": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
+ "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
"dev": true
},
"agent-base": {
@@ -110,21 +383,62 @@
"es6-promisify": "^5.0.0"
}
},
+ "aggregate-error": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
+ "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "dependencies": {
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ }
+ }
+ },
"ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "version": "6.12.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
+ "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
"requires": {
- "fast-deep-equal": "^2.0.1",
+ "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.11.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true
+ }
+ }
+ },
"ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"ansi-styles": {
@@ -137,14 +451,14 @@
}
},
"applicationinsights": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.4.0.tgz",
- "integrity": "sha512-TV8MYb0Kw9uE2cdu4V/UvTKdOABkX2+Fga9iDz0zqV7FLrNXfmAugWZmmdTx4JoynYkln3d5CUHY3oVSUEbfFw==",
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.7.4.tgz",
+ "integrity": "sha512-XFLsNlcanpjFhHNvVWEfcm6hr7lu9znnb6Le1Lk5RE03YUV9X2B2n2MfM4kJZRrUdV+C0hdHxvWyv+vWoLfY7A==",
"requires": {
"cls-hooked": "^4.2.2",
"continuation-local-storage": "^3.2.1",
"diagnostic-channel": "0.2.0",
- "diagnostic-channel-publishers": "^0.3.2"
+ "diagnostic-channel-publishers": "^0.3.3"
}
},
"arg": {
@@ -161,6 +475,54 @@
"sprintf-js": "~1.0.2"
}
},
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "@babel/runtime-corejs3": "^7.10.2"
+ }
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ }
+ },
+ "array.prototype.flat": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+ "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz",
+ "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1"
+ }
+ },
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -174,6 +536,18 @@
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true
+ },
"async-hook-jl": {
"version": "1.7.6",
"resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz",
@@ -182,11 +556,6 @@
"stack-chain": "^1.3.7"
}
},
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
- },
"async-listener": {
"version": "0.6.10",
"resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
@@ -207,9 +576,35 @@
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
+ "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
+ },
+ "axe-core": {
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
+ "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==",
+ "dev": true
+ },
+ "axobject-query": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+ "dev": true
+ },
+ "babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ }
},
"balanced-match": {
"version": "1.0.0",
@@ -232,9 +627,9 @@
"dev": true
},
"bluebird": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz",
- "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg=="
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"brace-expansion": {
"version": "1.1.11",
@@ -255,30 +650,42 @@
"fill-range": "^7.0.1"
}
},
- "browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "bufferutil": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz",
+ "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==",
+ "requires": {
+ "node-gyp-build": "~3.7.0"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
"dev": true
},
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -295,6 +702,104 @@
"supports-color": "^5.3.0"
}
},
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "dev": true
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
"cliui": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
@@ -304,6 +809,34 @@
"string-width": "^3.1.0",
"strip-ansi": "^5.2.0",
"wrap-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ }
+ }
}
},
"cls-hooked": {
@@ -340,9 +873,15 @@
}
},
"commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true
+ },
+ "compare-versions": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
"dev": true
},
"concat-map": {
@@ -351,6 +890,18 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "confusing-browser-globals": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
+ "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
+ "dev": true
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
"continuation-local-storage": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
@@ -360,15 +911,80 @@
"emitter-listener": "^1.1.1"
}
},
+ "core-js-pure": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
+ "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==",
+ "dev": true
+ },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+ "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ }
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
+ "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
@@ -387,6 +1003,27 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
+ "dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -401,16 +1038,25 @@
}
},
"diagnostic-channel-publishers": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.3.tgz",
- "integrity": "sha512-qIocRYU5TrGUkBlDDxaziAK1+squ8Yf2Ls4HldL3xxb/jzmWO2Enux7CvevNKYmF2kDXZ9HiRqwjPsjk8L+i2Q=="
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.5.tgz",
+ "integrity": "sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ=="
},
"diff": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
- "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
},
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -435,15 +1081,24 @@
"dev": true
},
"emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true
},
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
"enhanced-resolve": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
- "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz",
+ "integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
@@ -451,6 +1106,15 @@
"tapable": "^1.0.0"
}
},
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -460,6 +1124,45 @@
"prr": "~1.0.1"
}
},
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.6",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+ "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.0",
+ "is-regex": "^1.1.0",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
"es6-promise": {
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
@@ -479,17 +1182,446 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
+ "eslint": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
+ "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.0",
+ "eslint-utils": "^2.0.0",
+ "eslint-visitor-keys": "^1.2.0",
+ "espree": "^7.1.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.14",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-airbnb": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz",
+ "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==",
+ "dev": true,
+ "requires": {
+ "eslint-config-airbnb-base": "^14.2.0",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2"
+ }
+ },
+ "eslint-config-airbnb-base": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz",
+ "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==",
+ "dev": true,
+ "requires": {
+ "confusing-browser-globals": "^1.0.9",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2"
+ }
+ },
+ "eslint-config-airbnb-typescript": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-8.0.2.tgz",
+ "integrity": "sha512-TCOftyCoIogJzzLGSg0Qlxd27qvf+1a3MHyN/PqynTqINS4iFy+SlXy/CrAN+6xkleGMSrvmPbm3pyFEku2+IQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/parser": "^3.1.0",
+ "eslint-config-airbnb": "^18.1.0",
+ "eslint-config-airbnb-base": "^14.1.0"
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz",
+ "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^6.0.0"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+ "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.13.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "pkg-dir": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-flowtype": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz",
+ "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15",
+ "string-natural-compare": "^3.0.1"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz",
+ "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flat": "^1.2.3",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.3",
+ "eslint-module-utils": "^2.6.0",
+ "has": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "object.values": "^1.1.1",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.17.0",
+ "tsconfig-paths": "^3.9.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz",
+ "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "aria-query": "^4.2.2",
+ "array-includes": "^3.1.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^3.5.4",
+ "axobject-query": "^2.1.2",
+ "damerau-levenshtein": "^1.0.6",
+ "emoji-regex": "^9.0.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.4.1",
+ "language-tags": "^1.0.5"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz",
+ "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
+ "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.20.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz",
+ "integrity": "sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flatmap": "^1.2.3",
+ "doctrine": "^2.1.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.4.1",
+ "object.entries": "^1.1.2",
+ "object.fromentries": "^2.0.2",
+ "object.values": "^1.1.1",
+ "prop-types": "^15.7.2",
+ "resolve": "^1.17.0",
+ "string.prototype.matchall": "^4.0.2"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ }
+ }
+ },
+ "eslint-plugin-react-hooks": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.7.tgz",
+ "integrity": "sha512-5PuW2OMHQyMLr/+MqTluYN3/NeJJ1RuvmEp5TR9Xl2gXKxvcusUZuMz8XBUtbELNaiRYWs693LQs0cljKuuHRQ==",
+ "dev": true
+ },
+ "eslint-plugin-wc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.2.0.tgz",
+ "integrity": "sha512-p1Vv8GkiTS8ZNfsmWvNJfKsGwsfCDteo2QsFE53x5DuHN7YDVf36II46DauP3mBCQ9pZnYD8lZyl/uz3qBtwQw==",
+ "dev": true,
+ "requires": {
+ "js-levenshtein-esm": "^1.2.0",
+ "validate-element-name": "^2.1.1"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
+ "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
+ "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.2.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.2.0"
+ }
+ },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
+ "esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
+ "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.1.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
+ "execa": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+ "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -501,14 +1633,44 @@
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
},
"fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
},
"fill-range": {
"version": "7.0.1",
@@ -520,14 +1682,51 @@
}
},
"find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
- "locate-path": "^3.0.0"
+ "locate-path": "^2.0.0"
}
},
+ "find-versions": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
+ "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+ "dev": true,
+ "requires": {
+ "semver-regex": "^2.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -549,12 +1748,45 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
+ "get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -564,9 +1796,9 @@
}
},
"glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -577,16 +1809,25 @@
"path-is-absolute": "^1.0.0"
}
},
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
- "growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
"har-schema": {
@@ -603,22 +1844,54 @@
"har-schema": "^2.0.0"
}
},
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ }
+ }
+ },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
- "he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
"dev": true
},
"home-assistant-js-websocket": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/home-assistant-js-websocket/-/home-assistant-js-websocket-4.5.0.tgz",
- "integrity": "sha512-ig+zws1MW14XwjMtXRzDBxDZVwvEaluTA9Pq4wqRebKo0Hw7yVix2GFn0wzG75eqC3mc0BlJQiXqBeWhJuJ0pQ=="
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/home-assistant-js-websocket/-/home-assistant-js-websocket-5.4.1.tgz",
+ "integrity": "sha512-FTVoO5yMSa2dy1ffZDvJy/r79VTjwFOzyP/bPld5lDHKbNyXC8wgqpn8Kdf5ZQISYJf1T1dfH+v2NYEngn5NgQ=="
+ },
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
},
"http-proxy-agent": {
"version": "2.1.0",
@@ -640,14 +1913,179 @@
}
},
"https-proxy-agent": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.3.tgz",
- "integrity": "sha512-Ytgnz23gm2DVftnzqRRz2dOXZbGd2uiajSw/95bPp6v53zPRspQjLm/AfBgqbJ2qfeRXWIOMVLpp86+/5yX39Q==",
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
"requires": {
"agent-base": "^4.3.0",
"debug": "^3.1.0"
}
},
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true
+ },
+ "husky": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz",
+ "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "ci-info": "^2.0.0",
+ "compare-versions": "^3.6.0",
+ "cosmiconfig": "^6.0.0",
+ "find-versions": "^3.2.0",
+ "opencollective-postinstall": "^2.0.2",
+ "pkg-dir": "^4.2.0",
+ "please-upgrade-node": "^3.2.0",
+ "slash": "^3.0.0",
+ "which-pm-runs": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+ "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -664,34 +2102,150 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
+ "internal-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz",
+ "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==",
+ "dev": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+ "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+ "dev": true
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+ "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
+ "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
+ "js-levenshtein-esm": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz",
+ "integrity": "sha512-fzreKVq1eD7eGcQr7MtRpQH94f8gIfhdrc7yeih38xh684TNMK9v5aAu2wxfIRMk/GpAJRrzcirMAPIaSDaByQ==",
+ "dev": true
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -699,9 +2253,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -712,6 +2266,18 @@
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -731,6 +2297,12 @@
"jsonify": "~0.0.0"
}
},
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -743,20 +2315,12 @@
"dev": true,
"requires": {
"minimist": "^1.2.0"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- }
}
},
"jsonc-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.0.tgz",
- "integrity": "sha512-4fLQxW1j/5fWj6p78vAlAafoCKtuBm6ghv+Ij5W2DrDx0qE+ZdEl2c6Ko1mgJNF5ftX1iEWQQ4Ap7+3GlhjkOA=="
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+ "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA=="
},
"jsonify": {
"version": "0.0.0",
@@ -775,48 +2339,511 @@
"verror": "1.10.0"
}
},
+ "jsx-ast-utils": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
+ "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "object.assign": "^4.1.0"
+ }
+ },
+ "language-subtag-registry": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz",
+ "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==",
+ "dev": true
+ },
+ "language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+ "dev": true,
+ "requires": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "lint-staged": {
+ "version": "10.2.11",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.11.tgz",
+ "integrity": "sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "cli-truncate": "2.1.0",
+ "commander": "^5.1.0",
+ "cosmiconfig": "^6.0.0",
+ "debug": "^4.1.1",
+ "dedent": "^0.7.0",
+ "enquirer": "^2.3.5",
+ "execa": "^4.0.1",
+ "listr2": "^2.1.0",
+ "log-symbols": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "normalize-path": "^3.0.0",
+ "please-upgrade-node": "^3.2.0",
+ "string-argv": "0.3.1",
+ "stringify-object": "^3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "listr2": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.2.0.tgz",
+ "integrity": "sha512-Q8qbd7rgmEwDo1nSyHaWQeztfGsdL6rb4uh7BA+Q80AZiDET5rVntiU1+13mu2ZTDVaBVbvAD1Db11rnu3l9sg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "cli-truncate": "^2.1.0",
+ "figures": "^3.2.0",
+ "indent-string": "^4.0.0",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rxjs": "^6.5.5",
+ "through": "^2.3.8"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
"loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
+ "emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
},
"locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "p-locate": "^3.0.0",
+ "p-locate": "^2.0.0",
"path-exists": "^3.0.0"
}
},
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "lodash": {
+ "version": "4.17.19",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ }
+ }
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ }
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
- "memory-fs": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
- "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
- "dev": true,
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
@@ -828,18 +2855,24 @@
}
},
"mime-db": {
- "version": "1.40.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
},
"mime-types": {
- "version": "2.1.24",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
- "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
"requires": {
- "mime-db": "1.40.0"
+ "mime-db": "1.44.0"
}
},
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -850,74 +2883,18 @@
}
},
"minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "0.0.8"
- }
- },
- "mocha": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
- "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
- "dev": true,
- "requires": {
- "browser-stdout": "1.3.1",
- "commander": "2.15.1",
- "debug": "3.1.0",
- "diff": "3.5.0",
- "escape-string-regexp": "1.0.5",
- "glob": "7.1.2",
- "growl": "1.10.5",
- "he": "1.1.1",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "supports-color": "5.4.0"
- },
- "dependencies": {
- "commander": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
- "dev": true
- },
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
+ "minimist": "^1.2.5"
}
},
"ms": {
@@ -925,11 +2902,114 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node-gyp-build": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz",
+ "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w=="
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
+ "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "has": "^1.0.3"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
+ "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -939,30 +3019,86 @@
"wrappy": "1"
}
},
+ "onetime": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "opencollective-postinstall": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
"p-limit": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
- "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
- "p-try": "^2.0.0"
+ "p-try": "^1.0.0"
}
},
"p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
"dev": true,
"requires": {
- "p-limit": "^2.0.0"
+ "aggregate-error": "^3.0.0"
}
},
"p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -975,28 +3111,97 @@
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ }
+ },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"picomatch": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.0.tgz",
- "integrity": "sha512-uhnEDzAbrcJ8R3g2fANnSuXZMBtkpSjxTTgn2LeSiQlfmq72enQJWdQllXW24MBLYnA1SBD2vfvx2o0Zw3Ielw==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.1.0"
+ }
+ },
+ "please-upgrade-node": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+ "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+ "dev": true,
+ "requires": {
+ "semver-compare": "^1.0.0"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"prettier": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
- "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
- "optional": true
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
+ "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
},
"process-nextick-args": {
"version": "2.0.1",
@@ -1004,6 +3209,23 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "prop-types": {
+ "version": "15.7.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.8.1"
+ }
+ },
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -1011,9 +3233,19 @@
"dev": true
},
"psl": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.1.tgz",
- "integrity": "sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA=="
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
},
"punycode": {
"version": "2.1.1",
@@ -1025,16 +3257,37 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
- "querystringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
- "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
},
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
"readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -1054,15 +3307,51 @@
}
}
},
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
"regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
+ "dev": true
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
},
"request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@@ -1071,7 +3360,7 @@
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
- "har-validator": "~5.1.0",
+ "har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
@@ -1081,7 +3370,7 @@
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
+ "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
}
@@ -1127,34 +3416,53 @@
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
"resolve": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz",
- "integrity": "sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==",
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
}
},
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
"rimraf": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
- "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
+ "rxjs": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz",
+ "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
"safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"safer-buffer": {
"version": "2.1.2",
@@ -1166,33 +3474,133 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
},
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+ "dev": true
+ },
+ "semver-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+ "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
+ "dev": true
+ },
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
- "shimmer": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
- "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "shimmer": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
+ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
+ },
+ "side-channel": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
+ "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
+ "dev": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "object-inspect": "^1.7.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
},
"source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
"source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
+ "spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -1224,6 +3632,18 @@
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
+ "string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+ "dev": true
+ },
+ "string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "dev": true
+ },
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -1233,6 +3653,57 @@
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "string.prototype.matchall": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz",
+ "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "has-symbols": "^1.0.1",
+ "internal-slot": "^1.0.2",
+ "regexp.prototype.flags": "^1.3.0",
+ "side-channel": "^1.0.2"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+ "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+ "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
}
},
"string_decoder": {
@@ -1252,15 +3723,61 @@
}
}
},
+ "stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "dev": true,
+ "requires": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ }
+ },
"strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "get-stdin": "^4.0.1"
+ },
+ "dependencies": {
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ }
}
},
+ "strip-json-comments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
+ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
+ "dev": true
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1270,12 +3787,42 @@
"has-flag": "^3.0.0"
}
},
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ }
+ },
"tapable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
"dev": true
},
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -1286,25 +3833,24 @@
}
},
"tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- }
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
}
},
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
"ts-loader": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz",
- "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.0.tgz",
+ "integrity": "sha512-giEW167rtK1V6eX/DnXEtOgcawwoIp6hqznqYNNSmraUZOq36zMhwBq12JMlYhxf50BC58bscsTSKKtE42zAuw==",
"dev": true,
"requires": {
"chalk": "^2.3.0",
@@ -1323,49 +3869,40 @@
}
},
"ts-node": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
- "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
+ "version": "8.10.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+ "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
"dev": true,
"requires": {
"arg": "^4.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
- "source-map-support": "^0.5.6",
+ "source-map-support": "^0.5.17",
"yn": "3.1.1"
}
},
- "tslib": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
- "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
- "dev": true
- },
- "tslint": {
- "version": "5.20.1",
- "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
- "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
+ "tsconfig-paths": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+ "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
- "builtin-modules": "^1.1.1",
- "chalk": "^2.3.0",
- "commander": "^2.12.1",
- "diff": "^4.0.1",
- "glob": "^7.1.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "resolve": "^1.3.2",
- "semver": "^5.3.0",
- "tslib": "^1.8.0",
- "tsutils": "^2.29.0"
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.0",
+ "strip-bom": "^3.0.0"
}
},
+ "tslib": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "dev": true
+ },
"tsutils": {
- "version": "2.29.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
- "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+ "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
"dev": true,
"requires": {
"tslib": "^1.8.1"
@@ -1384,10 +3921,25 @@
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
"typescript": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz",
- "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
+ "version": "3.9.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz",
+ "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==",
"dev": true
},
"typescript-json-schema": {
@@ -1411,14 +3963,12 @@
"punycode": "^2.1.0"
}
},
- "url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
- "dev": true,
+ "utf-8-validate": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz",
+ "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==",
"requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
+ "node-gyp-build": "~3.7.0"
}
},
"util-deprecate": {
@@ -1428,9 +3978,36 @@
"dev": true
},
"uuid": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
- "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "v8-compile-cache": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+ "dev": true
+ },
+ "validate-element-name": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/validate-element-name/-/validate-element-name-2.1.1.tgz",
+ "integrity": "sha1-j/dffaafc+fFEFiDYhMFCLesZE4=",
+ "dev": true,
+ "requires": {
+ "is-potential-custom-element-name": "^1.0.0",
+ "log-symbols": "^1.0.0",
+ "meow": "^3.7.0"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
},
"verror": {
"version": "1.10.0",
@@ -1442,46 +4019,24 @@
"extsprintf": "^1.2.0"
}
},
- "vscode": {
- "version": "1.1.36",
- "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.36.tgz",
- "integrity": "sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ==",
- "dev": true,
- "requires": {
- "glob": "^7.1.2",
- "mocha": "^5.2.0",
- "request": "^2.88.0",
- "semver": "^5.4.1",
- "source-map-support": "^0.5.0",
- "url-parse": "^1.4.4",
- "vscode-test": "^0.4.1"
- }
- },
"vscode-extension-telemetry": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.2.tgz",
- "integrity": "sha512-FSbaZKlIH3VKvBJsKw7v5bESWHXzltji2rtjaJeJglpQH4tfClzwHMzlMXUZGiblV++djEzb1gW8mb5E+wxFsg==",
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.6.tgz",
+ "integrity": "sha512-rbzSg7k4NnsCdF4Lz0gI4jl3JLXR0hnlmfFgsY8CSDYhXgdoIxcre8jw5rjkobY0xhSDhbG7xCjP8zxskySJ/g==",
"requires": {
- "applicationinsights": "1.4.0"
+ "applicationinsights": "1.7.4"
}
},
"vscode-json-languageservice": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.5.1.tgz",
- "integrity": "sha512-F8jPqcAC1mbQOMKvGYS4dGEw9JCZxVEi7tc5ASZLfcfwKq2URZKB4fOtdy1GEsTLsrW11tVrBjEPntpXzqp/NA==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
+ "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
"requires": {
"jsonc-parser": "^2.2.1",
"vscode-languageserver-textdocument": "^1.0.1",
"vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.1",
- "vscode-uri": "^2.1.1"
- },
- "dependencies": {
- "jsonc-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
- "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w=="
- }
+ "vscode-nls": "^4.1.2",
+ "vscode-uri": "^2.1.2"
}
},
"vscode-jsonrpc": {
@@ -1490,68 +4045,27 @@
"integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A=="
},
"vscode-languageclient": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz",
- "integrity": "sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q==",
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.1.3.tgz",
+ "integrity": "sha512-YciJxk08iU5LmWu7j5dUt9/1OLjokKET6rME3cI4BRpiF6HZlusm2ZwPt0MYJ0lV5y43sZsQHhyon2xBg4ZJVA==",
"requires": {
- "semver": "^5.5.0",
- "vscode-languageserver-protocol": "3.14.1"
+ "semver": "^6.3.0",
+ "vscode-languageserver-protocol": "^3.15.3"
},
"dependencies": {
- "vscode-jsonrpc": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz",
- "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg=="
- },
- "vscode-languageserver-protocol": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz",
- "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==",
- "requires": {
- "vscode-jsonrpc": "^4.0.0",
- "vscode-languageserver-types": "3.14.0"
- }
- },
- "vscode-languageserver-types": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz",
- "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A=="
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
}
}
},
"vscode-languageserver": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz",
- "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz",
+ "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==",
"requires": {
- "vscode-languageserver-protocol": "3.14.1",
- "vscode-uri": "^1.0.6"
- },
- "dependencies": {
- "vscode-jsonrpc": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz",
- "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg=="
- },
- "vscode-languageserver-protocol": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz",
- "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==",
- "requires": {
- "vscode-jsonrpc": "^4.0.0",
- "vscode-languageserver-types": "3.14.0"
- }
- },
- "vscode-languageserver-types": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz",
- "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A=="
- },
- "vscode-uri": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz",
- "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ=="
- }
+ "vscode-languageserver-protocol": "^3.15.3"
}
},
"vscode-languageserver-protocol": {
@@ -1574,24 +4088,45 @@
"integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ=="
},
"vscode-nls": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz",
- "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A=="
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
+ "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw=="
},
"vscode-test": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz",
- "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz",
+ "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==",
"dev": true,
"requires": {
"http-proxy-agent": "^2.1.0",
- "https-proxy-agent": "^2.2.1"
+ "https-proxy-agent": "^2.2.4",
+ "rimraf": "^2.6.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
}
},
"vscode-uri": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.1.tgz",
- "integrity": "sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A=="
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
+ "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
},
"which-module": {
"version": "2.0.0",
@@ -1599,15 +4134,77 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
+ "which-pm-runs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+ "dev": true
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
"wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
}
},
"wrappy": {
@@ -1616,14 +4213,20 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "ws": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz",
- "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==",
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
"requires": {
- "async-limiter": "^1.0.0"
+ "mkdirp": "^0.5.1"
}
},
+ "ws": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+ "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
+ },
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
@@ -1631,12 +4234,9 @@
"dev": true
},
"yaml": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz",
- "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==",
- "requires": {
- "@babel/runtime": "^7.6.3"
- }
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
},
"yaml-ast-parser-custom-tags": {
"version": "0.0.43",
@@ -1644,22 +4244,28 @@
"integrity": "sha512-R5063FF/JSAN6qXCmylwjt9PcDH6M0ExEme/nJBzLspc6FJDmHHIqM7xh2WfEmsTJqClF79A9VkXjkAqmZw9SQ=="
},
"yaml-language-server": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.7.2.tgz",
- "integrity": "sha512-3jBsYrtnlaI5H6psW+0qzVh9LoQ21fuvC8KIupjPbQURb6cAMUGH5aElKREAevSSpgs7VIoqU1ZMCglIHm32OA==",
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.9.0.tgz",
+ "integrity": "sha512-nRExM5NfJXzxTKlFmHKr/ZtoxZCddH1kuuWNfHRvTLCEHzexIn/YvI/DBZHxKLh/ym9f4Q4j4zW76vB6J18lUQ==",
"requires": {
"js-yaml": "^3.13.1",
- "jsonc-parser": "^2.1.0",
+ "jsonc-parser": "^2.2.1",
"prettier": "^1.18.2",
"request-light": "^0.2.4",
- "vscode-json-languageservice": "^3.3.0",
+ "vscode-json-languageservice": "^3.6.0",
"vscode-languageserver": "^5.2.1",
- "vscode-languageserver-types": "^3.14.0",
- "vscode-nls": "^4.1.1",
- "vscode-uri": "^2.0.3",
+ "vscode-languageserver-types": "^3.15.1",
+ "vscode-nls": "^4.1.2",
+ "vscode-uri": "^2.1.1",
"yaml-ast-parser-custom-tags": "0.0.43"
},
"dependencies": {
+ "prettier": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+ "optional": true
+ },
"vscode-jsonrpc": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz",
@@ -1696,18 +4302,13 @@
"integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A=="
}
}
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ=="
}
}
},
"yargs": {
- "version": "14.2.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz",
- "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==",
+ "version": "14.2.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
+ "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
"dev": true,
"requires": {
"cliui": "^5.0.0",
@@ -1720,17 +4321,70 @@
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
- "yargs-parser": "^15.0.0"
+ "yargs-parser": "^15.0.1"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ }
}
},
"yargs-parser": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz",
- "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==",
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
+ "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ }
}
},
"yn": {
diff --git a/package.json b/package.json
index bc56abf772..2a050786fa 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"version": "1.6.5",
"preview": false,
"engines": {
- "vscode": "^1.32.0"
+ "vscode": "^1.36.0"
},
"categories": [
"Other",
@@ -179,43 +179,77 @@
"comments": false,
"strings": true
},
- "editor.autoIndent": "none"
+ "editor.autoIndent": "full"
}
}
},
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "lint-staged": {
+ "*.ts": [
+ "eslint --fix"
+ ]
+ },
"scripts": {
"compile": "ts-node src/language-service/src/schemas/generateSchemas.ts --quick && tsc -p ./ ",
- "watch": "tsc -watch -p ./",
- "postinstall": "node ./node_modules/vscode/bin/install",
+ "format:eslint": "eslint '**/src/**/*.ts' --fix --ignore-path .gitignore",
+ "format:prettier": "prettier '**/src/**/*.{ts,json}' --write",
+ "format": "npm run format:eslint && npm run format:prettier",
+ "lint:eslint": "eslint '**/src/**/*.ts' --ignore-path .gitignore",
+ "lint:prettier": "prettier '**/src/**/*.{ts,json}' --check",
+ "lint:types": "tsc",
+ "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types",
+ "schema": "ts-node src/language-service/src/schemas/generateSchemas.ts",
"test": "npm run compile && node ./node_modules/vscode/bin/test",
- "schema": "ts-node src/language-service/src/schemas/generateSchemas.ts"
+ "watch": "tsc -watch -p ./"
},
"devDependencies": {
- "@types/node": "13.9.0",
- "@types/request": "2.48.3",
- "ts-node": "8.6.2",
- "tslint": "^5.20.1",
- "typescript": "3.8.3",
- "vscode": "^1.1.36",
- "@types/mocha": "5.2.7",
- "@types/ws": "7.2.2",
- "@types/yaml": "1.2.0",
- "rimraf": "3.0.0",
- "ts-loader": "^6.0.4",
- "typescript-json-schema": "0.42.0"
+ "@types/mocha": "8.0.0",
+ "@types/node": "14.0.22",
+ "@types/request": "2.48.5",
+ "@types/vscode": "^1.47.0",
+ "@types/ws": "7.2.6",
+ "@typescript-eslint/eslint-plugin": "^3.6.0",
+ "@typescript-eslint/parser": "^3.6.0",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.4.0",
+ "eslint-config-airbnb-typescript": "^8.0.2",
+ "eslint-config-prettier": "^6.11.0",
+ "eslint-plugin-flowtype": "^5.2.0",
+ "eslint-plugin-import": "^2.22.0",
+ "eslint-plugin-jsx-a11y": "^6.3.1",
+ "eslint-plugin-prettier": "^3.1.4",
+ "eslint-plugin-react": "^7.20.3",
+ "eslint-plugin-react-hooks": "4.0.7",
+ "eslint-plugin-wc": "^1.2.0",
+ "husky": "^4.2.5",
+ "lint-staged": "^10.2.11",
+ "prettier": "^2.0.5",
+ "rimraf": "3.0.2",
+ "ts-loader": "^8.0.0",
+ "ts-node": "8.10.2",
+ "typescript": "^3.9.6",
+ "typescript-json-schema": "0.42.0",
+ "vscode-test": "^1.4.0"
},
"dependencies": {
- "home-assistant-js-websocket": "4.5.0",
- "request": "2.88.0",
+ "bufferutil": "^4.0.1",
+ "home-assistant-js-websocket": "5.4.1",
+ "request": "2.88.2",
"request-promise": "^4.2.5",
- "vscode-extension-telemetry": "0.1.2",
- "vscode-json-languageservice": "3.5.1",
- "vscode-languageclient": "5.2.1",
- "vscode-languageserver": "5.2.1",
+ "utf-8-validate": "^5.0.2",
+ "vscode-extension-telemetry": "0.1.6",
+ "vscode-json-languageservice": "3.7.0",
+ "vscode-languageclient": "6.1.3",
+ "vscode-languageserver": "6.1.1",
"vscode-languageserver-protocol": "3.15.3",
- "vscode-uri": "2.1.1",
- "ws": "7.2.0",
- "yaml": "1.7.2",
- "yaml-language-server": "0.7.2"
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-uri": "2.1.2",
+ "ws": "7.3.1",
+ "yaml": "1.10.0",
+ "yaml-language-server": "0.9.0"
}
}
diff --git a/src/extension.ts b/src/extension.ts
index 6e57fdec75..6bc8123505 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -1,137 +1,254 @@
-import * as fs from 'fs';
-import * as path from 'path';
-import * as vscode from 'vscode';
-import { LanguageClient, LanguageClientOptions, TransportKind, ServerOptions } from 'vscode-languageclient';
-import TelemetryReporter from 'vscode-extension-telemetry';
-
-const myExtensionId = 'vscode-home-assistant';
-const telemetryVersion = generateVersionString(vscode.extensions.getExtension(`keesschollaart.${myExtensionId}`));
+import * as fs from "fs";
+import * as path from "path";
+import * as vscode from "vscode";
+import {
+ LanguageClient,
+ LanguageClientOptions,
+ TransportKind,
+ ServerOptions,
+} from "vscode-languageclient";
+import TelemetryReporter from "vscode-extension-telemetry";
+
+const extensionId = "vscode-home-assistant";
+const telemetryVersion = generateVersionString(
+ vscode.extensions.getExtension(`keesschollaart.${extensionId}`)
+);
let reporter: TelemetryReporter;
const documentSelector = [
- { language: 'home-assistant', scheme: 'file' },
- { language: 'home-assistant', scheme: 'untitled' }
+ { language: "home-assistant", scheme: "file" },
+ { language: "home-assistant", scheme: "untitled" },
];
-export function activate(context: vscode.ExtensionContext) {
- console.log('Home Assistant Extension has been activated!');
-
- reporter = new TelemetryReporter(myExtensionId, telemetryVersion, 'ff172110-5bb2-4041-9f31-e157f1efda56');
- try {
- reporter.sendTelemetryEvent('extension.activate');
- } catch (e) {
- // if something bad happens reporting telemetry, swallow it and move on
- console.log(`${e}`);
- }
-
- var serverModule = path.join(context.extensionPath, 'out', 'server', 'server.js');
-
- var debugOptions = { execArgv: ['--nolazy', "--inspect=6003"] };
-
- var serverOptions: ServerOptions = {
- run: { module: serverModule, transport: TransportKind.ipc },
- debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions }
- };
-
- var clientOptions: LanguageClientOptions = {
- documentSelector,
- synchronize: {
- configurationSection: 'vscode-home-assistant',
- fileEvents: vscode.workspace.createFileSystemWatcher('**/*.?(e)y?(a)ml')
+export async function activate(
+ context: vscode.ExtensionContext
+): Promise {
+ console.log("Home Assistant Extension has been activated!");
+
+ reporter = new TelemetryReporter(
+ extensionId,
+ telemetryVersion,
+ "ff172110-5bb2-4041-9f31-e157f1efda56"
+ );
+
+ try {
+ reporter.sendTelemetryEvent("extension.activate");
+ } catch (error) {
+ // if something bad happens reporting telemetry, swallow it and move on
+ console.log(error);
+ }
+
+ const serverModule = path.join(
+ context.extensionPath,
+ "out",
+ "server",
+ "server.js"
+ );
+
+ const debugOptions = { execArgv: ["--nolazy", "--inspect=6003"] };
+
+ const serverOptions: ServerOptions = {
+ run: { module: serverModule, transport: TransportKind.ipc },
+ debug: {
+ module: serverModule,
+ transport: TransportKind.ipc,
+ options: debugOptions,
+ },
+ };
+
+ const clientOptions: LanguageClientOptions = {
+ documentSelector,
+ synchronize: {
+ configurationSection: "vscode-home-assistant",
+ fileEvents: vscode.workspace.createFileSystemWatcher("**/*.?(e)y?(a)ml"),
+ },
+ };
+
+ const client = new LanguageClient(
+ "home-assistant",
+ "Home Assistant Language Server",
+ serverOptions,
+ clientOptions
+ );
+
+ // is this really needed?
+ vscode.languages.setLanguageConfiguration("home-assistant", {
+ wordPattern: /("(?:[^\\"]*(?:\\.)?)*"?)|[^\s{}[\],:]+/,
+ });
+
+ context.subscriptions.push(reporter);
+ context.subscriptions.push(client.start());
+
+ client
+ .onReady()
+ .then(() => {
+ client.onNotification(
+ "no-config",
+ async (): Promise => {
+ const goToSettings = "Go to Settings (UI)";
+ const optionClicked = await vscode.window.showInformationMessage(
+ "Please configure Home Assistant (search for 'Home Assistant' in settings).",
+ goToSettings
+ );
+ if (optionClicked === goToSettings) {
+ await vscode.commands.executeCommand(
+ "workbench.action.openSettings2"
+ );
+ }
}
- };
-
- var client = new LanguageClient('home-assistant', 'Home Assistant Language Server', serverOptions, clientOptions);
-
- // is this really needed?
- vscode.languages.setLanguageConfiguration('home-assistant', { wordPattern: /("(?:[^\\\"]*(?:\\.)?)*"?)|[^\s{}\[\],:]+/ });
-
- context.subscriptions.push(reporter);
- context.subscriptions.push(client.start());
-
- client.onReady().then(async () => {
- client.onNotification("no-config", async () => {
- let goToSettings = "Go to Settings (UI)";
- var optionClicked = await vscode.window.showInformationMessage("Please configure Home Assistant (search for 'Home Assistant' in settings).", goToSettings);
- if (optionClicked === goToSettings) {
- vscode.commands.executeCommand("workbench.action.openSettings2");
- }
- });
- client.onNotification("configuration_check_completed", async (result) => {
- if (result && result.result === "valid") {
- vscode.window.showInformationMessage("Home Assistant Configuration Checked, result: 'Valid'!");
- }
- else {
- vscode.window.showErrorMessage(`Home Assistant Configuration check resulted in an error: ${result.error}`);
- }
- });
- var haOutputChannel: vscode.OutputChannel;
- client.onNotification("get_eror_log_completed", async (result) => {
- if (!haOutputChannel) {
- haOutputChannel = vscode.window.createOutputChannel("Home Assistant Error Log");
- }
- haOutputChannel.appendLine(result);
- haOutputChannel.show();
- });
-
- }).catch((reason) => {
- console.error(JSON.stringify(reason));
- reporter.sendTelemetryEvent('extension.languageserver.onReadyError', { 'reason': JSON.stringify(reason) });
- });
-
- let commandMappings = [
- new CommandMappings('vscode-home-assistant.scriptReload', "script", "reload"),
- new CommandMappings('vscode-home-assistant.groupReload', "group", "reload"),
- new CommandMappings('vscode-home-assistant.homeassistantReloadCoreConfig', "homeassistant", "reload_core_config"),
- new CommandMappings('vscode-home-assistant.homeassistantRestart', "homeassistant", "restart"),
- new CommandMappings('vscode-home-assistant.automationReload', "automation", "reload"),
- new CommandMappings('vscode-home-assistant.sceneReload', "scene", "reload"),
- new CommandMappings('vscode-home-assistant.themeReload', "frontend", "reload_themes"),
- new CommandMappings('vscode-home-assistant.hassioAddonRestartGitPull', "hassio", "addon_restart", { addon: "core_git_pull" }),
- new CommandMappings('vscode-home-assistant.hassioHostReboot', "hassio", "host_reboot")
- ];
-
- commandMappings.forEach(mapping => {
- context.subscriptions.push(vscode.commands.registerCommand(mapping.commandId, _ => {
- client.sendRequest("callService", { domain: mapping.domain, service: mapping.service, serviceData: mapping.serviceData });
- }));
+ );
+ client.onNotification("configuration_check_completed", async (result) => {
+ if (result && result.result === "valid") {
+ await vscode.window.showInformationMessage(
+ "Home Assistant Configuration Checked, result: 'Valid'!"
+ );
+ } else {
+ await vscode.window.showErrorMessage(
+ `Home Assistant Configuration check resulted in an error: ${result.error}`
+ );
+ }
+ });
+ let haOutputChannel: vscode.OutputChannel;
+ client.onNotification("get_eror_log_completed", (result) => {
+ if (!haOutputChannel) {
+ haOutputChannel = vscode.window.createOutputChannel(
+ "Home Assistant Error Log"
+ );
+ }
+ haOutputChannel.appendLine(result);
+ haOutputChannel.show();
+ });
+ })
+ .catch((reason) => {
+ console.error(JSON.stringify(reason));
+ reporter.sendTelemetryEvent("extension.languageserver.onReadyError", {
+ reason: JSON.stringify(reason),
+ });
});
- let inputReloadDomains = [
- 'input_boolean', 'input_datetime', 'input_number', 'input_select', 'input_text'
- ];
-
- context.subscriptions.push(vscode.commands.registerCommand("vscode-home-assistant.inputReload", _ => {
- inputReloadDomains.forEach((domain) => {
- client.sendRequest("callService", { domain, service: 'reload' })
- })
- }))
-
- context.subscriptions.push(vscode.commands.registerCommand("vscode-home-assistant.homeassistantCheckConfig", _ => client.sendRequest("checkConfig")));
- context.subscriptions.push(vscode.commands.registerCommand("vscode-home-assistant.getErrorLog", _ => client.sendRequest("getErrorLog")));
-
- var fileAssociations = vscode.workspace.getConfiguration().get("files.associations");
- if (!fileAssociations["*.yaml"]) {
- vscode.workspace.getConfiguration().update("files.associations", { "*.yaml": "home-assistant" }, false);
- }
-
+ const commandMappings = [
+ new CommandMappings(
+ "vscode-home-assistant.scriptReload",
+ "script",
+ "reload"
+ ),
+ new CommandMappings("vscode-home-assistant.groupReload", "group", "reload"),
+ new CommandMappings(
+ "vscode-home-assistant.homeassistantReloadCoreConfig",
+ "homeassistant",
+ "reload_core_config"
+ ),
+ new CommandMappings(
+ "vscode-home-assistant.homeassistantRestart",
+ "homeassistant",
+ "restart"
+ ),
+ new CommandMappings(
+ "vscode-home-assistant.automationReload",
+ "automation",
+ "reload"
+ ),
+ new CommandMappings("vscode-home-assistant.sceneReload", "scene", "reload"),
+ new CommandMappings(
+ "vscode-home-assistant.themeReload",
+ "frontend",
+ "reload_themes"
+ ),
+ new CommandMappings(
+ "vscode-home-assistant.hassioAddonRestartGitPull",
+ "hassio",
+ "addon_restart",
+ { addon: "core_git_pull" }
+ ),
+ new CommandMappings(
+ "vscode-home-assistant.hassioHostReboot",
+ "hassio",
+ "host_reboot"
+ ),
+ ];
+
+ commandMappings.forEach((mapping) => {
+ context.subscriptions.push(
+ vscode.commands.registerCommand(mapping.commandId, async (_) => {
+ await client.sendRequest("callService", {
+ domain: mapping.domain,
+ service: mapping.service,
+ serviceData: mapping.serviceData,
+ });
+ })
+ );
+ });
+
+ const inputReloadDomains = [
+ "input_boolean",
+ "input_datetime",
+ "input_number",
+ "input_select",
+ "input_text",
+ ];
+
+ context.subscriptions.push(
+ vscode.commands.registerCommand(
+ "vscode-home-assistant.inputReload",
+ async (_) => {
+ await Promise.all(
+ inputReloadDomains.map(async (domain) => {
+ await client.sendRequest("callService", {
+ domain,
+ service: "reload",
+ });
+ })
+ );
+ }
+ )
+ );
+
+ context.subscriptions.push(
+ vscode.commands.registerCommand(
+ "vscode-home-assistant.homeassistantCheckConfig",
+ (_) => client.sendRequest("checkConfig")
+ )
+ );
+ context.subscriptions.push(
+ vscode.commands.registerCommand("vscode-home-assistant.getErrorLog", (_) =>
+ client.sendRequest("getErrorLog")
+ )
+ );
+
+ const fileAssociations = vscode.workspace
+ .getConfiguration()
+ .get("files.associations");
+ if (!fileAssociations["*.yaml"]) {
+ await vscode.workspace
+ .getConfiguration()
+ .update("files.associations", { "*.yaml": "home-assistant" }, false);
+ }
}
-export function deactivate() {
- reporter.dispose();
+export async function deactivate(): Promise {
+ await reporter.dispose();
}
function generateVersionString(extension: vscode.Extension): string {
- // if the extensionPath is a Git repo, this is probably an extension developer
- const isDevMode: boolean = extension ? fs.existsSync(extension.extensionPath + '/.git') : false;
- const baseVersion: string = extension ? extension.packageJSON.version : "0.0.0";
-
- return isDevMode ? `${baseVersion}-dev` : baseVersion;
+ // if the extensionPath is a Git repo, this is probably an extension developer
+ const isDevMode: boolean = extension
+ ? fs.existsSync(`${extension.extensionPath}/.git`)
+ : false;
+ const baseVersion: string = extension
+ ? extension.packageJSON.version
+ : "0.0.0";
+
+ return isDevMode ? `${baseVersion}-dev` : baseVersion;
}
export class CommandMappings {
- constructor(public commandId: string, public domain: string, public service: string, public serviceData?: any) {
-
+ constructor(
+ public commandId: string,
+ public domain: string,
+ public service: string,
+ public serviceData?: {
+ [key: string]: any;
}
+ ) {}
}
diff --git a/src/language-service/.eslintrc.js b/src/language-service/.eslintrc.js
new file mode 120000
index 0000000000..ef65859ff5
--- /dev/null
+++ b/src/language-service/.eslintrc.js
@@ -0,0 +1 @@
+../../.eslintrc.js
\ No newline at end of file
diff --git a/src/language-service/.gitignore b/src/language-service/.gitignore
new file mode 100644
index 0000000000..bbbd153548
--- /dev/null
+++ b/src/language-service/.gitignore
@@ -0,0 +1,5 @@
+.vscode-test/
+*.vsix
+dist
+node_modules
+src/schemas/json/*.json
diff --git a/src/language-service/.prettierignore b/src/language-service/.prettierignore
new file mode 100644
index 0000000000..47f7e1073e
--- /dev/null
+++ b/src/language-service/.prettierignore
@@ -0,0 +1,4 @@
+.vscode-test/
+node_modules
+dist
+src/schemas/json
diff --git a/src/language-service/README.md b/src/language-service/README.md
index 214dc7c256..1e07d11c7a 100644
--- a/src/language-service/README.md
+++ b/src/language-service/README.md
@@ -1,6 +1,3 @@
# Home Assistant Language Service
This service contains the logic to work with a Home Assistant Configuration. It's the engine for IDE extensions for [VS Code](https://github.com/keesschollaart81/vscode-home-assistant) and [vim8/neovim](https://github.com/danielwelch/coc-homeassistant).
-
-
-
diff --git a/src/language-service/package-lock.json b/src/language-service/package-lock.json
index b0f0f86ebe..b10dbbd94b 100644
--- a/src/language-service/package-lock.json
+++ b/src/language-service/package-lock.json
@@ -5,64 +5,362 @@
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
+ "@babel/generator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz",
+ "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.13",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
+ "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
"@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
- "esutils": "^2.0.2",
"js-tokens": "^4.0.0"
}
},
+ "@babel/parser": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz",
+ "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==",
+ "dev": true
+ },
"@babel/runtime": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
- "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz",
+ "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz",
+ "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.0.0",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz",
+ "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.13"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz",
+ "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==",
+ "dev": true,
"requires": {
- "regenerator-runtime": "^0.13.2"
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.13",
+ "to-fast-properties": "^2.0.0"
}
},
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
+ "@types/eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
+ "dev": true
+ },
"@types/json-schema": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
"integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==",
"dev": true
},
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+ "dev": true
+ },
"@types/mocha": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
- "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.0.tgz",
+ "integrity": "sha512-jWeYcTo3sCH/rMgsdYXDTO85GNRyTCII5dayMIu/ZO4zbEot1E3iNGaOwpLReLUHjeNQFkgeNNVYlY4dX6azQQ==",
"dev": true
},
"@types/node": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.0.tgz",
- "integrity": "sha512-0ARSQootUG1RljH2HncpsY2TJBfGQIKOOi7kxzUY6z54ePu/ZD+wJA8zI2Q6v8rol2qpG/rvqsReco8zNMPvhQ==",
+ "version": "14.0.22",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.22.tgz",
+ "integrity": "sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g==",
+ "dev": true
+ },
+ "@types/vscode": {
+ "version": "1.47.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.47.0.tgz",
+ "integrity": "sha512-nJA37ykkz9FYA0ZOQUSc3OZnhuzEW2vUhUEo4MiduUo82jGwwcLfyvmgd/Q7b0WrZAAceojGhZybg319L24bTA==",
"dev": true
},
"@types/ws": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.2.tgz",
- "integrity": "sha512-oqnI3DbGCVI9zJ/WHdFo3CUE8jQ8CVQDUIKaDtlTcNeT4zs6UCg9Gvk5QrFx2QPkRszpM6yc8o0p4aGjCsTi+w==",
+ "version": "7.2.6",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz",
+ "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/yaml": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.2.0.tgz",
- "integrity": "sha512-GW8b9qM+ebgW3/zjzPm0I1NxMvLaz/YKT9Ph6tTb+Fkeyzd9yLTvQ6ciQ2MorTRmb/qXmfjMerRpG4LviixaqQ==",
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz",
+ "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==",
+ "dev": true,
+ "requires": {
+ "yaml": "*"
+ }
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.0.tgz",
+ "integrity": "sha512-ubHlHVt1lsPQB/CZdEov9XuOFhNG9YRC//kuiS1cMQI6Bs1SsqKrEmZnpgRwthGR09/kEDtr9MywlqXyyYd8GA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/experimental-utils": "3.6.0",
+ "debug": "^4.1.1",
+ "functional-red-black-tree": "^1.0.1",
+ "regexpp": "^3.0.0",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/experimental-utils": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.0.tgz",
+ "integrity": "sha512-4Vdf2hvYMUnTdkCNZu+yYlFtL2v+N2R7JOynIOkFbPjf9o9wQvRwRkzUdWlFd2YiiUwJLbuuLnl5civNg5ykOQ==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.3",
+ "@typescript-eslint/types": "3.6.0",
+ "@typescript-eslint/typescript-estree": "3.6.0",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.6.0.tgz",
+ "integrity": "sha512-taghDxuLhbDAD1U5Fk8vF+MnR0yiFE9Z3v2/bYScFb0N1I9SK8eKHkdJl1DAD48OGFDMFTeOTX0z7g0W6SYUXw==",
+ "dev": true,
+ "requires": {
+ "@types/eslint-visitor-keys": "^1.0.0",
+ "@typescript-eslint/experimental-utils": "3.6.0",
+ "@typescript-eslint/types": "3.6.0",
+ "@typescript-eslint/typescript-estree": "3.6.0",
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.6.0.tgz",
+ "integrity": "sha512-JwVj74ohUSt0ZPG+LZ7hb95fW8DFOqBuR6gE7qzq55KDI3BepqsCtHfBIoa0+Xi1AI7fq5nCu2VQL8z4eYftqg==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.0.tgz",
+ "integrity": "sha512-G57NDSABHjvob7zVV09ehWyD1K6/YUKjz5+AufObFyjNO4DVmKejj47MHjVHHlZZKgmpJD2yyH9lfCXHrPITFg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "3.6.0",
+ "@typescript-eslint/visitor-keys": "3.6.0",
+ "debug": "^4.1.1",
+ "glob": "^7.1.6",
+ "is-glob": "^4.0.1",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.0.tgz",
+ "integrity": "sha512-p1izllL2Ubwunite0ITjubuMQRBGgjdVYwyG7lXPX8GbrA6qF0uwSRz9MnXZaHMxID4948gX0Ez8v9tUDi/KfQ==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "acorn": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
+ "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
"dev": true
},
"agent-base": {
@@ -74,17 +372,23 @@
}
},
"ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "version": "6.12.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
+ "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
"dev": true,
"requires": {
- "fast-deep-equal": "^2.0.1",
+ "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
@@ -114,58 +418,103 @@
"sprintf-js": "~1.0.2"
}
},
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
"dev": true,
"requires": {
- "safer-buffer": "~2.1.0"
+ "@babel/runtime": "^7.10.2",
+ "@babel/runtime-corejs3": "^7.10.2"
}
},
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
"dev": true
},
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ "array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ }
},
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "array.prototype.flat": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+ "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz",
+ "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
"dev": true
},
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
"dev": true
},
- "aws4": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "axe-core": {
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
+ "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==",
+ "dev": true
+ },
+ "axobject-query": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
"dev": true
},
+ "babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ }
+ },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
},
"brace-expansion": {
"version": "1.1.11",
@@ -177,11 +526,14 @@
"concat-map": "0.0.1"
}
},
- "browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
},
"buffer-from": {
"version": "1.1.1",
@@ -189,10 +541,10 @@
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"camelcase": {
@@ -201,11 +553,23 @@
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ }
+ }
},
"chalk": {
"version": "2.4.2",
@@ -244,42 +608,62 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "confusing-browser-globals": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
+ "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
+ "dev": true
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
+ "core-js-pure": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
+ "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==",
+ "dev": true
+ },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
"requires": {
- "assert-plus": "^1.0.0"
+ "array-find-index": "^1.0.1"
}
},
+ "damerau-levenshtein": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
+ "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==",
+ "dev": true
+ },
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
@@ -294,26 +678,34 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
},
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
+ "esutils": "^2.0.2"
}
},
"emoji-regex": {
@@ -323,22 +715,31 @@
"dev": true
},
"emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true
},
"enhanced-resolve": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
- "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz",
+ "integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
+ "memory-fs": "^0.5.0",
"tapable": "^1.0.0"
}
},
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -348,6 +749,45 @@
"prr": "~1.0.1"
}
},
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.6",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+ "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.0",
+ "is-regex": "^1.1.0",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
"es6-promise": {
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
@@ -367,87 +807,552 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
- "dev": true
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "eslint": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
+ "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
"dev": true,
"requires": {
- "locate-path": "^3.0.0"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.0",
+ "eslint-utils": "^2.0.0",
+ "eslint-visitor-keys": "^1.2.0",
+ "espree": "^7.1.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.14",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
},
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "eslint-config-airbnb": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz",
+ "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==",
"dev": true,
"requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
+ "eslint-config-airbnb-base": "^14.2.0",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2"
}
},
+ "eslint-config-airbnb-base": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz",
+ "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==",
+ "dev": true,
+ "requires": {
+ "confusing-browser-globals": "^1.0.9",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2"
+ }
+ },
+ "eslint-config-airbnb-typescript": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-8.0.2.tgz",
+ "integrity": "sha512-TCOftyCoIogJzzLGSg0Qlxd27qvf+1a3MHyN/PqynTqINS4iFy+SlXy/CrAN+6xkleGMSrvmPbm3pyFEku2+IQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/parser": "^3.1.0",
+ "eslint-config-airbnb": "^18.1.0",
+ "eslint-config-airbnb-base": "^14.1.0"
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz",
+ "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^6.0.0"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+ "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.13.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "pkg-dir": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-flowtype": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz",
+ "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15",
+ "string-natural-compare": "^3.0.1"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz",
+ "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flat": "^1.2.3",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.3",
+ "eslint-module-utils": "^2.6.0",
+ "has": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "object.values": "^1.1.1",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.17.0",
+ "tsconfig-paths": "^3.9.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz",
+ "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "aria-query": "^4.2.2",
+ "array-includes": "^3.1.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^3.5.4",
+ "axobject-query": "^2.1.2",
+ "damerau-levenshtein": "^1.0.6",
+ "emoji-regex": "^9.0.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.4.1",
+ "language-tags": "^1.0.5"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz",
+ "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
+ "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.20.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz",
+ "integrity": "sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flatmap": "^1.2.3",
+ "doctrine": "^2.1.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.4.1",
+ "object.entries": "^1.1.2",
+ "object.fromentries": "^2.0.2",
+ "object.values": "^1.1.1",
+ "prop-types": "^15.7.2",
+ "resolve": "^1.17.0",
+ "string.prototype.matchall": "^4.0.2"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ }
+ }
+ },
+ "eslint-plugin-react-hooks": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.7.tgz",
+ "integrity": "sha512-5PuW2OMHQyMLr/+MqTluYN3/NeJJ1RuvmEp5TR9Xl2gXKxvcusUZuMz8XBUtbELNaiRYWs693LQs0cljKuuHRQ==",
+ "dev": true
+ },
+ "eslint-plugin-wc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.2.0.tgz",
+ "integrity": "sha512-p1Vv8GkiTS8ZNfsmWvNJfKsGwsfCDteo2QsFE53x5DuHN7YDVf36II46DauP3mBCQ9pZnYD8lZyl/uz3qBtwQw==",
+ "dev": true,
+ "requires": {
+ "js-levenshtein-esm": "^1.2.0",
+ "validate-element-name": "^2.1.1"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
+ "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
+ "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.2.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.2.0"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
+ "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.1.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
+ "get-stdin": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+ "dev": true
},
"glob": {
"version": "7.1.4",
@@ -463,32 +1368,51 @@
"path-is-absolute": "^1.0.0"
}
},
- "graceful-fs": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
- "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
- "dev": true
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
},
- "growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ }
}
},
"has-flag": {
@@ -497,16 +1421,22 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
- "he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
"dev": true
},
"home-assistant-js-websocket": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/home-assistant-js-websocket/-/home-assistant-js-websocket-4.5.0.tgz",
- "integrity": "sha512-ig+zws1MW14XwjMtXRzDBxDZVwvEaluTA9Pq4wqRebKo0Hw7yVix2GFn0wzG75eqC3mc0BlJQiXqBeWhJuJ0pQ=="
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/home-assistant-js-websocket/-/home-assistant-js-websocket-5.4.1.tgz",
+ "integrity": "sha512-FTVoO5yMSa2dy1ffZDvJy/r79VTjwFOzyP/bPld5lDHKbNyXC8wgqpn8Kdf5ZQISYJf1T1dfH+v2NYEngn5NgQ=="
+ },
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
},
"http-proxy-agent": {
"version": "2.1.0",
@@ -517,24 +1447,44 @@
"debug": "3.1.0"
}
},
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "https-proxy-agent": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "requires": {
+ "agent-base": "^4.3.0",
+ "debug": "^3.1.0"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+ "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
"dev": true,
"requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
}
},
- "https-proxy-agent": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.3.tgz",
- "integrity": "sha512-Ytgnz23gm2DVftnzqRRz2dOXZbGd2uiajSw/95bPp6v53zPRspQjLm/AfBgqbJ2qfeRXWIOMVLpp86+/5yX39Q==",
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
"requires": {
- "agent-base": "^4.3.0",
- "debug": "^3.1.0"
+ "repeating": "^2.0.0"
}
},
"inflight": {
@@ -553,16 +1503,102 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
+ "internal-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz",
+ "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==",
+ "dev": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+ "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+ "dev": true
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
- "is-typedarray": {
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-potential-custom-element-name": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+ "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
+ "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
"isarray": {
@@ -571,10 +1607,16 @@
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-levenshtein-esm": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz",
+ "integrity": "sha512-fzreKVq1eD7eGcQr7MtRpQH94f8gIfhdrc7yeih38xh684TNMK9v5aAu2wxfIRMk/GpAJRrzcirMAPIaSDaByQ==",
"dev": true
},
"js-tokens": {
@@ -584,24 +1626,18 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
"json-schema-traverse": {
@@ -619,16 +1655,25 @@
"jsonify": "~0.0.0"
}
},
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
"jsonc-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
- "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w=="
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+ "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA=="
},
"jsonify": {
"version": "0.0.0",
@@ -636,16 +1681,62 @@
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true
},
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "jsx-ast-utils": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
+ "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "object.assign": "^4.1.0"
+ }
+ },
+ "language-subtag-registry": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz",
+ "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==",
+ "dev": true
+ },
+ "language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+ "dev": true,
+ "requires": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
}
},
"locate-path": {
@@ -658,35 +1749,205 @@
"path-exists": "^3.0.0"
}
},
+ "lodash": {
+ "version": "4.17.19",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
"make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
"memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
"dev": true,
"requires": {
"errno": "^0.1.3",
"readable-stream": "^2.0.1"
}
},
- "mime-db": {
- "version": "1.40.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
- "dev": true
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ }
+ }
},
- "mime-types": {
- "version": "2.1.24",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
- "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
"requires": {
- "mime-db": "1.40.0"
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
}
},
"minimatch": {
@@ -699,87 +1960,116 @@
}
},
"minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "0.0.8"
+ "minimist": "^1.2.5"
}
},
- "mocha": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
- "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
- "dev": true,
- "requires": {
- "browser-stdout": "1.3.1",
- "commander": "2.15.1",
- "debug": "3.1.0",
- "diff": "3.5.0",
- "escape-string-regexp": "1.0.5",
- "glob": "7.1.2",
- "growl": "1.10.5",
- "he": "1.1.1",
- "minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "supports-color": "5.4.0"
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
},
"dependencies": {
- "commander": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
- "dev": true
- },
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
}
}
},
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
},
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true
},
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz",
+ "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "has": "^1.0.3"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
+ "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -789,6 +2079,20 @@
"wrappy": "1"
}
},
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
"p-limit": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
@@ -813,6 +2117,24 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -825,29 +2147,128 @@
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ }
},
"picomatch": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
- "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.1.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
+ "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
"dev": true
},
- "prettier": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
- "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
- "optional": true
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
},
"process-nextick-args": {
"version": "2.0.1",
@@ -855,40 +2276,111 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "prop-types": {
+ "version": "15.7.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.8.1"
+ }
+ },
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
"dev": true
},
- "psl": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz",
- "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==",
- "dev": true
- },
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
},
- "querystringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
- "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
- "dev": true
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ }
+ }
},
"readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -898,47 +2390,47 @@
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- }
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
}
},
"regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
- },
- "request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.0",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
+ "dev": true
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
}
},
"request-light": {
@@ -963,46 +2455,40 @@
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
"resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
}
},
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
"rimraf": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
- "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
"set-blocking": {
@@ -1011,6 +2497,48 @@
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
+ "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
+ "dev": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "object-inspect": "^1.7.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -1018,36 +2546,57 @@
"dev": true
},
"source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
+ "string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "dev": true
},
"string-width": {
"version": "3.1.0",
@@ -1060,6 +2609,40 @@
"strip-ansi": "^5.1.0"
}
},
+ "string.prototype.matchall": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz",
+ "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "has-symbols": "^1.0.1",
+ "internal-slot": "^1.0.2",
+ "regexp.prototype.flags": "^1.3.0",
+ "side-channel": "^1.0.2"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+ "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+ "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -1067,14 +2650,6 @@
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- }
}
},
"strip-ansi": {
@@ -1086,6 +2661,35 @@
"ansi-regex": "^4.1.0"
}
},
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ },
+ "dependencies": {
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ }
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
+ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
+ "dev": true
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1095,12 +2699,36 @@
"has-flag": "^3.0.0"
}
},
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ }
+ },
"tapable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
"dev": true
},
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -1108,38 +2736,18 @@
"dev": true,
"requires": {
"is-number": "^7.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- }
}
},
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
- "dev": true,
- "requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- }
- }
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
},
"ts-loader": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.0.4.tgz",
- "integrity": "sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.0.tgz",
+ "integrity": "sha512-giEW167rtK1V6eX/DnXEtOgcawwoIp6hqznqYNNSmraUZOq36zMhwBq12JMlYhxf50BC58bscsTSKKtE42zAuw==",
"dev": true,
"requires": {
"chalk": "^2.3.0",
@@ -1147,144 +2755,67 @@
"loader-utils": "^1.0.2",
"micromatch": "^4.0.0",
"semver": "^6.0.0"
- },
- "dependencies": {
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
- "json5": "^1.0.1"
- }
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
}
},
"ts-node": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
- "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
+ "version": "8.10.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+ "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
"dev": true,
"requires": {
"arg": "^4.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
- "source-map-support": "^0.5.6",
+ "source-map-support": "^0.5.17",
"yn": "3.1.1"
}
},
- "tslib": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
- "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
- "dev": true
- },
- "tslint": {
- "version": "5.20.1",
- "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
- "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
+ "tsconfig-paths": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+ "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
- "builtin-modules": "^1.1.1",
- "chalk": "^2.3.0",
- "commander": "^2.12.1",
- "diff": "^4.0.1",
- "glob": "^7.1.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "resolve": "^1.3.2",
- "semver": "^5.3.0",
- "tslib": "^1.8.0",
- "tsutils": "^2.29.0"
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.0",
+ "strip-bom": "^3.0.0"
}
},
+ "tslib": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "dev": true
+ },
"tsutils": {
- "version": "2.29.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
- "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+ "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
"dev": true,
"requires": {
"tslib": "^1.8.1"
}
},
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
- "safe-buffer": "^5.0.1"
+ "prelude-ls": "^1.2.1"
}
},
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
},
"typescript": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz",
- "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
+ "version": "3.9.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz",
+ "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==",
"dev": true
},
"typescript-json-schema": {
@@ -1309,64 +2840,49 @@
"punycode": "^2.1.0"
}
},
- "url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
- "dev": true,
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
- "uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "v8-compile-cache": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
"dev": true
},
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "validate-element-name": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/validate-element-name/-/validate-element-name-2.1.1.tgz",
+ "integrity": "sha1-j/dffaafc+fFEFiDYhMFCLesZE4=",
"dev": true,
"requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
+ "is-potential-custom-element-name": "^1.0.0",
+ "log-symbols": "^1.0.0",
+ "meow": "^3.7.0"
}
},
- "vscode": {
- "version": "1.1.36",
- "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.36.tgz",
- "integrity": "sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ==",
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"requires": {
- "glob": "^7.1.2",
- "mocha": "^5.2.0",
- "request": "^2.88.0",
- "semver": "^5.4.1",
- "source-map-support": "^0.5.0",
- "url-parse": "^1.4.4",
- "vscode-test": "^0.4.1"
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
}
},
"vscode-json-languageservice": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.5.1.tgz",
- "integrity": "sha512-F8jPqcAC1mbQOMKvGYS4dGEw9JCZxVEi7tc5ASZLfcfwKq2URZKB4fOtdy1GEsTLsrW11tVrBjEPntpXzqp/NA==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
+ "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
"requires": {
"jsonc-parser": "^2.2.1",
"vscode-languageserver-textdocument": "^1.0.1",
"vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.1",
- "vscode-uri": "^2.1.1"
+ "vscode-nls": "^4.1.2",
+ "vscode-uri": "^2.1.2"
}
},
"vscode-jsonrpc": {
@@ -1429,24 +2945,45 @@
"integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ=="
},
"vscode-nls": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz",
- "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A=="
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
+ "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw=="
},
"vscode-test": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz",
- "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz",
+ "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==",
"dev": true,
"requires": {
"http-proxy-agent": "^2.1.0",
- "https-proxy-agent": "^2.2.1"
+ "https-proxy-agent": "^2.2.4",
+ "rimraf": "^2.6.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
}
},
"vscode-uri": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.1.tgz",
- "integrity": "sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A=="
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
+ "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
},
"which-module": {
"version": "2.0.0",
@@ -1454,6 +2991,12 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
"wrap-ansi": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
@@ -1471,14 +3014,20 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "ws": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz",
- "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==",
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
"requires": {
- "async-limiter": "^1.0.0"
+ "mkdirp": "^0.5.1"
}
},
+ "ws": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+ "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
+ },
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
@@ -1486,12 +3035,9 @@
"dev": true
},
"yaml": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz",
- "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==",
- "requires": {
- "@babel/runtime": "^7.6.3"
- }
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
},
"yaml-ast-parser-custom-tags": {
"version": "0.0.43",
@@ -1499,20 +3045,28 @@
"integrity": "sha512-R5063FF/JSAN6qXCmylwjt9PcDH6M0ExEme/nJBzLspc6FJDmHHIqM7xh2WfEmsTJqClF79A9VkXjkAqmZw9SQ=="
},
"yaml-language-server": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.7.2.tgz",
- "integrity": "sha512-3jBsYrtnlaI5H6psW+0qzVh9LoQ21fuvC8KIupjPbQURb6cAMUGH5aElKREAevSSpgs7VIoqU1ZMCglIHm32OA==",
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.9.0.tgz",
+ "integrity": "sha512-nRExM5NfJXzxTKlFmHKr/ZtoxZCddH1kuuWNfHRvTLCEHzexIn/YvI/DBZHxKLh/ym9f4Q4j4zW76vB6J18lUQ==",
"requires": {
"js-yaml": "^3.13.1",
- "jsonc-parser": "^2.1.0",
+ "jsonc-parser": "^2.2.1",
"prettier": "^1.18.2",
"request-light": "^0.2.4",
- "vscode-json-languageservice": "^3.3.0",
+ "vscode-json-languageservice": "^3.6.0",
"vscode-languageserver": "^5.2.1",
- "vscode-languageserver-types": "^3.14.0",
- "vscode-nls": "^4.1.1",
- "vscode-uri": "^2.0.3",
+ "vscode-languageserver-types": "^3.15.1",
+ "vscode-nls": "^4.1.2",
+ "vscode-uri": "^2.1.1",
"yaml-ast-parser-custom-tags": "0.0.43"
+ },
+ "dependencies": {
+ "prettier": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+ "optional": true
+ }
}
},
"yargs": {
@@ -1535,9 +3089,9 @@
}
},
"yargs-parser": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz",
- "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==",
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
+ "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
diff --git a/src/language-service/package.json b/src/language-service/package.json
index 6882ffe56d..5e1656a235 100644
--- a/src/language-service/package.json
+++ b/src/language-service/package.json
@@ -27,29 +27,53 @@
"scripts": {
"clean": "rimraf lib",
"compile": "ts-node src/schemas/generateSchemas.ts --quick && tsc -p .",
+ "format:eslint": "eslint '**/src/**/*.ts' --fix --ignore-path .gitignore",
+ "format:prettier": "prettier '**/src/**/*.{ts,json}' --write",
+ "format": "npm run format:eslint && npm run format:prettier",
+ "lint:eslint": "eslint '**/src/**/*.ts' --ignore-path .gitignore",
+ "lint:prettier": "prettier '**/src/**/*.{ts,json}' --check",
+ "lint:types": "tsc",
+ "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types",
"prepublishOnly": "npm run clean && npm run compile",
"schema": "ts-node src/schemas/generateSchemas.ts"
},
"devDependencies": {
- "@types/mocha": "5.2.7",
- "@types/node": "13.9.0",
- "@types/ws": "7.2.2",
- "@types/yaml": "1.2.0",
- "rimraf": "3.0.0",
- "ts-loader": "^6.0.4",
- "ts-node": "8.6.2",
- "tslint": "^5.20.1",
- "typescript": "3.8.3",
+ "@types/mocha": "8.0.0",
+ "@types/node": "14.0.22",
+ "@types/vscode": "^1.47.0",
+ "@types/ws": "7.2.6",
+ "@types/yaml": "1.9.7",
+ "@typescript-eslint/eslint-plugin": "^3.6.0",
+ "@typescript-eslint/parser": "^3.6.0",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.4.0",
+ "eslint-config-airbnb-typescript": "^8.0.2",
+ "eslint-config-prettier": "^6.11.0",
+ "eslint-plugin-flowtype": "^5.2.0",
+ "eslint-plugin-import": "^2.22.0",
+ "eslint-plugin-jsx-a11y": "^6.3.1",
+ "eslint-plugin-prettier": "^3.1.4",
+ "eslint-plugin-react": "^7.20.3",
+ "eslint-plugin-react-hooks": "^4.0.7",
+ "eslint-plugin-wc": "^1.2.0",
+ "prettier": "^2.0.5",
+ "rimraf": "3.0.2",
+ "ts-loader": "^8.0.0",
+ "ts-node": "8.10.2",
+ "typescript": "3.9.6",
"typescript-json-schema": "0.42.0",
- "vscode": "^1.1.36"
+ "vscode-test": "^1.4.0"
},
"dependencies": {
- "home-assistant-js-websocket": "4.5.0",
- "vscode-json-languageservice": "3.5.1",
+ "home-assistant-js-websocket": "5.4.1",
+ "vscode-json-languageservice": "^3.7.0",
"vscode-languageserver-protocol": "3.15.3",
- "vscode-uri": "2.1.1",
- "ws": "7.2.0",
- "yaml": "1.7.2",
- "yaml-language-server": "0.7.2"
+ "vscode-uri": "2.1.2",
+ "ws": "7.3.1",
+ "yaml": "1.10.0",
+ "yaml-language-server": "0.9.0"
+ },
+ "resolutions": {
+ "minimist": ">=0.2.1 <1.0.0 || >=1.2.3"
}
}
diff --git a/src/language-service/src/completionHelpers/entityIds.ts b/src/language-service/src/completionHelpers/entityIds.ts
index ff094cdbe5..79a8d5d1c7 100644
--- a/src/language-service/src/completionHelpers/entityIds.ts
+++ b/src/language-service/src/completionHelpers/entityIds.ts
@@ -1,52 +1,81 @@
-import { MarkedString } from 'vscode-languageserver-protocol';
-import { JSONWorkerContribution, JSONPath, CompletionsCollector } from 'vscode-json-languageservice';
-import { IHaConnection } from '../home-assistant/haConnection';
+import { MarkedString } from "vscode-languageserver-protocol";
+import {
+ JSONWorkerContribution,
+ JSONPath,
+ CompletionsCollector,
+} from "vscode-json-languageservice";
+import { IHaConnection } from "../home-assistant/haConnection";
export class EntityIdCompletionContribution implements JSONWorkerContribution {
+ public static propertyMatches: string[] = [
+ "badges",
+ "devices",
+ "entities",
+ "entity_id",
+ "entity",
+ "exclude_entities",
+ "include_entities",
+ "scene",
+ "zone",
+ "zones",
+ ];
- public static propertyMatches: string[] = [
- "entity_id",
- "entity",
- "entities",
- "include_entities",
- "exclude_entities",
- "badges",
- "devices"
- ];
+ constructor(private haConnection: IHaConnection) {}
- constructor(private haConnection: IHaConnection) {
- }
+ public collectDefaultCompletions(
+ resource: string,
+ result: CompletionsCollector
+ ): Thenable {
+ return Promise.resolve(null);
+ }
- public collectDefaultCompletions(resource: string, result: CompletionsCollector): Thenable {
- return null;
+ public collectPropertyCompletions = async (
+ resource: string,
+ location: JSONPath,
+ currentWord: string,
+ addValue: boolean,
+ isLast: boolean,
+ result: CompletionsCollector
+ ): Promise => {
+ if (location.length < 2) {
+ return;
}
-
- public collectPropertyCompletions = async (resource: string, location: JSONPath, currentWord: string, addValue: boolean, isLast: boolean, result: CompletionsCollector): Promise => {
- if (location.length < 2) {
- return;
- }
- var currentNode = location[location.length - 1];
- var parentNode = location[location.length - 2]; // in case or arrays, currentNode is the indexer for the array position
- if (!EntityIdCompletionContribution.propertyMatches.some(x => x === currentNode || (!isNaN(+currentNode) && x === parentNode))) {
- return null;
- }
- var entityIdCompletions = await this.haConnection.getEntityCompletions();
- entityIdCompletions.forEach(c => result.add(c));
-
- return null;
- }
-
- public collectValueCompletions = async (resource: string, location: JSONPath, currentKey: string, result: CompletionsCollector): Promise => {
- if (!EntityIdCompletionContribution.propertyMatches.some(x => x === currentKey)) {
- return null;
- }
- var entityIdCompletions = await this.haConnection.getEntityCompletions();
- entityIdCompletions.forEach(c => result.add(c));
-
- return null;
+ const currentNode = location[location.length - 1];
+ const parentNode = location[location.length - 2]; // in case or arrays, currentNode is the indexer for the array position
+ if (
+ !EntityIdCompletionContribution.propertyMatches.some(
+ (x) =>
+ x === currentNode || (!Number.isNaN(+currentNode) && x === parentNode)
+ )
+ ) {
+ return;
}
+ const entityIdCompletions = await this.haConnection.getEntityCompletions();
+ entityIdCompletions.forEach((c) => result.add(c));
+ };
- public getInfoContribution(resource: string, location: JSONPath): Thenable {
- return null;
+ public collectValueCompletions = async (
+ resource: string,
+ location: JSONPath,
+ currentKey: string,
+ result: CompletionsCollector
+ ): Promise => {
+ if (
+ !EntityIdCompletionContribution.propertyMatches.some(
+ (x) => x === currentKey
+ )
+ ) {
+ return;
}
-}
\ No newline at end of file
+
+ const entityIdCompletions = await this.haConnection.getEntityCompletions();
+ entityIdCompletions.forEach((c) => result.add(c));
+ };
+
+ public getInfoContribution(
+ resource: string,
+ location: JSONPath
+ ): Thenable {
+ return Promise.resolve([]);
+ }
+}
diff --git a/src/language-service/src/completionHelpers/services.ts b/src/language-service/src/completionHelpers/services.ts
index 137c6a3359..687002e0ab 100644
--- a/src/language-service/src/completionHelpers/services.ts
+++ b/src/language-service/src/completionHelpers/services.ts
@@ -1,46 +1,69 @@
-import { MarkedString } from 'vscode-languageserver-protocol';
-import { JSONWorkerContribution, JSONPath, CompletionsCollector, Thenable } from 'vscode-json-languageservice';
-import { IHaConnection } from '../home-assistant/haConnection';
+import { MarkedString } from "vscode-languageserver-protocol";
+import {
+ JSONWorkerContribution,
+ JSONPath,
+ CompletionsCollector,
+ Thenable,
+} from "vscode-json-languageservice";
+import { IHaConnection } from "../home-assistant/haConnection";
export class ServicesCompletionContribution implements JSONWorkerContribution {
+ public static propertyMatches: string[] = ["service"];
- public static propertyMatches: string[] = [
- "service"
- ];
+ constructor(private haConnection: IHaConnection) {}
- constructor(private haConnection: IHaConnection) {
- }
+ public collectDefaultCompletions(
+ resource: string,
+ result: CompletionsCollector
+ ): Thenable {
+ return Promise.reject();
+ }
- public collectDefaultCompletions(resource: string, result: CompletionsCollector): Thenable {
- return null;
+ public collectPropertyCompletions = async (
+ resource: string,
+ location: JSONPath,
+ currentWord: string,
+ addValue: boolean,
+ isLast: boolean,
+ result: CompletionsCollector
+ ): Promise => {
+ if (location.length < 2) {
+ return;
}
-
- public collectPropertyCompletions = async (resource: string, location: JSONPath, currentWord: string, addValue: boolean, isLast: boolean, result: CompletionsCollector): Promise => {
- if (location.length < 2) {
- return;
- }
- var currentNode = location[location.length - 1];
- var parentNode = location[location.length - 2]; // in case or arrays, currentNode is the indexer for the array position
- if (!ServicesCompletionContribution.propertyMatches.some(x => x === currentNode || x === parentNode)) {
- return null;
- }
- var servicesCompletions = await this.haConnection.getServiceCompletions();
- servicesCompletions.forEach(c => result.add(c));
-
- return null;
- }
-
- public collectValueCompletions = async (resource: string, location: JSONPath, currentKey: string, result: CompletionsCollector): Promise => {
- if (!ServicesCompletionContribution.propertyMatches.some(x => x === currentKey)) {
- return null;
- }
- var servicesCompletions = await this.haConnection.getServiceCompletions();
- servicesCompletions.forEach(c => result.add(c));
-
- return null;
+ const currentNode = location[location.length - 1];
+ const parentNode = location[location.length - 2]; // in case or arrays, currentNode is the indexer for the array position
+ if (
+ !ServicesCompletionContribution.propertyMatches.some(
+ (x) => x === currentNode || x === parentNode
+ )
+ ) {
+ return;
}
+ const servicesCompletions = await this.haConnection.getServiceCompletions();
+ servicesCompletions.forEach((c) => result.add(c));
+ };
- public getInfoContribution(resource: string, location: JSONPath): Thenable {
- return null;
+ public collectValueCompletions = async (
+ resource: string,
+ location: JSONPath,
+ currentKey: string,
+ result: CompletionsCollector
+ ): Promise => {
+ if (
+ !ServicesCompletionContribution.propertyMatches.some(
+ (x) => x === currentKey
+ )
+ ) {
+ return;
}
-}
\ No newline at end of file
+ const servicesCompletions = await this.haConnection.getServiceCompletions();
+ servicesCompletions.forEach((c) => result.add(c));
+ };
+
+ public getInfoContribution(
+ resource: string,
+ location: JSONPath
+ ): Thenable {
+ return Promise.resolve([]);
+ }
+}
diff --git a/src/language-service/src/configuration.ts b/src/language-service/src/configuration.ts
index 3c564d2450..b81e74ed27 100644
--- a/src/language-service/src/configuration.ts
+++ b/src/language-service/src/configuration.ts
@@ -1,58 +1,66 @@
import { DidChangeConfigurationParams } from "vscode-languageserver-protocol";
-import * as vscodeUri from 'vscode-uri';
+import * as vscodeUri from "vscode-uri";
export interface IConfigurationService {
- isConfigured: boolean;
- token?: string;
- url?: string;
- ignoreCertificates: boolean;
- updateConfiguration(config: DidChangeConfigurationParams): void;
+ isConfigured: boolean;
+ token?: string;
+ url?: string;
+ ignoreCertificates: boolean;
+ updateConfiguration(config: DidChangeConfigurationParams): void;
}
export interface HomeAssistantConfiguration {
- longLivedAccessToken?: string;
- hostUrl?: string;
- ignoreCertificates: boolean;
+ longLivedAccessToken?: string;
+ hostUrl?: string;
+ ignoreCertificates: boolean;
}
export class ConfigurationService implements IConfigurationService {
- public isConfigured: boolean = false;
- public token?: string;
- public url?: string;
- public ignoreCertificates: boolean = false;
-
- constructor() {
- this.setConfigViaEnvironmentVariables();
-
- this.isConfigured = `${this.url}` !== "";
- }
+ public isConfigured = false;
+
+ public token?: string;
+
+ public url?: string;
+
+ public ignoreCertificates = false;
- public updateConfiguration = (config: DidChangeConfigurationParams): void => {
- var incoming = config.settings["vscode-home-assistant"];
+ constructor() {
+ this.setConfigViaEnvironmentVariables();
- this.token = incoming.longLivedAccessToken;
- this.url = this.getUri(incoming.hostUrl);
- this.ignoreCertificates = !!incoming.ignoreCertificates;
+ this.isConfigured = `${this.url}` !== "";
+ }
- this.setConfigViaEnvironmentVariables();
+ public updateConfiguration = (config: DidChangeConfigurationParams): void => {
+ const incoming = (
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
+ config.settings["vscode-home-assistant"]
+ );
- this.isConfigured = `${this.url}` !== "";
+ this.token = incoming.longLivedAccessToken;
+ if (incoming.hostUrl !== undefined) {
+ this.url = this.getUri(incoming.hostUrl);
}
+ this.ignoreCertificates = !!incoming.ignoreCertificates;
- private setConfigViaEnvironmentVariables() {
- if (!this.url && process.env.HASS_SERVER) {
- this.url = this.getUri(process.env.HASS_SERVER);
- }
- if (!this.token && process.env.HASS_TOKEN) {
- this.token = process.env.HASS_TOKEN;
- }
+ this.setConfigViaEnvironmentVariables();
+
+ this.isConfigured = `${this.url}` !== "";
+ };
+
+ private setConfigViaEnvironmentVariables() {
+ if (!this.url && process.env.HASS_SERVER) {
+ this.url = this.getUri(process.env.HASS_SERVER);
+ }
+ if (!this.token && process.env.HASS_TOKEN) {
+ this.token = process.env.HASS_TOKEN;
}
+ }
- private getUri =(value: string) : string =>{
- if (!value) {
- return "";
- }
- var uri = vscodeUri.URI.parse(value);
- return `${uri.scheme}://${uri.authority}${uri.path.replace(/\/$/, "")}`;
+ private getUri = (value: string): string => {
+ if (!value) {
+ return "";
}
+ const uri = vscodeUri.URI.parse(value);
+ return `${uri.scheme}://${uri.authority}${uri.path.replace(/\/$/, "")}`;
+ };
}
diff --git a/src/language-service/src/definition/definition.ts b/src/language-service/src/definition/definition.ts
index 1fd9ea9014..5ff6e1c91b 100644
--- a/src/language-service/src/definition/definition.ts
+++ b/src/language-service/src/definition/definition.ts
@@ -1,5 +1,5 @@
-import { Definition, DefinitionLink } from "vscode-languageserver-protocol";
+import { Definition } from "vscode-languageserver-protocol";
export interface DefinitionProvider {
- onDefinition(line: string, uri: string): Promise;
-}
\ No newline at end of file
+ onDefinition(line: string, uri: string): Promise;
+}
diff --git a/src/language-service/src/definition/includes.ts b/src/language-service/src/definition/includes.ts
index b501342bcb..7c81ed9da6 100644
--- a/src/language-service/src/definition/includes.ts
+++ b/src/language-service/src/definition/includes.ts
@@ -1,42 +1,58 @@
+import { Definition, Location } from "vscode-languageserver-protocol";
+import * as path from "path";
import { FileAccessor } from "../fileAccessor";
-import { Definition, DefinitionLink, Location } from "vscode-languageserver-protocol";
import { DefinitionProvider } from "./definition";
-import * as path from 'path';
export class IncludeDefinitionProvider implements DefinitionProvider {
+ constructor(private fileAccessor: FileAccessor) {}
- constructor(private fileAccessor: FileAccessor) {
+ public onDefinition = async (
+ line: string,
+ uri: string
+ // eslint-disable-next-line @typescript-eslint/require-await
+ ): Promise => {
+ const matches = /(.*)(!include([\S]*))([\s]*)*(.*)/.exec(line);
+ if (!matches || matches.length !== 6) {
+ return [];
}
-
- public onDefinition = async (line: string, uri: string): Promise => {
- let matches = /(.*)(!include([\S]*))([\s]*)*(.*)/.exec(line);
- if (!matches || matches.length !== 6) {
- return [];
- }
- let includeType = matches[2];
- let whatToInclude = `${matches[5]}`.trim();
- switch (includeType) {
- case "!include":
- let destination = this.fileAccessor.getRelativePathAsFileUri(uri, whatToInclude);
- return [Location.create(destination, {
- start: { line: 0, character: 0 },
- end: { line: 0, character: 0 }
- })];
- case "!include_dir_list":
- case "!include_dir_named":
- case "!include_dir_merge_list":
- case "!include_dir_merge_named":
- var files = this.fileAccessor.getFilesInFolderRelativeFromAsFileUri(whatToInclude, uri);
- files = files.filter(f => path.extname(f) === ".yaml");
- if (files.length === 0){
- console.warn(`There were no files found in folder '${whatToInclude}' referenced with '${includeType}' from '${uri}'`);
- }
- return files.map(f => Location.create(f, {
- start: { line: 0, character: 0 },
- end: { line: 0, character: 0 }
- }));
- default:
- return [];
+ const includeType = matches[2];
+ const whatToInclude = `${matches[5]}`.trim();
+ switch (includeType) {
+ case "!include":
+ // eslint-disable-next-line no-case-declarations
+ const destination = this.fileAccessor.getRelativePathAsFileUri(
+ uri,
+ whatToInclude
+ );
+ return [
+ Location.create(destination, {
+ start: { line: 0, character: 0 },
+ end: { line: 0, character: 0 },
+ }),
+ ];
+ case "!include_dir_list":
+ case "!include_dir_named":
+ case "!include_dir_merge_list":
+ case "!include_dir_merge_named":
+ // eslint-disable-next-line no-case-declarations
+ let files = this.fileAccessor.getFilesInFolderRelativeFromAsFileUri(
+ whatToInclude,
+ uri
+ );
+ files = files.filter((f) => path.extname(f) === ".yaml");
+ if (files.length === 0) {
+ console.warn(
+ `There were no files found in folder '${whatToInclude}' referenced with '${includeType}' from '${uri}'`
+ );
}
- };
+ return files.map((f) =>
+ Location.create(f, {
+ start: { line: 0, character: 0 },
+ end: { line: 0, character: 0 },
+ })
+ );
+ default:
+ return [];
+ }
+ };
}
diff --git a/src/language-service/src/definition/scripts.ts b/src/language-service/src/definition/scripts.ts
index aa29f0ba7f..0de0bd8c6f 100644
--- a/src/language-service/src/definition/scripts.ts
+++ b/src/language-service/src/definition/scripts.ts
@@ -1,27 +1,29 @@
-import { FileAccessor } from "../fileAccessor";
-import { Definition, DefinitionLink, Location } from "vscode-languageserver-protocol";
+import { Definition, Location } from "vscode-languageserver-protocol";
import { HomeAssistantConfiguration } from "../haConfig/haConfig";
import { DefinitionProvider } from "./definition";
export class ScriptDefinitionProvider implements DefinitionProvider {
+ constructor(private haConfig: HomeAssistantConfiguration) {}
- constructor(private haConfig: HomeAssistantConfiguration) {
+ public onDefinition = async (
+ line: string,
+ uri: string
+ ): Promise => {
+ const matches = /(.*)(script\.([\S]*))([\s]*)*(.*)/.exec(line);
+ if (!matches || matches.length !== 6) {
+ return [];
}
-
- public onDefinition = async (line: string, uri: string): Promise => {
- let matches = /(.*)(script\.([\S]*))([\s]*)*(.*)/.exec(line);
- if (!matches || matches.length !== 6) {
- return [];
- }
- let scripts = await this.haConfig.getScripts();
- var scriptName = matches[3].replace(":", ""); // might be possible in regex!?
- let ourScript = scripts[scriptName];
- if (!ourScript) {
- return [];
- }
- return [Location.create(ourScript.fileUri, {
- start: { line: ourScript.start[0], character: ourScript.start[1] },
- end: { line: ourScript.end[0], character: ourScript.end[1] }
- })];
+ const scripts = await this.haConfig.getScripts();
+ const scriptName = matches[3].replace(":", ""); // might be possible in regex!?
+ const ourScript = scripts[scriptName];
+ if (!ourScript) {
+ return [];
}
+ return [
+ Location.create(ourScript.fileUri, {
+ start: { line: ourScript.start[0], character: ourScript.start[1] },
+ end: { line: ourScript.end[0], character: ourScript.end[1] },
+ }),
+ ];
+ };
}
diff --git a/src/language-service/src/fileAccessor.ts b/src/language-service/src/fileAccessor.ts
index 0098e3958a..141f2e9928 100644
--- a/src/language-service/src/fileAccessor.ts
+++ b/src/language-service/src/fileAccessor.ts
@@ -1,9 +1,15 @@
export interface FileAccessor {
- getFileContents(fileName: string): Promise;
- getFilesInFolder(subFolder: string): string[];
- getFilesInFolderRelativeFrom(subFolder: string, relativeFrom: string): string[];
- getFilesInFolderRelativeFromAsFileUri(subFolder: string, relativeFrom: string): string[];
- getRelativePath(relativeFrom: string, filename: string): string;
- getRelativePathAsFileUri(relativeFrom: string, filename: string): string;
- fromUriToLocalPath(uri: string): string;
-}
\ No newline at end of file
+ getFileContents(fileName: string): Promise;
+ getFilesInFolder(subFolder: string): string[];
+ getFilesInFolderRelativeFrom(
+ subFolder: string,
+ relativeFrom: string
+ ): string[];
+ getFilesInFolderRelativeFromAsFileUri(
+ subFolder: string,
+ relativeFrom: string
+ ): string[];
+ getRelativePath(relativeFrom: string, filename: string): string;
+ getRelativePathAsFileUri(relativeFrom: string, filename: string): string;
+ fromUriToLocalPath(uri: string): string;
+}
diff --git a/src/language-service/src/haConfig/dto.ts b/src/language-service/src/haConfig/dto.ts
index 9ae2ace024..eaf4fe4f8f 100644
--- a/src/language-service/src/haConfig/dto.ts
+++ b/src/language-service/src/haConfig/dto.ts
@@ -1,36 +1,37 @@
export interface HaFileInfo {
- filename: string;
- path: string;
+ filename: string;
+ path: string;
}
export interface IncludeReferences {
- [filename: string]: {
- path: string;
- includeType: Includetype;
- start: number;
- end: number;
- };
-}export interface ScriptReferences {
- [scriptFilename: string]: {
- fileUri: string;
- start: [number, number];
- end: [number, number];
- };
+ [filename: string]: {
+ path: string;
+ includeType: Includetype;
+ start: number;
+ end: number;
+ };
+}
+export interface ScriptReferences {
+ [scriptFilename: string]: {
+ fileUri: string;
+ start: [number, number];
+ end: [number, number];
+ };
}
export enum Includetype {
- include,
- include_dir_list,
- include_dir_named,
- include_dir_merge_list,
- include_dir_merge_named
+ include,
+ include_dir_list,
+ include_dir_named,
+ include_dir_merge_list,
+ include_dir_merge_named,
}
export interface YamlIncludePlaceholder {
- isInclude: boolean;
- fromFile: string;
- includeType: Includetype;
- toFileOrFolder: string;
- start: number;
- end: number;
-}
\ No newline at end of file
+ isInclude: boolean;
+ fromFile: string;
+ includeType: Includetype;
+ toFileOrFolder: string;
+ start: number;
+ end: number;
+}
diff --git a/src/language-service/src/haConfig/haConfig.ts b/src/language-service/src/haConfig/haConfig.ts
index 2275bd1d21..af4b52907f 100644
--- a/src/language-service/src/haConfig/haConfig.ts
+++ b/src/language-service/src/haConfig/haConfig.ts
@@ -1,165 +1,205 @@
import * as path from "path";
import { FileAccessor } from "../fileAccessor";
import { HomeAssistantYamlFile } from "./haYamlFile";
-import { IncludeReferences, ScriptReferences, HaFileInfo } from "./dto";
-import { IConfigurationService } from "../configuration";
+import { ScriptReferences, HaFileInfo, IncludeReferences } from "./dto";
export class HomeAssistantConfiguration {
-
private files: FilesCollection;
- private subFolder: string = "";
- public constructor(private fileAccessor: FileAccessor, private configurationService: IConfigurationService) {
+ private subFolder = "";
+
+ public constructor(private fileAccessor: FileAccessor) {
this.files = {};
}
- public getAllFiles = async (): Promise => {
- let allFiles: HaFileInfo[] = [];
-
- for (var filename in this.files) {
+ public getAllFiles = (): HaFileInfo[] => {
+ const allFiles: HaFileInfo[] = [];
+ for (const [filename, yamlFile] of Object.entries(this.files)) {
allFiles.push({
- filename: filename,
- path: this.files[filename].path
+ filename,
+ path: yamlFile.path,
});
}
return allFiles;
- }
+ };
public updateFile = async (uri: string): Promise => {
- let filename = this.fileAccessor.fromUriToLocalPath(uri);
+ const filename = this.fileAccessor.fromUriToLocalPath(uri);
let ourFile = this.files[filename];
if (!ourFile) {
return {
isValidYaml: true,
- newFilesFound: true
+ newFilesFound: true,
};
}
- var homeAssistantYamlFile = new HomeAssistantYamlFile(this.fileAccessor, filename, ourFile.path);
+ const homeAssistantYamlFile = new HomeAssistantYamlFile(
+ this.fileAccessor,
+ filename,
+ ourFile.path
+ );
this.files[filename] = homeAssistantYamlFile;
- var validationResult = await homeAssistantYamlFile.isValid();
+ const validationResult = await homeAssistantYamlFile.isValid();
if (!validationResult.isValid) {
return {
isValidYaml: false,
- newFilesFound: false
+ newFilesFound: false,
};
}
- let files = await this.discoverCore(filename, ourFile.path, {});
- ourFile = files[filename];
- this.files[filename] = ourFile;
-
- for (let filename in files) {
- if (!this.files[filename]) {
- return {
- isValidYaml: true,
- newFilesFound: true
- };
+ const files = await this.discoverCore(filename, ourFile.path, {});
+ if (files !== undefined) {
+ ourFile = files[filename];
+ this.files[filename] = ourFile;
+
+ for (const file in files) {
+ if (!this.files[file]) {
+ return {
+ isValidYaml: true,
+ newFilesFound: true,
+ };
+ }
}
}
+
return {
isValidYaml: true,
- newFilesFound: false
+ newFilesFound: false,
};
- }
+ };
public getIncludes = async (): Promise => {
- var allIncludes = {};
- for (var filename in this.files) {
- var includes = await this.files[filename].getIncludes();
- allIncludes = { ...allIncludes, ...includes };
+ let results = [];
+ for (const file of Object.values(this.files)) {
+ results.push(file.getIncludes());
+ }
+ results = await Promise.all(results);
+
+ let allIncludes = {};
+ for (const result of results) {
+ allIncludes = { ...allIncludes, ...result };
}
return allIncludes;
- }
+ };
public getScripts = async (): Promise => {
- var allScripts = {};
- for (var filename in this.files) {
- var scripts = await this.files[filename].getScripts();
- allScripts = { ...allScripts, ...scripts };
+ let results = [];
+ for (const filename of Object.keys(this.files)) {
+ results.push(this.files[filename].getScripts());
+ }
+ results = await Promise.all(results);
+
+ let allScripts = {};
+ for (const result of results) {
+ allScripts = { ...allScripts, ...result };
}
return allScripts;
- }
+ };
private getRootFiles = (): string[] => {
- var filesInRoot = this.fileAccessor.getFilesInFolder("");
- let ourFiles = ["configuration.yaml", "ui-lovelace.yaml"];
+ const filesInRoot = this.fileAccessor.getFilesInFolder("");
+ const ourFiles = ["configuration.yaml", "ui-lovelace.yaml"];
- let files = ourFiles.filter(f => filesInRoot.some(y => y === f));
+ const files = ourFiles.filter((f) => filesInRoot.some((y) => y === f));
if (files.length === 0) {
- let areOurFilesSomehwere = filesInRoot.filter(f => ourFiles.some(ourFile => f.endsWith(ourFile)));
+ const areOurFilesSomehwere = filesInRoot.filter((f) =>
+ ourFiles.some((ourFile) => f.endsWith(ourFile))
+ );
if (areOurFilesSomehwere.length > 0) {
- this.subFolder = areOurFilesSomehwere[0].substr(0, areOurFilesSomehwere[0].lastIndexOf('/'));
+ this.subFolder = areOurFilesSomehwere[0].substr(
+ 0,
+ areOurFilesSomehwere[0].lastIndexOf("/")
+ );
return areOurFilesSomehwere;
}
}
- return files.map(x => path.join(this.subFolder, x));
- }
+ return files.map((x) => path.join(this.subFolder, x));
+ };
public discoverFiles = async (): Promise => {
- let rootFiles = this.getRootFiles();
- this.files = {};
- for (var index in rootFiles) {
- this.files = await this.discoverCore(rootFiles[index], rootFiles[index].substring(this.subFolder.length), this.files);
+ const rootFiles = this.getRootFiles();
+
+ let results = [];
+ for (const rootFile of rootFiles) {
+ results.push(
+ this.discoverCore(
+ rootFile,
+ rootFile.substring(this.subFolder.length),
+ this.files
+ )
+ );
}
- }
-
- private discoverCore = async (filename: string, path: string, files: FilesCollection): Promise => {
-
+ results = await Promise.all(results);
+ const result = results.pop();
+ if (result !== undefined) {
+ this.files = result;
+ }
+ };
+
+ private discoverCore = async (
+ filename: string,
+ // eslint-disable-next-line no-shadow
+ path: string,
+ files: FilesCollection
+ ): Promise => {
if (path.startsWith("/")) {
path = path.substring(1);
}
- var homeAssistantYamlFile = new HomeAssistantYamlFile(this.fileAccessor, filename, path);
+ const homeAssistantYamlFile = new HomeAssistantYamlFile(
+ this.fileAccessor,
+ filename,
+ path
+ );
files[filename] = homeAssistantYamlFile;
let error = false;
- var errorMessage = `File '${filename}' could not be parsed, it was referenced from path '${path}'.This file will be ignored.`;
+ let errorMessage = `File '${filename}' could not be parsed, it was referenced from path '${path}'.This file will be ignored.`;
+ let includes: IncludeReferences = {};
try {
- var includes = await homeAssistantYamlFile.getIncludes();
- }
- catch (err) {
+ includes = await homeAssistantYamlFile.getIncludes();
+ } catch (err) {
error = true;
errorMessage += ` Error message: ${err}`;
}
-
- var validationResult = await homeAssistantYamlFile.isValid();
+ const validationResult = await homeAssistantYamlFile.isValid();
if (!validationResult.isValid) {
error = true;
if (validationResult.errors && validationResult.errors.length > 0) {
errorMessage += " Error(s): ";
- validationResult.errors.forEach(e => errorMessage += `\r\n - ${e}`);
+ // eslint-disable-next-line no-return-assign
+ validationResult.errors.forEach((e) => (errorMessage += `\r\n - ${e}`));
}
}
if (validationResult.warnings && validationResult.warnings.length > 0) {
// validationResult.warnings.forEach(w => console.debug(`Warning parsing file ${filename}: ${w}`));
}
+
if (error) {
if (filename === path) {
// root file has more impact
console.warn(errorMessage);
- }
- else {
+ } else {
console.log(errorMessage);
}
return files;
}
- for (var filenameKey in includes) {
- if (Object.keys(files).some(x => x === filenameKey)) {
+ const results = [];
+ for (const [filenameKey, include] of Object.entries(includes)) {
+ if (Object.keys(files).some((x) => x === filenameKey)) {
/// we already know this file
continue;
}
- var currentPath = `${includes[filenameKey].path}`;
-
- files = await this.discoverCore(filenameKey, currentPath, files);
+ results.push(this.discoverCore(filenameKey, include.path, files));
}
- return files;
- }
+ const fileCollections: FilesCollection[] = await Promise.all(results);
+ return fileCollections[fileCollections.length - 1];
+ };
}
export interface FilesCollection {
@@ -168,4 +208,4 @@ export interface FilesCollection {
export interface FileUpdateResult {
isValidYaml: boolean;
newFilesFound: boolean;
-}
\ No newline at end of file
+}
diff --git a/src/language-service/src/haConfig/haYamlFile.ts b/src/language-service/src/haConfig/haYamlFile.ts
index 8238bc215f..c79943ccf1 100644
--- a/src/language-service/src/haConfig/haYamlFile.ts
+++ b/src/language-service/src/haConfig/haYamlFile.ts
@@ -1,30 +1,37 @@
import * as path from "path";
import * as YAML from "yaml";
-import * as sourceUtils from "yaml/dist/cst/source-utils";
+import { Schema, Node, Collection, Scalar } from "yaml/types";
+import { ParsedCST, CST } from "yaml/parse-cst";
+import { Type, LinePos } from "yaml/util";
+import * as vscodeUri from "vscode-uri";
import { FileAccessor } from "../fileAccessor";
import { IncludeReferences, Includetype, ScriptReferences } from "./dto";
-import * as vscodeUri from 'vscode-uri';
export class HomeAssistantYamlFile {
+ private cst: ParsedCST | undefined;
+
+ private yaml: YAML.Document | undefined;
- private cst: YAML.ParsedCST | undefined;
- private yaml: YAML.ast.Document | undefined;
private includes: IncludeReferences = {};
+
private scripts: ScriptReferences = {};
- constructor(private fileAccessor: FileAccessor, private filename: string, public path: string) { }
+ constructor(
+ private fileAccessor: FileAccessor,
+ private filename: string,
+ // eslint-disable-next-line no-shadow
+ public path: string
+ ) {}
private async parse(): Promise {
-
- var fileContents = await this.fileAccessor.getFileContents(this.filename);
+ const fileContents = await this.fileAccessor.getFileContents(this.filename);
if (!fileContents) {
return;
}
this.cst = YAML.parseCST(fileContents);
this.yaml = new YAML.Document({
- // @ts-ignore the typings of this library are not up to date
- customTags: this.getCustomTags()
+ customTags: this.getCustomTags(),
}).parse(this.cst[0]);
await this.parseAstRecursive(this.yaml.contents, this.path);
@@ -33,107 +40,132 @@ export class HomeAssistantYamlFile {
public isValid = async (): Promise => {
try {
await this.parse();
- }
- catch (e) {
+ } catch (error) {
return {
isValid: false,
- errors: [e]
+ errors: [String(error)],
};
}
if (!this.yaml) {
return {
isValid: true,
- warnings: ["Empty yaml"]
+ warnings: ["Empty YAML"],
};
}
if (this.yaml.errors && this.yaml.errors.length > 0) {
- var errors = this.yaml.errors.slice(0, 3).map(x => {
- //@ts-ignore
- let line = (x.source && x.source.rangeAsLinePos && x.source.rangeAsLinePos.start) ? ` (Line: ${x.source.rangeAsLinePos.start.line})` : "";
+ const errors = this.yaml.errors.slice(0, 3).map((x) => {
+ const line =
+ x.linePos && x.linePos.start
+ ? ` (Line: ${x.linePos.start.line})`
+ : "";
return `${x.name}: ${x.message}${line}`;
});
if (this.yaml.errors.length > 3) {
- errors.push(` - And ${this.yaml.errors.length - 3} more errors...`)
+ errors.push(` - And ${this.yaml.errors.length - 3} more errors...`);
}
return {
isValid: false,
- errors: errors
+ errors,
};
}
return {
- isValid: true
+ isValid: true,
};
- }
+ };
public getIncludes = async (): Promise => {
if (!this.yaml) {
await this.parse();
}
if (!this.yaml) {
- return;
+ return {};
}
return this.includes;
- }
+ };
public getScripts = async (): Promise => {
if (!this.yaml) {
await this.parse();
}
if (!this.yaml) {
- return;
+ return {};
}
return this.scripts;
- }
-
- private getCustomTags(): YAML.Tag[] {
+ };
+ private getCustomTags(): Schema.Tag[] {
return [
`secret`,
`${Includetype[Includetype.include]}`,
`${Includetype[Includetype.include_dir_list]}`,
`${Includetype[Includetype.include_dir_merge_list]}`,
`${Includetype[Includetype.include_dir_merge_named]}`,
- `${Includetype[Includetype.include_dir_named]}`
- //@ts-ignore
- ].map(x =>
- {
- tag: `!${x}`,
- resolve: (doc, cst) => Symbol.for(cst.strValue)
- });
+ `${Includetype[Includetype.include_dir_named]}`,
+ ].map(
+ (x) =>
+ {
+ tag: `!${x}`,
+ resolve: (_doc: any, cst: any) => Symbol.for(cst.strValue),
+ }
+ );
}
- private parseAstRecursive = async (node: YAML.ast.AstNode | null, currentPath: string): Promise => {
+ private parseAstRecursive = async (
+ node: Collection | Node | null,
+ currentPath: string
+ ): Promise => {
if (!node) {
// null object like 'frontend:'
return;
}
switch (node.type) {
- case "MAP":
- case "FLOW_SEQ":
- case "SEQ":
- if (node.type !== "FLOW_SEQ" && (currentPath === "configuration.yaml/script" || currentPath === "configuration.yaml/homeassistant/packages/script")) {
- this.collectScripts(node);
- }
- for (let i in node.items) {
- var item = node.items[i];
- switch (item.type) {
- case "PAIR":
- await this.parseAstRecursive(item.value, `${currentPath}/${this.getKeyName(item.key)}`);
- break;
- case "SEQ":
- case "MAP":
- case "BLOCK_FOLDED":
- case "BLOCK_LITERAL":
- case "PLAIN":
- case "QUOTE_DOUBLE":
- case "QUOTE_SINGLE":
- case "FLOW_SEQ":
- await this.parseAstRecursive(item, currentPath);
- break;
- default:
- console.log(`huh ${currentPath}`);
- break;
+ case Type.FLOW_SEQ:
+ case Type.MAP:
+ case Type.SEQ:
+ if (node instanceof Collection) {
+ if (
+ node.type !== Type.FLOW_SEQ &&
+ (currentPath === "configuration.yaml/script" ||
+ currentPath ===
+ "configuration.yaml/homeassistant/packages/script")
+ ) {
+ this.collectScripts(node);
+ break;
+ }
+ const results = [];
+ for (const item of node.items) {
+ if (item == null) {
+ // This can happen if the list contains 1 item without a value, e.g.:
+ // entity_id:
+ // -
+ continue;
+ }
+
+ switch (item.type) {
+ case "PAIR":
+ results.push(
+ this.parseAstRecursive(
+ item.value,
+ `${currentPath}/${this.getKeyName(item.key)}`
+ )
+ );
+ break;
+ case Type.BLOCK_FOLDED:
+ case Type.BLOCK_LITERAL:
+ case Type.FLOW_SEQ:
+ case Type.MAP:
+ case Type.PLAIN:
+ case Type.QUOTE_DOUBLE:
+ case Type.QUOTE_SINGLE:
+ case Type.SEQ:
+ results.push(this.parseAstRecursive(item, currentPath));
+ break;
+ default:
+ console.log(`huh ${currentPath}`);
+ break;
+ }
}
+ await Promise.all(results);
}
break;
case "BLOCK_FOLDED":
@@ -141,25 +173,24 @@ export class HomeAssistantYamlFile {
case "PLAIN":
case "QUOTE_DOUBLE":
case "QUOTE_SINGLE":
- if (node.tag) {
- await this.collectInclude(node, currentPath);
+ if (node instanceof Scalar && node.tag) {
+ this.collectInclude(node, currentPath);
}
break;
}
- }
+ };
- private getKeyName = (node: YAML.ast.AstNode): string => {
- if (node.tag && node.type === "PLAIN") {
+ private getKeyName = (node: Scalar): string => {
+ if (node.tag && node.type === Type.PLAIN) {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
return node.value.toString().slice(7, -1);
}
- else {
- return node.toJSON();
- }
- }
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ return node.toJSON();
+ };
private getIncludeType = (str: string): Includetype | null => {
-
- var includeType: Includetype;
+ let includeType: Includetype;
switch (str) {
case `${Includetype[Includetype.include]}`:
includeType = Includetype.include;
@@ -180,69 +211,164 @@ export class HomeAssistantYamlFile {
return null;
}
return includeType;
- }
+ };
- private async collectInclude(x: YAML.ast.ScalarNode, currentPath: string) {
- var value: null | boolean | number | string = "";
- var includeType = this.getIncludeType(`${x.tag}`.slice(1).toLowerCase());
+ private collectInclude(x: Scalar, currentPath: string) {
+ let value: null | boolean | number | string = "";
+ const includeType = this.getIncludeType(`${x.tag}`.slice(1).toLowerCase());
if (includeType === null) {
// secrets and other tags
return;
}
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
value = x.value.toString().slice(7, -1).replace(/\\/g, "/"); // \ to / on windows
let files: string[] = [];
if (includeType === Includetype.include) {
- var relativeFilePath = this.fileAccessor.getRelativePath(this.filename, value);
+ const relativeFilePath = this.fileAccessor.getRelativePath(
+ this.filename,
+ String(value)
+ );
// single file include
files.push(relativeFilePath);
- }
- else {
+ } else {
// multiple file include
- var filesInThisFolder = await this.fileAccessor.getFilesInFolderRelativeFrom(value, this.filename);
- files = filesInThisFolder.filter(f => path.extname(f) === ".yaml");
+ const filesInThisFolder = this.fileAccessor.getFilesInFolderRelativeFrom(
+ String(value),
+ this.filename
+ );
+ files = filesInThisFolder.filter((f) => path.extname(f) === ".yaml");
}
if (files.length === 0) {
- console.log(`The include could not be resolved because no file(s) found in '${value}' included with '${Includetype[includeType]}' from '${this.filename}'`);
+ console.log(
+ `The include could not be resolved because no file(s) found in '${value}' included with '${Includetype[includeType]}' from '${this.filename}'`
+ );
}
- for (var i in files) {
- var key = files[i].replace(/\\/g, "/");
+ for (const file of files) {
+ const key = file.replace(/\\/g, "/");
this.includes[key] = {
path: currentPath,
- includeType: includeType,
+ includeType,
start: x.range[0],
- end: x.range[1]
+ end: x.range[1],
};
}
}
- private collectScripts(node: YAML.ast.Map | YAML.ast.Seq) {
- for (var i in node.items) {
- var item = node.items[i];
- //@ts-ignore
- let isNamed = item.value && item.value.type === "MAP";
-
- let filepath = vscodeUri.URI.file(path.resolve(this.filename)).fsPath;
- let filename = path.parse(filepath).base.replace(".yaml", "");
+ private collectScripts(node: Collection) {
+ for (const item of node.items) {
+ // @ts-ignore
+ const isNamed = item.value && item.value.type === Type.MAP;
+
+ const filepath = vscodeUri.URI.file(path.resolve(this.filename)).fsPath;
+ const filename = path.parse(filepath).base.replace(".yaml", "");
- //@ts-ignore
- var key = isNamed ? item.key.toJSON() : filename;
+ // @ts-ignore
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
+ const key = isNamed ? item.key.toJSON() : filename;
if (item.type === "PAIR") {
- var lp = sourceUtils.getLinePos(item.key.range[0], this.cst);
- var lp2 = sourceUtils.getLinePos(item.value.range[1], this.cst);
-
- this.scripts[key] = {
- fileUri: vscodeUri.URI.file(filepath).toString(),
- start: [lp.line - 1, lp.col - 1],
- end: [lp2.line - 1, lp2.col - 1]
- };
+ const lp = this.getLinePos(item.key.range[0], this.cst);
+ const lp2 = this.getLinePos(item.value.range[1], this.cst);
+
+ if (lp !== null && lp2 !== null) {
+ this.scripts[key] = {
+ fileUri: vscodeUri.URI.file(filepath).toString(),
+ start: [lp.line - 1, lp.col - 1],
+ end: [lp2.line - 1, lp2.col - 1],
+ };
+ }
+ }
+ }
+ }
+
+ /**
+ * This function is copied from the YAML library, as it is not exposed.
+ *
+ * @source https://github.com/eemeli/yaml/blob/master/src/cst/source-utils.js
+ */
+ private findLineStarts(src: string): number[] {
+ const ls = [0];
+ let offset = src.indexOf("\n");
+ while (offset !== -1) {
+ offset += 1;
+ ls.push(offset);
+ offset = src.indexOf("\n", offset);
+ }
+ return ls;
+ }
+
+ /**
+ * Get YAML source information.
+ *
+ * This function is copied from the YAML library, as it is not exposed.
+ *
+ * @source https://github.com/eemeli/yaml/blob/master/src/cst/source-utils.js
+ */
+ private getSrcInfo(cst: string | ParsedCST | CST.Document | CST.Document[]) {
+ let lineStarts;
+ let src;
+ if (typeof cst === "string") {
+ lineStarts = this.findLineStarts(cst);
+ src = cst;
+ } else {
+ if (Array.isArray(cst)) {
+ cst = cst[0];
+ }
+
+ if (cst && cst.context) {
+ lineStarts = this.findLineStarts(cst.context.src);
+ src = cst.context.src;
}
}
+ return { lineStarts, src };
+ }
+
+ /**
+ * Determine the line/col position matching a character offset.
+ *
+ * Accepts a source string or a CST document as the second parameter. With
+ * the latter, starting indices for lines are cached in the document as
+ * `lineStarts: number[]`.
+ *
+ * Returns a one-indexed `{ line, col }` location if found, or
+ * `undefined` otherwise.
+ *
+ * This function is copied from the YAML library, as it is not exposed.
+ *
+ * @source https://github.com/eemeli/yaml/blob/master/src/cst/source-utils.js
+ */
+ private getLinePos(
+ offset: number,
+ cst: string | ParsedCST | undefined
+ ): LinePos | null {
+ if (typeof offset !== "number" || offset < 0) {
+ return null;
+ }
+
+ if (cst === undefined) {
+ return null;
+ }
+
+ const { lineStarts, src } = this.getSrcInfo(cst);
+ if (!lineStarts || !src || offset > src.length) {
+ return null;
+ }
+
+ // eslint-disable-next-line no-plusplus
+ for (let i = 0; i < lineStarts.length; ++i) {
+ const start = lineStarts[i];
+ if (offset < start) {
+ return { line: i, col: offset - lineStarts[i - 1] + 1 };
+ }
+ if (offset === start) return { line: i + 1, col: 1 };
+ }
+ const line = lineStarts.length;
+ return { line, col: offset - lineStarts[line - 1] + 1 };
}
}
@@ -250,4 +376,4 @@ export interface ValidationResults {
isValid: boolean;
errors?: string[];
warnings?: string[];
-}
\ No newline at end of file
+}
diff --git a/src/language-service/src/haLanguageService.ts b/src/language-service/src/haLanguageService.ts
index 97d031be58..f245793ddc 100644
--- a/src/language-service/src/haLanguageService.ts
+++ b/src/language-service/src/haLanguageService.ts
@@ -1,251 +1,335 @@
-import { CompletionList, TextDocumentChangeEvent, TextDocument, Position, CompletionItem, TextEdit, Definition, DefinitionLink, TextDocumentPositionParams, Diagnostic, Hover, FormattingOptions } from "vscode-languageserver-protocol";
+import {
+ CompletionList,
+ TextDocumentChangeEvent,
+ TextDocument,
+ Position,
+ CompletionItem,
+ TextEdit,
+ Definition,
+ DefinitionLink,
+ Diagnostic,
+ Hover,
+ FormattingOptions,
+ SymbolInformation,
+} from "vscode-languageserver-protocol";
+import { getLineOffsets } from "yaml-language-server/out/server/src/languageservice/utils/arrUtils";
+import {
+ LanguageService,
+ LanguageSettings,
+} from "yaml-language-server/out/server/src/languageservice/yamlLanguageService";
import { SchemaServiceForIncludes } from "./schemas/schemaService";
import { EntityIdCompletionContribution } from "./completionHelpers/entityIds";
-import { getLineOffsets } from "yaml-language-server/out/server/src/languageservice/utils/arrUtils";
import { HaConnection } from "./home-assistant/haConnection";
import { ServicesCompletionContribution } from "./completionHelpers/services";
import { DefinitionProvider } from "./definition/definition";
import { HomeAssistantConfiguration } from "./haConfig/haConfig";
-import { LanguageService, LanguageSettings } from "yaml-language-server/out/server/src/languageservice/yamlLanguageService";
import { Includetype } from "./haConfig/dto";
-
export class HomeAssistantLanguageService {
-
- constructor(
- private yamlLanguageService: LanguageService,
- private haConfig: HomeAssistantConfiguration,
- private haConnection: HaConnection,
- private definitionProviders: DefinitionProvider[],
- private schemaServiceForIncludes: SchemaServiceForIncludes,
- private sendDiagnostics: (fileUri: string, diagnostics: Diagnostic[]) => Promise,
- private diagnoseAllFiles: () => Promise
- ) { }
-
- public findAndApplySchemas = async () => {
-
- try {
- var haFiles = await this.haConfig.getAllFiles();
- if (haFiles && haFiles.length > 0) {
- console.log(`Applying schema's to ${haFiles.length} of your configuration files...`);
- }
-
- this.yamlLanguageService.configure({
- validate: true,
- customTags: this.getValidYamlTags(),
- completion: true,
- format: true,
- hover: true,
- isKubernetes: false,
- schemas: this.schemaServiceForIncludes.getSchemaContributions(haFiles)
- });
-
- this.diagnoseAllFiles();
- }
- catch (err) {
- console.error(`Unexpected error updating the schema's, message: ${err}`, err);
- }
- console.log(`Schema's updated!`);
- }
-
- private getValidYamlTags(): string[] {
- var validTags: string[] = [];
- for (let item in Includetype) {
- if (isNaN(Number(item))) {
- validTags.push(`!${item} scalar`);
- }
- }
- validTags.push("!secret scalar");
- validTags.push("!env_var scalar");
-
- return validTags;
+ constructor(
+ private yamlLanguageService: LanguageService,
+ private haConfig: HomeAssistantConfiguration,
+ private haConnection: HaConnection,
+ private definitionProviders: DefinitionProvider[],
+ private schemaServiceForIncludes: SchemaServiceForIncludes,
+ private sendDiagnostics: (
+ fileUri: string,
+ diagnostics: Diagnostic[]
+ ) => void,
+ private diagnoseAllFiles: () => void
+ ) {}
+
+ public findAndApplySchemas = (): void => {
+ try {
+ const haFiles = this.haConfig.getAllFiles();
+ if (haFiles && haFiles.length > 0) {
+ console.log(
+ `Applying schema's to ${haFiles.length} of your configuration files...`
+ );
+ }
+
+ this.yamlLanguageService.configure({
+ validate: true,
+ customTags: this.getValidYamlTags(),
+ completion: true,
+ format: true,
+ hover: true,
+ isKubernetes: false,
+ schemas: this.schemaServiceForIncludes.getSchemaContributions(haFiles),
+ });
+
+ this.diagnoseAllFiles();
+ } catch (error) {
+ const message: string = error.message;
+ console.error(
+ `Unexpected error updating the schema's, message: ${message}`,
+ error
+ );
}
+ console.log(`Schema's updated!`);
+ };
+
+ private getValidYamlTags(): string[] {
+ const validTags: string[] = [];
+ for (const item in Includetype) {
+ if (Number.isNaN(Number(item))) {
+ validTags.push(`!${item} scalar`);
+ }
+ }
+ validTags.push("!secret scalar");
+ validTags.push("!env_var scalar");
- private onDocumentChangeDebounce: NodeJS.Timer;
-
- public onDocumentChange = async (textDocumentChangeEvent: TextDocumentChangeEvent): Promise => {
-
- clearTimeout(this.onDocumentChangeDebounce);
-
- this.onDocumentChangeDebounce = setTimeout(async () => {
- var singleFileUpdate = await this.haConfig.updateFile(textDocumentChangeEvent.document.uri);
- if (singleFileUpdate.isValidYaml && singleFileUpdate.newFilesFound) {
- console.log(`Discover all configuration files because ${textDocumentChangeEvent.document.uri} got updated and new files were found...`);
- await this.haConfig.discoverFiles();
- await this.findAndApplySchemas();
- }
-
- var diagnostics = await this.getDiagnostics(textDocumentChangeEvent.document);
+ return validTags;
+ }
- this.sendDiagnostics(textDocumentChangeEvent.document.uri, diagnostics);
- }, 600);
+ private onDocumentChangeDebounce: NodeJS.Timer | undefined;
+ public onDocumentChange = (
+ textDocumentChangeEvent: TextDocumentChangeEvent
+ ): void => {
+ if (this.onDocumentChangeDebounce !== undefined) {
+ clearTimeout(this.onDocumentChangeDebounce);
}
- public onDocumentOpen = async (textDocumentChangeEvent: TextDocumentChangeEvent): Promise => {
- var diagnostics = await this.getDiagnostics(textDocumentChangeEvent.document);
-
- this.sendDiagnostics(textDocumentChangeEvent.document.uri, diagnostics);
+ this.onDocumentChangeDebounce = setTimeout(async (): Promise => {
+ const singleFileUpdate = await this.haConfig.updateFile(
+ textDocumentChangeEvent.document.uri
+ );
+ if (singleFileUpdate.isValidYaml && singleFileUpdate.newFilesFound) {
+ console.log(
+ `Discover all configuration files because ${textDocumentChangeEvent.document.uri} got updated and new files were found...`
+ );
+ await this.haConfig.discoverFiles();
+ this.findAndApplySchemas();
+ }
+
+ const diagnostics = await this.getDiagnostics(
+ textDocumentChangeEvent.document
+ );
+
+ this.sendDiagnostics(textDocumentChangeEvent.document.uri, diagnostics);
+ }, 600);
+ };
+
+ public onDocumentOpen = async (
+ textDocumentChangeEvent: TextDocumentChangeEvent
+ ): Promise => {
+ const diagnostics = await this.getDiagnostics(
+ textDocumentChangeEvent.document
+ );
+
+ this.sendDiagnostics(textDocumentChangeEvent.document.uri, diagnostics);
+ };
+
+ public getDiagnostics = async (
+ document: TextDocument
+ ): Promise => {
+ if (!document || document.getText().length === 0) {
+ return [];
}
+ const diagnosticResults = await this.yamlLanguageService.doValidation(
+ document,
+ false
+ );
- public getDiagnostics = async (document: TextDocument): Promise => {
-
- if (!document || document.getText().length === 0) {
- return;
- }
-
- var diagnosticResults = await this.yamlLanguageService.doValidation(document, false);
-
- if (!diagnosticResults) {
- return;
- }
- let diagnostics = [];
-
- for (let diagnosticItem in diagnosticResults) {
- diagnosticResults[diagnosticItem].severity = 1; //Convert all warnings to errors
- diagnostics.push(diagnosticResults[diagnosticItem]);
- }
-
- return diagnostics;
+ if (!diagnosticResults) {
+ return [];
}
-
- public onDocumentSymbol = (document: TextDocument) => {
-
- if (!document) {
- return;
- }
-
- return this.yamlLanguageService.findDocumentSymbols(document);
+ const diagnostics: Diagnostic[] = [];
+ for (const diagnosticItem of diagnosticResults) {
+ diagnosticItem.severity = 1; // Convert all warnings to errors
+ diagnostics.push(diagnosticItem);
}
- public onDocumentFormatting = (document: TextDocument, options: FormattingOptions): TextEdit[] => {
+ return diagnostics;
+ };
- if (!document) {
- return;
- }
+ public onDocumentSymbol = (document: TextDocument): SymbolInformation[] => {
+ if (!document) {
+ return [];
+ }
- // copied defaults from YAML Language Service
- let settings = {
- tabWidth: options.tabSize,
- singleQuote: false,
- bracketSpacing: true,
- proseWrap: 'preserve',
- printWidth: 80,
- enable: true
- };
+ return this.yamlLanguageService.findDocumentSymbols(document);
+ };
- return this.yamlLanguageService.doFormat(document, settings);
+ public onDocumentFormatting = (
+ document: TextDocument,
+ options: FormattingOptions
+ ): TextEdit[] => {
+ if (!document) {
+ return [];
}
- public onCompletion = async (textDocument: TextDocument, position: Position): Promise => {
-
- let result: CompletionList = {
- items: [],
- isIncomplete: false
- };
+ // copied defaults from YAML Language Service
+ const settings = {
+ tabWidth: options.tabSize,
+ singleQuote: false,
+ bracketSpacing: true,
+ proseWrap: "preserve",
+ printWidth: 80,
+ enable: true,
+ };
+
+ return this.yamlLanguageService.doFormat(document, settings);
+ };
+
+ public onCompletion = async (
+ textDocument: TextDocument,
+ position: Position
+ ): Promise => {
+ const result: CompletionList = {
+ items: [],
+ isIncomplete: false,
+ };
+
+ if (!textDocument) {
+ return Promise.resolve(result);
+ }
- if (!textDocument) {
- return Promise.resolve(result);
- }
+ const currentCompletions: CompletionList = await this.yamlLanguageService.doComplete(
+ textDocument,
+ position,
+ false
+ );
- var completions: CompletionList = await this.yamlLanguageService.doComplete(textDocument, position, false);
+ const additionalCompletions = await this.getServiceAndEntityCompletions(
+ textDocument,
+ position,
+ currentCompletions
+ );
- var additionalCompletions = await this.getServiceAndEntityCompletions(textDocument, position, completions);
- if (additionalCompletions.length > 0) {
- completions.items.push(...additionalCompletions);
- }
- return completions;
+ if (additionalCompletions.length === 0) {
+ return currentCompletions;
}
- public onCompletionResolve = async (completionItem): Promise => {
- return await this.yamlLanguageService.doResolve(completionItem);
+ return CompletionList.create(additionalCompletions, false);
+ };
+
+ public onCompletionResolve = async (
+ completionItem: CompletionItem
+ ): Promise => {
+ return this.yamlLanguageService.doResolve(completionItem);
+ };
+
+ public onHover = async (
+ document: TextDocument,
+ position: Position
+ ): Promise => {
+ if (!document) {
+ return null;
}
- public onHover = async (document: TextDocument, position: Position): Promise => {
-
- if (!document) {
- return;
- }
+ return this.yamlLanguageService.doHover(document, position);
+ };
- return await this.yamlLanguageService.doHover(document, position);
+ public onDefinition = async (
+ textDocument: TextDocument,
+ position: Position
+ ): Promise => {
+ if (!textDocument) {
+ return undefined;
}
-
- public onDefinition = async (textDocument: TextDocument, position: Position): Promise => {
-
- if (!textDocument) {
- return;
- }
- const lineOffsets: number[] = getLineOffsets(textDocument.getText());
- const start: number = lineOffsets[position.line];
- const end: number = lineOffsets[position.line + 1];
- let thisLine = textDocument.getText().substring(start, end);
-
- var definitions = [];
- for (var p in this.definitionProviders) {
- let provider = this.definitionProviders[p];
- var providerResults = await provider.onDefinition(thisLine, textDocument.uri);
- if (providerResults) {
- definitions = definitions.concat(providerResults);
- }
+ const lineOffsets: number[] = getLineOffsets(textDocument.getText());
+ const start: number = lineOffsets[position.line];
+ const end: number = lineOffsets[position.line + 1];
+ const thisLine = textDocument.getText().substring(start, end);
+
+ let results = [];
+ for (const provider of this.definitionProviders) {
+ results.push(provider.onDefinition(thisLine, textDocument.uri));
+ }
+ results = await Promise.all(results);
+
+ let definitions: any = [];
+ for (const result of results) {
+ if (result) {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
+ definitions = definitions.concat(result);
+ }
+ }
+ // eslint-disable-next-line consistent-return, @typescript-eslint/no-unsafe-return
+ return definitions;
+ };
+
+ private getServiceAndEntityCompletions = async (
+ document: TextDocument,
+ textDocumentPosition: Position,
+ currentCompletions: CompletionList
+ ): Promise => {
+ // sadly this is needed here.
+ // the normal completion engine cannot provide completions for type `string | string[]`
+ // updating the type to only one of the 2 types will break the yaml-validation.
+ // so we tap in here, iterate over the lines of the text file to see if this if
+ // we need to add entity_id's to the completion list
+
+ const properties: { [provider: string]: string[] } = {};
+ properties.entities = EntityIdCompletionContribution.propertyMatches;
+ properties.services = ServicesCompletionContribution.propertyMatches;
+
+ const additionalCompletionProvider = this.findAutoCompletionProperty(
+ document,
+ textDocumentPosition,
+ properties
+ );
+ let additionalCompletion: CompletionItem[] = [];
+ switch (additionalCompletionProvider) {
+ case "entities":
+ // sometimes the entities are already added, do not add them twice
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ if (!currentCompletions.items.some((x) => x.data && x.data.isEntity)) {
+ additionalCompletion = await this.haConnection.getEntityCompletions();
}
- return definitions;
- }
-
- private getServiceAndEntityCompletions = async (document: TextDocument, textDocumentPosition: Position, currentCompletions: CompletionList): Promise => {
- // sadly this is needed here.
- // the normal completion engine cannot provide completions for type `string | string[]`
- // updating the type to only one of the 2 types will break the yaml-validation.
- // so we tap in here, iterate over the lines of the text file to see if this if
- // we need to add entity_id's to the completion list
-
- var properties: { [provider: string]: string[] } = {};
- properties["entities"] = EntityIdCompletionContribution.propertyMatches;
- properties["services"] = ServicesCompletionContribution.propertyMatches;
-
- var additionalCompletionProvider = this.findAutoCompletionProperty(document, textDocumentPosition, properties);
- let additionalCompletion: CompletionItem[] = [];
- switch (additionalCompletionProvider) {
- case "entities":
- // sometimes the entities are already added, do not add them twice
- if (!currentCompletions.items.some(x => x.data && x.data.isEntity)) {
- additionalCompletion = await this.haConnection.getEntityCompletions();
- }
- break;
- case "services":
- if (!currentCompletions.items.some(x => x.data && x.data.isService)) {
- additionalCompletion = await this.haConnection.getServiceCompletions();
- }
- break;
+ break;
+ case "services":
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ if (!currentCompletions.items.some((x) => x.data && x.data.isService)) {
+ additionalCompletion = await this.haConnection.getServiceCompletions();
}
- return additionalCompletion;
- }
-
- private findAutoCompletionProperty = (document: TextDocument, textDocumentPosition: Position, properties: { [provider: string]: string[] }): string => {
- let currentLine = textDocumentPosition.line;
- while (currentLine >= 0) {
- const lineOffsets: number[] = getLineOffsets(document.getText());
- const start: number = lineOffsets[currentLine];
- var end = 0;
- if (lineOffsets[currentLine + 1] !== undefined) {
- end = lineOffsets[currentLine + 1] -1;
- } else {
- end = document.getText().length;
- }
- let thisLine = document.getText().substring(start, end);
-
- let isOtherItemInList = thisLine.match(/-\s*([-"\w]+)?(\.)?([-"\w]+?)?\s*$/);
- if (isOtherItemInList) {
- currentLine--;
- continue;
- }
- for (var key in properties) {
- if (properties[key].some(propertyName => new RegExp(`(.*)${propertyName}(:)([\s]*)([\w]*)(\s*)`).test(thisLine))) {
- return key;
- }
- }
- return undefined;
+ break;
+ }
+ return additionalCompletion;
+ };
+
+ private findAutoCompletionProperty = (
+ document: TextDocument,
+ textDocumentPosition: Position,
+ properties: { [provider: string]: string[] }
+ ): string | null => {
+ let currentLine = textDocumentPosition.line;
+ while (currentLine >= 0) {
+ const lineOffsets: number[] = getLineOffsets(document.getText());
+ const start: number = lineOffsets[currentLine];
+ let end = 0;
+ if (lineOffsets[currentLine + 1] !== undefined) {
+ end = lineOffsets[currentLine + 1] - 1;
+ } else {
+ end = document.getText().length;
+ }
+ const thisLine = document.getText().substring(start, end);
+
+ // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec
+ const isOtherItemInList = thisLine.match(
+ /-\s*([-"\w]+)?(\.)?([-"\w]+?)?\s*$/
+ );
+ if (isOtherItemInList) {
+ currentLine -= 1;
+ continue;
+ }
+ for (const key in properties) {
+ if (
+ properties[key].some((propertyName) =>
+ // eslint-disable-next-line no-useless-escape
+ new RegExp(`(.*)${propertyName}(:)([\s]*)([\w]*)(\s*)`).test(
+ thisLine
+ )
+ )
+ ) {
+ return key;
}
- return undefined;
+ }
+ return null;
}
+ return null;
+ };
}
diff --git a/src/language-service/src/home-assistant/haConnection.ts b/src/language-service/src/home-assistant/haConnection.ts
index 4cd692c4ea..9507671d00 100644
--- a/src/language-service/src/home-assistant/haConnection.ts
+++ b/src/language-service/src/home-assistant/haConnection.ts
@@ -1,272 +1,296 @@
import * as ha from "home-assistant-js-websocket";
-import { CompletionItem, CompletionItemKind, MarkupContent } from 'vscode-languageserver-protocol';
+import {
+ CompletionItem,
+ CompletionItemKind,
+ MarkupContent,
+} from "vscode-languageserver-protocol";
import { IConfigurationService } from "../configuration";
import { createSocket } from "./socket";
-var rp = require('request-promise');
+
+// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-extraneous-dependencies
+const rp = require("request-promise");
export interface IHaConnection {
- tryConnect(): Promise;
- notifyConfigUpdate(conf: any);
- getEntityCompletions(): Promise;
- getServiceCompletions(): Promise;
+ tryConnect(): Promise;
+ notifyConfigUpdate(conf: any): Promise;
+ getEntityCompletions(): Promise;
+ getServiceCompletions(): Promise;
}
export class HaConnection implements IHaConnection {
+ private connection: ha.Connection | undefined;
- private connection: ha.Connection | undefined;
- private hassEntities!: Promise;
- private hassServices!: Promise;
-
- constructor(private configurationService: IConfigurationService) { }
-
- public tryConnect = async () => {
- await this.createConnection();
- }
-
- private async createConnection(): Promise {
-
- if (!this.configurationService.isConfigured) {
- return;
- }
-
- if (this.connection !== undefined) {
- return;
- }
-
- let auth = new ha.Auth({
- access_token: `${this.configurationService.token}`,
- expires: +new Date(new Date().getTime() + 1e11),
- hassUrl: `${this.configurationService.url}`,
- clientId: "",
- expires_in: +new Date(new Date().getTime() + 1e11),
- refresh_token: ""
- });
+ private hassEntities!: Promise;
- try {
- console.log("Connecting to Home Assistant...");
- this.connection = await ha.createConnection({
- auth: auth,
- createSocket: async () => createSocket(auth, this.configurationService.ignoreCertificates)
- });
- console.log("Connected to Home Assistant");
- }
- catch (error) {
- this.handleConnectionError(error);
- throw error;
- }
+ private hassServices!: Promise;
- this.connection.addEventListener("ready", () => {
- console.log("(re-)connected to Home Assistant");
- });
+ constructor(private configurationService: IConfigurationService) {}
- this.connection.addEventListener("disconnected", () => {
- console.warn("Lost connection with Home Assistant");
- });
+ public tryConnect = async (): Promise => {
+ await this.createConnection();
+ };
- this.connection.addEventListener("reconnect-error", (data) => {
- console.error("Reconnect error with Home Assistant", data);
- });
+ private async createConnection(): Promise {
+ if (!this.configurationService.isConfigured) {
+ return;
}
- private handleConnectionError = (error: any) => {
- this.connection = undefined;
- var tokenIndication = `${this.configurationService.token}`.substring(0, 5);
- var errorText = error;
- switch (error) {
- case 1:
- errorText = "ERR_CANNOT_CONNECT";
- break;
- case 2:
- errorText = "ERR_INVALID_AUTH";
- break;
- case 3:
- errorText = "ERR_CONNECTION_LOST";
- break;
- case 4:
- errorText = "ERR_HASS_HOST_REQUIRED";
- break;
- }
- let message = `Error connecting to your Home Assistant Server at ${this.configurationService.url} and token '${tokenIndication}...', check your network or update your VS Code Settings, make sure to (also) check your workspace settings! Error: ${errorText}`;
- console.error(message);
+ if (this.connection !== undefined) {
+ return;
}
- public notifyConfigUpdate = async (): Promise => {
- this.disconnect();
- try {
- await this.tryConnect();
- }
- catch (err) {
- // so be it, error is now displayed in logs
- }
+ const auth = new ha.Auth({
+ access_token: `${this.configurationService.token}`,
+ expires: +new Date(new Date().getTime() + 1e11),
+ hassUrl: `${this.configurationService.url}`,
+ clientId: "",
+ expires_in: +new Date(new Date().getTime() + 1e11),
+ refresh_token: "",
+ });
+
+ try {
+ console.log("Connecting to Home Assistant...");
+ this.connection = await ha.createConnection({
+ auth,
+ createSocket: async () =>
+ createSocket(auth, this.configurationService.ignoreCertificates),
+ });
+ console.log("Connected to Home Assistant");
+ } catch (error) {
+ this.handleConnectionError(error);
+ throw error;
}
- private getHassEntities = async (): Promise => {
- await this.createConnection();
-
- if (!this.hassEntities) {
- this.hassEntities = new Promise(async (resolve, reject) => {
- if (!this.connection) {
- return reject();
- }
- ha.subscribeEntities(this.connection, entities => {
- console.log(`Got ${Object.keys(entities).length} entities from Home Assistant`);
- return resolve(entities);
- });
- });
- }
- return await this.hassEntities;
+ this.connection.addEventListener("ready", () => {
+ console.log("(re-)connected to Home Assistant");
+ });
+
+ this.connection.addEventListener("disconnected", () => {
+ console.warn("Lost connection with Home Assistant");
+ });
+
+ this.connection.addEventListener("reconnect-error", (data) => {
+ console.error("Reconnect error with Home Assistant", data);
+ });
+ }
+
+ private handleConnectionError = (error: any) => {
+ this.connection = undefined;
+ const tokenIndication = `${this.configurationService.token}`.substring(
+ 0,
+ 5
+ );
+ let errorText = error;
+ switch (error) {
+ case 1:
+ errorText = "ERR_CANNOT_CONNECT";
+ break;
+ case 2:
+ errorText = "ERR_INVALID_AUTH";
+ break;
+ case 3:
+ errorText = "ERR_CONNECTION_LOST";
+ break;
+ case 4:
+ errorText = "ERR_HASS_HOST_REQUIRED";
+ break;
}
+ const message = `Error connecting to your Home Assistant Server at ${this.configurationService.url} and token '${tokenIndication}...', check your network or update your VS Code Settings, make sure to (also) check your workspace settings! Error: ${errorText}`;
+ console.error(message);
+ };
+
+ public notifyConfigUpdate = async (): Promise => {
+ this.disconnect();
+ try {
+ await this.tryConnect();
+ } catch (err) {
+ // so be it, error is now displayed in logs
+ }
+ };
- public async getEntityCompletions(): Promise {
-
- let entities = await this.getHassEntities();
-
- if (!entities) {
- return [];
- }
-
- let completions: CompletionItem[] = [];
-
- for (const [, value] of Object.entries(entities)) {
- let completionItem = CompletionItem.create(`${value.entity_id}`);
- completionItem.kind = CompletionItemKind.EnumMember;
- completionItem.filterText = `${value.entity_id}`;
- completionItem.insertText = completionItem.filterText;
- completionItem.data = {};
- completionItem.data.isEntity = true;
-
- completionItem.documentation = {
- kind: "markdown",
- value: `**${value.entity_id}** \r\n \r\n`
- };
-
- if (value.state) {
- completionItem.documentation.value += `State: ${value.state} \r\n \r\n`;
- }
- completionItem.documentation.value += `| Attribute | Value | \r\n`;
- completionItem.documentation.value += `| :---- | :---- | \r\n`;
-
- for (const [attrKey, attrValue] of Object.entries(value.attributes)) {
- completionItem.documentation.value += `| ${attrKey} | ${attrValue} | \r\n`;
- }
- completions.push(completionItem);
- }
- return completions;
+ private getHassEntities = async (): Promise => {
+ if (this.hassEntities !== undefined) {
+ return this.hassEntities;
}
- private getHassServices = async (): Promise => {
- await this.createConnection();
-
- if (!this.hassServices) {
- this.hassServices = new Promise(async (resolve, reject) => {
- if (!this.connection) {
- return reject();
- }
- ha.subscribeServices(this.connection, services => {
- console.log(`Got ${Object.keys(services).length} services from Home Assistant`);
- return resolve(services);
- });
- });
+ await this.createConnection();
+ this.hassEntities = new Promise(
+ // eslint-disable-next-line @typescript-eslint/require-await, no-async-promise-executor, consistent-return
+ async (resolve, reject) => {
+ if (!this.connection) {
+ return reject();
}
- return await this.hassServices;
- }
+ ha.subscribeEntities(this.connection, (entities) => {
+ console.log(
+ `Got ${Object.keys(entities).length} entities from Home Assistant`
+ );
+ return resolve(entities);
+ });
+ }
+ );
+ return this.hassEntities;
+ };
- public async getServiceCompletions(): Promise {
+ public async getEntityCompletions(): Promise {
+ const entities = await this.getHassEntities();
- let services = await this.getHassServices();
+ if (!entities) {
+ return [];
+ }
- if (!services) {
- return [];
+ const completions: CompletionItem[] = [];
+
+ for (const [, value] of Object.entries(entities)) {
+ const completionItem = CompletionItem.create(`${value.entity_id}`);
+ completionItem.detail = value.attributes.friendly_name;
+ completionItem.kind = CompletionItemKind.Variable;
+ completionItem.filterText = `${value.entity_id}`;
+ completionItem.insertText = completionItem.filterText;
+ completionItem.data = {};
+ completionItem.data.isEntity = true;
+
+ completionItem.documentation = {
+ kind: "markdown",
+ value: `**${value.entity_id}** \r\n \r\n`,
+ };
+
+ if (value.state) {
+ completionItem.documentation.value += `State: ${value.state} \r\n \r\n`;
+ }
+ completionItem.documentation.value += `| Attribute | Value | \r\n`;
+ completionItem.documentation.value += `| :---- | :---- | \r\n`;
+
+ for (const [attrKey, attrValue] of Object.entries(value.attributes)) {
+ completionItem.documentation.value += `| ${attrKey} | ${attrValue} | \r\n`;
+ }
+ completions.push(completionItem);
+ }
+ return completions;
+ }
+
+ private getHassServices = async (): Promise => {
+ await this.createConnection();
+
+ if (!this.hassServices) {
+ this.hassServices = new Promise(
+ // eslint-disable-next-line @typescript-eslint/require-await, no-async-promise-executor, consistent-return
+ async (resolve, reject) => {
+ if (!this.connection) {
+ return reject();
+ }
+ ha.subscribeServices(this.connection, (services) => {
+ console.log(
+ `Got ${Object.keys(services).length} services from Home Assistant`
+ );
+ return resolve(services);
+ });
}
+ );
+ }
+ return this.hassServices;
+ };
- let completions: CompletionItem[] = [];
-
- for (const [domainKey, domainValue] of Object.entries(services)) {
- for (const [serviceKey, serviceValue] of Object.entries(domainValue)) {
- let completionItem = CompletionItem.create(`${domainKey}.${serviceKey}`);
- completionItem.kind = CompletionItemKind.EnumMember;
- completionItem.filterText = `${domainKey}.${serviceKey}`;
- completionItem.insertText = completionItem.filterText;
- completionItem.data = {};
- completionItem.data.isService = true;
-
- var fields = Object.entries(serviceValue.fields);
-
- if (fields.length > 0) {
- completionItem.documentation = {
- kind: "markdown",
- value: `**${domainKey}.${serviceKey}:** \r\n \r\n`
- };
-
- completionItem.documentation.value += `| Field | Description | Example | \r\n`;
- completionItem.documentation.value += `| :---- | :---- | :---- | \r\n`;
-
- for (const [fieldKey, fieldValue] of fields) {
- completionItem.documentation.value += `| ${fieldKey} | ${fieldValue.description} | ${fieldValue.example} | \r\n`;
- }
- }
- completions.push(completionItem);
- }
- }
+ public async getServiceCompletions(): Promise {
+ const services = await this.getHassServices();
- return completions;
+ if (!services) {
+ return [];
}
- public disconnect() {
- if (!this.connection) {
- return;
+ const completions: CompletionItem[] = [];
+
+ for (const [domainKey, domainValue] of Object.entries(services)) {
+ for (const [serviceKey, serviceValue] of Object.entries(domainValue)) {
+ const completionItem = CompletionItem.create(
+ `${domainKey}.${serviceKey}`
+ );
+ completionItem.kind = CompletionItemKind.EnumMember;
+ completionItem.filterText = `${domainKey}.${serviceKey}`;
+ completionItem.insertText = completionItem.filterText;
+ completionItem.data = {};
+ completionItem.data.isService = true;
+
+ const fields = Object.entries(serviceValue.fields);
+
+ if (fields.length > 0) {
+ completionItem.documentation = {
+ kind: "markdown",
+ value: `**${domainKey}.${serviceKey}:** \r\n \r\n`,
+ };
+
+ completionItem.documentation.value += `| Field | Description | Example | \r\n`;
+ completionItem.documentation.value += `| :---- | :---- | :---- | \r\n`;
+
+ for (const [fieldKey, fieldValue] of fields) {
+ completionItem.documentation.value += `| ${fieldKey} | ${fieldValue.description} | ${fieldValue.example} | \r\n`;
+ }
}
- console.log(`Disconnecting from Home Assistant`);
- this.connection.close();
- this.connection = undefined;
+ completions.push(completionItem);
+ }
}
- public callApi = async (method: string, api: string): Promise => {
- const options = {
- method: method,
- url: `${this.configurationService.url}/api/${api}`,
- headers: {
- 'Authorization': `Bearer ${this.configurationService.token}`
- },
- json: true
- };
-
- function callback(error, response, body) {
- if (!error && response.statusCode === 200) {
- return body;
- }
- else {
- console.error('HA Api Call request failed!', error);
- }
- }
+ return completions;
+ }
- return await rp(options, callback);
+ public disconnect(): void {
+ if (!this.connection) {
+ return;
+ }
+ console.log(`Disconnecting from Home Assistant`);
+ this.connection.close();
+ this.connection = undefined;
+ }
+
+ public callApi = (method: string, api: string): string => {
+ const options = {
+ method,
+ url: `${this.configurationService.url}/api/${api}`,
+ headers: {
+ Authorization: `Bearer ${this.configurationService.token}`,
+ },
+ json: true,
+ };
+
+ function callback(error: any, response: any, body: any) {
+ if (!error && response.statusCode === 200) {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ return body;
+ }
+ console.error("HA Api Call request failed!", error);
+ return "";
}
- public async callService(domain: string, service: string, serviceData: any) {
- // over websockets (no response)
- //callService(this.connection, domain, service, serviceData);
-
- const options = {
- method: "POST",
- url: `${this.configurationService.url}/api/services/${domain}/${service}`,
- headers: {
- 'Authorization': `Bearer ${this.configurationService.token}`
- },
- body: serviceData,
- json: true
- };
-
- function callback(error, response, body) {
- if (!error && response.statusCode === 200) {
- console.log(`Service Call ${domain}.${service} made succesfully, response:`);
- console.log(body);
- }
- else {
- console.error(error);
- }
- }
-
- return await rp(options, callback);
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
+ return rp(options, callback);
+ };
+
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+ public callService(domain: string, service: string, serviceData: any): any {
+ // over websockets (no response)
+ // callService(this.connection, domain, service, serviceData);
+
+ const options = {
+ method: "POST",
+ url: `${this.configurationService.url}/api/services/${domain}/${service}`,
+ headers: {
+ Authorization: `Bearer ${this.configurationService.token}`,
+ },
+ body: serviceData,
+ json: true,
+ };
+
+ function callback(error: any, response: any, body: any) {
+ if (!error && response.statusCode === 200) {
+ console.log(
+ `Service Call ${domain}.${service} made succesfully, response:`
+ );
+ console.log(body);
+ } else {
+ console.error(error);
+ }
}
-}
\ No newline at end of file
+
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
+ return rp(options, callback);
+ }
+}
diff --git a/src/language-service/src/home-assistant/socket.ts b/src/language-service/src/home-assistant/socket.ts
index 3c6ff65d1e..e2cbaff6c9 100644
--- a/src/language-service/src/home-assistant/socket.ts
+++ b/src/language-service/src/home-assistant/socket.ts
@@ -6,138 +6,152 @@ https://github.com/home-assistant/home-assistant-js-websocket/blob/master/lib/so
*/
import * as ha from "home-assistant-js-websocket";
-import * as WebSocket from "ws";
+import WebSocket = require("ws");
const MSG_TYPE_AUTH_REQUIRED = "auth_required";
const MSG_TYPE_AUTH_INVALID = "auth_invalid";
const MSG_TYPE_AUTH_OK = "auth_ok";
const ERR_INVALID_AUTH = 2;
-export function createSocket(auth: ha.Auth, ignoreCertificates: boolean): Promise {
-
- // Convert from http:// -> ws://, https:// -> wss://
- const url = auth.wsUrl;
-
- console.log("[Auth phase] Initializing WebSocket connection to Home Assistant", url);
-
- function connect(
- triesLeft: number,
- promResolve: (socket: any) => void,
- promReject: (err: number) => void
- ) {
- console.log(`[Auth Phase] Connecting to Home Assistant... Tries left: ${triesLeft}`, url);
-
- const socket = new WebSocket(url, {
- rejectUnauthorized: !ignoreCertificates
- });
-
- // If invalid auth, we will not try to reconnect.
- let invalidAuth = false;
-
- const closeMessage = (ev: { wasClean: boolean; code: number; reason: string; target: WebSocket }) => {
- let errorMessage;
- if (ev && ev.code && ev.code !== 1000) {
- errorMessage = `WebSocket connection to Home Assistant closed with code ${ev.code} and reason ${ev.reason}`;
- }
- closeOrError(errorMessage);
- };
-
- const errorMessage = (ev: { error: any, message: any, type: string, target: WebSocket }) => {
- // If we are in error handler make sure close handler doesn't also fire.
- socket.removeEventListener("close", closeMessage);
- let errorMessage = "Disconnected from Home Assistant with a WebSocket error";
- if (ev.message) {
- errorMessage += ` with message: ${ev.message}`;
-
- }
- closeOrError(errorMessage);
- };
-
- const closeOrError = (errorText?: string) => {
-
- if (errorText) {
- console.log(`WebSocket Connection to Home Assistant closed with an error: ${errorText}`);
- }
- if (invalidAuth) {
- promReject(ha.ERR_INVALID_AUTH);
- return;
- }
-
- // Reject if we no longer have to retry
- if (triesLeft === 0) {
- // We never were connected and will not retry
- promReject(ha.ERR_CANNOT_CONNECT);
- return;
- }
-
- const newTries = triesLeft === -1 ? -1 : triesLeft - 1;
- // Try again in a second
- setTimeout(
- () =>
- connect(
- newTries,
- promResolve,
- promReject
- ),
- 1000
- );
- };
-
- // Auth is mandatory, so we can send the auth message right away.
- const handleOpen = async () => {
- try {
- if (auth.expired) {
- await auth.refreshAccessToken();
- }
- socket.send(JSON.stringify({
- type: "auth",
- access_token: auth.accessToken
- }));
- } catch (err) {
- // Refresh token failed
- invalidAuth = err === ERR_INVALID_AUTH;
- socket.close();
- }
- };
-
- const handleMessage = async (event: { data: any; type: string; target: WebSocket }) => {
- const message = JSON.parse(event.data);
-
- console.log(`[Auth phase] Received a message of type ${message.type}`, message);
-
- switch (message.type) {
- case MSG_TYPE_AUTH_INVALID:
- invalidAuth = true;
- socket.close();
- break;
-
- case MSG_TYPE_AUTH_OK:
- socket.removeEventListener("open", handleOpen);
- socket.removeEventListener("message", handleMessage);
- socket.removeEventListener("close", closeMessage);
- socket.removeEventListener("error", errorMessage);
- promResolve(socket);
- break;
-
- default:
- // We already send this message when socket opens
- if (message.type !== MSG_TYPE_AUTH_REQUIRED) {
- console.log("[Auth phase] Unhandled message", message);
- }
- }
- };
-
- socket.addEventListener("open", handleOpen);
- socket.addEventListener("message", handleMessage);
- socket.addEventListener("close", closeMessage);
- socket.addEventListener("error", errorMessage);
- }
-
- return new Promise((resolve, reject) =>
- connect(
- 3,
- resolve,
- reject
- )
+export function createSocket(
+ auth: ha.Auth,
+ ignoreCertificates: boolean
+): Promise {
+ // Convert from http:// -> ws://, https:// -> wss://
+ const url = auth.wsUrl;
+
+ console.log(
+ "[Auth phase] Initializing WebSocket connection to Home Assistant",
+ url
+ );
+
+ function connect(
+ triesLeft: number,
+ promResolve: (socket: any) => void,
+ promReject: (err: number) => void
+ ) {
+ console.log(
+ `[Auth Phase] Connecting to Home Assistant... Tries left: ${triesLeft}`,
+ url
);
+
+ const socket = new WebSocket(url, {
+ rejectUnauthorized: !ignoreCertificates,
+ });
+
+ // If invalid auth, we will not try to reconnect.
+ let invalidAuth = false;
+
+ const closeMessage = (ev: {
+ wasClean: boolean;
+ code: number;
+ reason: string;
+ target: WebSocket;
+ }) => {
+ let errorMessage;
+ if (ev && ev.code && ev.code !== 1000) {
+ errorMessage = `WebSocket connection to Home Assistant closed with code ${ev.code} and reason ${ev.reason}`;
+ }
+ closeOrError(errorMessage);
+ };
+
+ const errorMessage = (ev: {
+ error: any;
+ message: any;
+ type: string;
+ target: WebSocket;
+ }) => {
+ // If we are in error handler make sure close handler doesn't also fire.
+ socket.removeEventListener("close", closeMessage);
+ let errMessage =
+ "Disconnected from Home Assistant with a WebSocket error";
+ if (ev.message) {
+ errMessage += ` with message: ${ev.message}`;
+ }
+ closeOrError(errMessage);
+ };
+
+ const closeOrError = (errorText?: string) => {
+ if (errorText) {
+ console.log(
+ `WebSocket Connection to Home Assistant closed with an error: ${errorText}`
+ );
+ }
+ if (invalidAuth) {
+ promReject(ha.ERR_INVALID_AUTH);
+ return;
+ }
+
+ // Reject if we no longer have to retry
+ if (triesLeft === 0) {
+ // We never were connected and will not retry
+ promReject(ha.ERR_CANNOT_CONNECT);
+ return;
+ }
+
+ const newTries = triesLeft === -1 ? -1 : triesLeft - 1;
+ // Try again in a second
+ setTimeout(() => connect(newTries, promResolve, promReject), 1000);
+ };
+
+ // Auth is mandatory, so we can send the auth message right away.
+ const handleOpen = async (): Promise => {
+ try {
+ if (auth.expired) {
+ await auth.refreshAccessToken();
+ }
+ socket.send(
+ JSON.stringify({
+ type: "auth",
+ access_token: auth.accessToken,
+ })
+ );
+ } catch (err) {
+ // Refresh token failed
+ invalidAuth = err === ERR_INVALID_AUTH;
+ socket.close();
+ }
+ };
+
+ const handleMessage = (event: {
+ data: any;
+ type: string;
+ target: WebSocket;
+ }) => {
+ const message = JSON.parse(event.data);
+
+ console.log(
+ `[Auth phase] Received a message of type ${message.type}`,
+ message
+ );
+
+ switch (message.type) {
+ case MSG_TYPE_AUTH_INVALID:
+ invalidAuth = true;
+ socket.close();
+ break;
+
+ case MSG_TYPE_AUTH_OK:
+ socket.removeEventListener("open", handleOpen);
+ socket.removeEventListener("message", handleMessage);
+ socket.removeEventListener("close", closeMessage);
+ socket.removeEventListener("error", errorMessage);
+ promResolve(socket);
+ break;
+
+ default:
+ // We already send this message when socket opens
+ if (message.type !== MSG_TYPE_AUTH_REQUIRED) {
+ console.log("[Auth phase] Unhandled message", message);
+ }
+ }
+ };
+
+ socket.addEventListener("open", handleOpen);
+ socket.addEventListener("message", handleMessage);
+ socket.addEventListener("close", closeMessage);
+ socket.addEventListener("error", errorMessage);
+ }
+
+ return new Promise((resolve, reject) => connect(3, resolve, reject));
}
diff --git a/src/language-service/src/schemas/actions.ts b/src/language-service/src/schemas/actions.ts
new file mode 100644
index 0000000000..4fd5f7287a
--- /dev/null
+++ b/src/language-service/src/schemas/actions.ts
@@ -0,0 +1,193 @@
+/**
+ * Automation and script actions
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/helpers/config_validation.py
+ */
+import {
+ Entity,
+ EntityScene,
+ IncludeList,
+ Integer,
+ Template,
+ TimePeriod,
+} from "./types";
+import { Condition } from "./conditions";
+
+export type Action =
+ | DelayAction
+ | DeviceAction
+ | EventAction
+ | RepeatAction
+ | SceneAction
+ | ServiceAction
+ | WaitTemplateAction
+ | Condition; // A condition is a valid action
+
+export interface DelayAction {
+ /**
+ * Alias for the delay action.
+ */
+ alias?: string;
+
+ /**
+ * Delays are useful for temporarily suspending your script and start it at a later moment.
+ * The time period to delay the executing of the current action sequence for.
+ * https://www.home-assistant.io/docs/scripts/#delay
+ */
+ delay: TimePeriod | Template;
+}
+
+export interface DeviceAction {
+ /**
+ * The internal ID of the device to execute an action on.
+ * Device actions encompass a set of events that are defined by an integration.
+ * In contrast to service calls, device actions are tied to a device and not necessarily an entity. To use a device action, set up an automation through the browser frontend.
+ */
+ device_id: string;
+
+ /**
+ * The integration domain this device trigger is provided by.
+ */
+ domain: string;
+}
+
+export interface EventAction {
+ /**
+ * Alias for the Event action.
+ */
+ alias?: string;
+
+ /**
+ * The event name to fire.
+ * This action allows you to fire an event. Events can be used for many things. It could trigger an automation or indicate to another integration that something is happening.
+ * https://www.home-assistant.io/docs/scripts/#fire-an-event
+ */
+ event: string;
+
+ /**
+ * The event data to pass along.
+ * https://www.home-assistant.io/docs/scripts/#fire-an-event
+ */
+ event_data?: {
+ [key: string]: any;
+ };
+
+ /**
+ * The event data to pass along, using script template.
+ * https://www.home-assistant.io/docs/scripts/#fire-an-event
+ */
+ event_data_template?: {
+ [key: string]: any | Template;
+ };
+}
+
+export interface RepeatAction {
+ /**
+ * Alias for the repeat action.
+ */
+ alias?: string;
+
+ /**
+ * This action allows you to repeat a sequence of other actions.
+ * https://www.home-assistant.io/docs/scripts/#repeat-a-group-of-actions
+ */
+ repeat: {
+ /**
+ * This form accepts a count value. The value may be specified by a template, in which case the template is rendered when the repeat step is reached.
+ * https://www.home-assistant.io/docs/scripts/#counted-repeat
+ */
+ count?: Integer | Template;
+
+ /**
+ * The sequence of actions to be repeatedly performed in the script.
+ * https://www.home-assistant.io/integrations/script/#sequence
+ */
+ sequence: Action | Action[] | IncludeList;
+
+ /**
+ * This form accepts a list of conditions that are evaluated after each time the sequence is run. Therefore the sequence will always run at least once. The sequence will be executed until the condition(s) evaluate to true.
+ * https://www.home-assistant.io/docs/scripts/#repeat-until
+ */
+ until?: Condition | Condition[] | IncludeList;
+
+ /**
+ * This form accepts a list of conditions that are evaluated before each time the sequence is run. The sequence will be repeated as long as the condition(s) evaluate to true.
+ * https://www.home-assistant.io/docs/scripts/#while-loop
+ */
+ while?: Condition | Condition[] | IncludeList;
+ };
+}
+
+export interface SceneAction {
+ /**
+ * Activate a scene.
+ * https://www.home-assistant.io/docs/scripts/#activate-a-scene
+ */
+ scene: EntityScene;
+}
+
+export interface ServiceAction {
+ /**
+ * Service call alias.
+ * https://www.home-assistant.io/docs/scripts/service-calls/
+ */
+ alias?: string;
+
+ /**
+ * The most important action is the action to call a service.
+ * https://www.home-assistant.io/docs/scripts/service-calls/
+ */
+ service?: string;
+
+ /**
+ * Allow the service to call to be generated from a template.
+ * https://www.home-assistant.io/docs/scripts/service-calls/#use-templates-to-decide-which-service-to-call
+ */
+ service_template?: Template;
+
+ /**
+ * Specify other parameters beside the entity to target. For example, the light turn on service allows specifying the brightness.
+ * https://www.home-assistant.io/docs/scripts/service-calls/#passing-data-to-the-service-call
+ */
+ data?: {
+ [key: string]: any;
+ };
+
+ /**
+ * Specify other parameters based on templates.
+ * https://www.home-assistant.io/docs/scripts/service-calls/#use-templates-to-determine-the-attributes
+ */
+ data_template?: {
+ [key: string]: Template;
+ };
+
+ /**
+ * The entity (or entities) to execute this service call on.
+ * https://www.home-assistant.io/docs/scripts/service-calls
+ */
+ entity_id?: Entity | Entity[] | "all" | "none" | null;
+}
+
+export interface WaitTemplateAction {
+ /**
+ * Alias for the wait action.
+ */
+ alias?: string;
+
+ /**
+ * Wait until some things are complete.
+ * https://www.home-assistant.io/docs/scripts/#wait
+ */
+ wait_template: Template;
+
+ /**
+ * Set a timeout after which the script will continue its execution if the condition is not satisfied.
+ * https://www.home-assistant.io/docs/scripts/#wait
+ */
+ timeout?: TimePeriod;
+
+ /**
+ * Continue the execute of the action sequence on time out or not.
+ * https://www.home-assistant.io/docs/scripts/#wait
+ */
+ continue_on_timeout?: boolean;
+}
diff --git a/src/language-service/src/schemas/automation.ts b/src/language-service/src/schemas/automation.ts
deleted file mode 100644
index e5056c94d4..0000000000
--- a/src/language-service/src/schemas/automation.ts
+++ /dev/null
@@ -1,240 +0,0 @@
-export type Automations = Array;
-export type AutomationsFile = Automation | Array;
-
-export interface Automation {
- id?: string;
- alias?: string;
- description?: string;
- initial_state?: string | boolean;
- hide_entity?: boolean;
- trigger: Triggers | Array;
- condition?: null | ConditionsConfig;
- action: Actions | Array;
-}
-export type Actions = EventActionSchema | ServiceActionSchema | DelayActionSchema | ServiceActionTemplateSchema | WaitTemplateSchema | DeviceActionSchema;
-
-export interface HaTrigger {
- platform: "homeassistant";
- event: "start" | "shutdown";
-}
-export interface SunTrigger {
- platform: "sun";
- event: "sunset" | "sunrise";
- offset?: string;
-}
-export interface TimeTrigger {
- platform: "time";
- at: string;
-}
-export interface TemplateTrigger {
- platform: "template";
- value_template: string;
- for?: string | TimePeriod;
-}
-export interface WebhookTrigger {
- platform: "webhook";
- webhook_id: string;
-}
-export interface EventTrigger {
- platform: "event";
- event_type: string;
- event_data?: any;
-}
-export interface TimePatternTrigger {
- platform: "time_pattern";
- hours?: string;
- minutes?: string | number;
- seconds?: string | number;
-}
-export interface MqttTrigger {
- platform: "mqtt";
- topic: string;
- payload?: string;
- encoding?: string;
-}
-export interface GeoLocationTrigger {
- platform: "geo_location";
- source: string;
- zone: string;
- event: "enter" | "leave";
-}
-export interface StateTrigger {
- platform: "state";
- entity_id: string | string[];
- from?: string | boolean;
- to?: string | boolean;
- for?: string | TimePeriod;
-}
-export interface TimePeriod {
- days?: string | number;
- hours?: string | number;
- minutes?: string | number;
- seconds?: string | number;
- milliseconds?: string | number;
-}
-export interface ZoneTrigger {
- platform: "zone";
- entity_id: string | string[];
- zone: string;
- event: "enter" | "leave";
-}
-
-export interface NumericStateTrigger {
- platform: "numeric_state";
- entity_id: string | string[];
- below?: string | number;
- above?: string | number;
- value_template?: string;
- for?: string | TimePeriod;
-}
-
-/**
- * @TJS-additionalProperties true
- */
-export interface DeviceTrigger {
- platform: "device";
- domain: string;
- device_id: string;
-}
-
-export type Triggers =
- HaTrigger
- | SunTrigger
- | TimeTrigger
- | TemplateTrigger
- | WebhookTrigger
- | EventTrigger
- | TimePatternTrigger
- | MqttTrigger
- | GeoLocationTrigger
- | StateTrigger
- | ZoneTrigger
- | NumericStateTrigger
- | DeviceTrigger;
-
-export interface Action {
-}
-
-export interface DeviceActionSchema extends Action {
- platform?: "device";
- domain: string;
- device_id: string;
- entity_id: string;
- type: string;
-}
-
-export interface EventActionSchema extends Action {
- alias?: string;
- event: string;
- event_data?: any;
- event_data_template?: any;
-}
-export interface DelayActionSchema extends Action {
- delay: number | string | TimePeriod;
-}
-
-export interface ServiceActionSchema extends Action {
- service: string;
- service_template?: string;
- entity_id?: string | string[];
- data?: any;
- data_template?: any;
- alias?: string;
-}
-
-export interface ServiceActionTemplateSchema extends Action {
- service_template: string;
- entity_id?: string | string[];
- data?: any;
- data_template?: any;
-}
-
-export interface WaitTemplateSchema extends Action{
- wait_template: string;
- timeout?: string | TimePeriod;
- continue_on_timeout?: boolean | string;
-}
-
-/**
- * @TJS-additionalProperties true
- */
-export interface DeviceConditionSchema {
- condition: "device";
- device_id: string;
- domain: string;
-}
-
-export interface NumericStateConditionSchema {
- condition: "numeric_state";
- entity_id: string;
- below?: string | number;
- above?: string | number;
- value_template?: string;
-}
-
-export interface StateConditionSchema {
- condition: "state";
- entity_id: string;
- state: string | boolean;
- for?: string | TimePeriod;
- from?: string;
-}
-
-export interface SunConditionSchema {
- condition: "sun";
- before?: string;
- before_offset?: string;
- after?: string;
- after_offset?: string;
-}
-
-export interface TemplateConditionSchema {
- condition: "template";
- value_template?: string;
-}
-
-export interface TimeConditionSchema {
- condition: "time";
- before?: string;
- after?: string;
- weekday?: Weekday | Array;
-}
-
-export type Weekday = 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat' | 'sun';
-
-export interface ZoneConditionSchema {
- condition: "zone";
- entity_id: string | string[];
- zone?: string;
-}
-export interface AndConditionSchema {
- condition: "and";
- conditions: ConditionsConfig;
-}
-
-export interface OrConditionSchema {
- condition: "or";
- conditions: ConditionsConfig;
-}
-
-export type ConditionsConfig =
- NumericStateConditionSchema
- | DeviceConditionSchema
- | StateConditionSchema
- | SunConditionSchema
- | TemplateConditionSchema
- | TimeConditionSchema
- | ZoneConditionSchema
- | AndConditionSchema
- | OrConditionSchema
- | Array<
- NumericStateConditionSchema
- | DeviceConditionSchema
- | StateConditionSchema
- | SunConditionSchema
- | TemplateConditionSchema
- | TimeConditionSchema
- | ZoneConditionSchema
- | AndConditionSchema
- | OrConditionSchema
- >;
diff --git a/src/language-service/src/schemas/conditions.ts b/src/language-service/src/schemas/conditions.ts
new file mode 100644
index 0000000000..8429a4d33c
--- /dev/null
+++ b/src/language-service/src/schemas/conditions.ts
@@ -0,0 +1,255 @@
+/**
+ * Automation and script conditions
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/helpers/config_validation.py
+ */
+import {
+ Deprecated,
+ Entity,
+ EntityDeviceTracker,
+ EntityZone,
+ IncludeList,
+ State,
+ Template,
+ Time,
+ TimePeriod,
+} from "./types";
+
+export type Weekday = "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun";
+
+export type Condition =
+ | AndCondition
+ | DeviceCondition
+ | NotCondition
+ | NumericStateCondition
+ | OrCondition
+ | StateCondition
+ | SunCondition
+ | TemplateCondition
+ | TimeCondition
+ | ZoneCondition;
+
+export interface AndCondition {
+ /**
+ * Test multiple conditions in one condition statement. Passes if all embedded conditions are valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#and-condition
+ */
+ condition: "and";
+
+ /**
+ * Test multiple conditions in one condition statement. Passes if all embedded conditions are valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#and-condition
+ */
+ conditions: Condition | Condition[] | IncludeList;
+}
+
+/**
+ * @TJS-additionalProperties true
+ */
+export interface DeviceCondition {
+ /**
+ * Device conditions encompass a set of properties that are defined by an integration.
+ * In contrast to state conditions, device conditions are tied to a device and not necessarily an entity. To use a device trigger, set up an automation through the browser frontend.
+ */
+ condition: "device";
+
+ /**
+ * The internal ID of the device to preform a conditional test on.
+ */
+ device_id: string;
+
+ /**
+ * The integration domain this device condition is provided by.
+ */
+ domain: string;
+}
+
+export interface NotCondition {
+ /**
+ * Test multiple conditions in one condition statement. Passes if all embedded conditions are not valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#not-condition
+ */
+ condition: "not";
+
+ /**
+ * Test multiple conditions in one condition statement. Passes if all embedded conditions are not valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#not-condition
+ */
+ conditions: Condition | Condition[] | IncludeList;
+}
+
+export interface NumericStateCondition {
+ /**
+ * This type of condition attempts to parse the state of the specified entity as a number, and triggers if the value matches the thresholds.
+ * https://www.home-assistant.io/docs/scripts/conditions/#numeric-state-condition
+ */
+ condition: "numeric_state";
+
+ /**
+ * Passes if the numeric state of the given entity (or entities) is above the given threshold.
+ * https://www.home-assistant.io/docs/scripts/conditions/#numeric-state-condition
+ */
+ above?: number;
+
+ /**
+ * Passes if the numeric state of the given entity (or entities) is below the given threshold.
+ * https://www.home-assistant.io/docs/scripts/conditions/#numeric-state-condition
+ */
+ below?: number;
+
+ /**
+ * The entity ID or list of entity IDs to test the numeric state against.
+ * https://www.home-assistant.io/docs/scripts/conditions/#numeric-state-condition
+ */
+ entity_id: Entity | Entity[];
+
+ /**
+ * An optional value template to use as the numeric state value.
+ * https://www.home-assistant.io/docs/scripts/conditions/#numeric-state-condition
+ */
+ value_template?: Template;
+}
+
+export interface OrCondition {
+ /**
+ * Test multiple conditions in one condition statement. Passes if any embedded condition is valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#or-condition
+ */
+ condition: "or";
+
+ /**
+ * Test multiple conditions in one condition statement. Passes if any embedded condition is valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#or-condition
+ */
+ conditions: Condition | Condition[] | IncludeList;
+}
+
+export interface StateCondition {
+ /**
+ * Tests if an entity (or entities) is in a specified state.
+ * https://www.home-assistant.io/docs/scripts/conditions/#state-condition
+ */
+ condition: "state";
+
+ /**
+ * The entity ID or list of entity IDs to test the state against.
+ * https://www.home-assistant.io/docs/scripts/conditions/#state-condition
+ */
+ entity_id: Entity | Entity[];
+
+ /**
+ * The state the entity (or entities) must have for this condition to pass.
+ * https://www.home-assistant.io/docs/scripts/conditions/#state-condition
+ */
+ state: State | State[];
+
+ /**
+ * The amount of time the entity (or entities) state must be held until this condition passes.
+ * https://www.home-assistant.io/docs/scripts/conditions/#state-condition
+ */
+ for?: TimePeriod | Template;
+
+ /**
+ * DEPRECATED
+ * This option has no effect, please remove it.
+ */
+ from?: Deprecated;
+}
+
+export interface SunCondition {
+ /**
+ * The sun state can be used to test if the sun has set or risen.
+ * https://www.home-assistant.io/docs/scripts/conditions/#sun-condition
+ */
+ condition: "sun";
+
+ /**
+ * Conditionally test if is currently is before sunrise or sunset.
+ * Note that if only before key is used, the condition will be true from midnight until sunrise/sunset.
+ * https://www.home-assistant.io/docs/scripts/conditions/#sun-condition
+ */
+ before?: "sunset" | "sunrise";
+
+ /**
+ * Optional offset from the sunrise or sunset. For example "-00:45:00" will conditionally test 45 minutes before sunrise or sunset.
+ * https://www.home-assistant.io/docs/scripts/conditions/#sun-condition
+ */
+ before_offset?: TimePeriod;
+
+ /**
+ * Conditionally test if is currently is after sunrise or sunset.
+ * Note that if only after key is used, the condition will be true from sunset/sunrise until midnight.
+ * https://www.home-assistant.io/docs/scripts/conditions/#sun-condition
+ */
+ after?: "sunset" | "sunrise";
+
+ /**
+ * Optional offset from the sunrise or sunset. For example "-00:45:00" will conditionally test 45 minutes before sunrise or sunset.
+ * https://www.home-assistant.io/docs/scripts/conditions/#sun-condition
+ */
+ after_offset?: TimePeriod;
+}
+
+export interface TemplateCondition {
+ /**
+ * The template condition tests if the given template renders a value equal to true. This is achieved by having the template result in a true boolean expression or by having the template render ‘true’.
+ * https://www.home-assistant.io/docs/scripts/conditions/#template-condition
+ */
+ condition: "template";
+
+ /**
+ * The template to render for this condition. The condition will pass if the result is true.
+ * https://www.home-assistant.io/docs/scripts/conditions/#template-condition
+ */
+ value_template?: Template;
+}
+
+export interface TimeCondition {
+ /**
+ * The time condition can test if it is after a specified time, before a specified time or if it is a certain day of the week.
+ * https://www.home-assistant.io/docs/scripts/conditions/#time-condition
+ */
+ condition: "time";
+
+ /**
+ * Conditionally check if it is currently before a certain time of day.
+ * Note that if only before key is used, the condition will be true from midnight until the specified time.
+ * https://www.home-assistant.io/docs/scripts/conditions/#time-condition
+ */
+ before?: Time;
+
+ /**
+ * Conditionally check if it is currently after a certain time of day.
+ * Note that if only after key is used, the condition will be true from the specified time until midnight.
+ * https://www.home-assistant.io/docs/scripts/conditions/#time-condition
+ */
+ after?: Time;
+
+ /**
+ * Days of the week this condition can be valid.
+ * https://www.home-assistant.io/docs/scripts/conditions/#time-condition
+ */
+ weekday?: Weekday | Array;
+}
+
+export interface ZoneCondition {
+ condition: "zone";
+
+ /**
+ * The entity ID(s) of the device tracker(s).
+ * https://www.home-assistant.io/docs/scripts/conditions/#zone-condition
+ */
+ entity_id: EntityDeviceTracker | EntityDeviceTracker[];
+
+ /**
+ * DEPRECATED.
+ *
+ * This option has been deprecated, please remove it from your configuration.
+ */
+ event?: Deprecated;
+
+ /**
+ * The zone(s) conditionally check against for the given device tracker(s).
+ * https://www.home-assistant.io/docs/scripts/conditions/#zone-condition
+ */
+ zone: EntityZone | EntityZone[];
+}
diff --git a/src/language-service/src/schemas/core.ts b/src/language-service/src/schemas/core.ts
new file mode 100644
index 0000000000..d4614c78b3
--- /dev/null
+++ b/src/language-service/src/schemas/core.ts
@@ -0,0 +1,174 @@
+import { HomeAssistantRoot } from "./homeassistant";
+import {
+ DeviceClasses,
+ IncludeNamed,
+ UnitSystem,
+ Secret,
+ TimeZone,
+} from "./types";
+
+export interface Core {
+ auth_mfa_modules?: Array | IncludeNamed; // TODO: Extract similar as in integrations
+ auth_providers?: AuthProviders[] | IncludeNamed; // TODO: Extract similar as in integrations
+
+ /**
+ * Customize entities.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/
+ */
+ customize?: CoreCustomize | IncludeNamed;
+
+ /**
+ * Customize all entities of a given domain.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/
+ */
+ customize_domain?: CoreCustomize | IncludeNamed;
+
+ /**
+ * Customize entities matching a pattern.
+ * https://wwww.home-assistant.io/docs/configuration/customizing-devices/
+ */
+ customize_glob?: CoreCustomize | IncludeNamed;
+
+ /**
+ * Altitude above sea level in meters. Impacts weather/sunrise data.
+ * https://www.home-assistant.io/docs/configuration/basic/#elevation
+ *
+ * @TJS-type integer
+ */
+ elevation?: number | Secret;
+
+ /**
+ * Latitude of your location required to calculate the time the sun rises and sets.
+ * https://www.home-assistant.io/docs/configuration/basic/#latitude
+ *
+ * @minimum -90
+ * @maximum 90
+ */
+ latitude?: number | Secret;
+
+ /**
+ * Longitude of your location required to calculate the time the sun rises and sets.
+ * https://www.home-assistant.io/docs/configuration/basic/#longitude
+ *
+ * @minimum -180
+ * @maximum 180
+ */
+ longitude?: number | Secret;
+
+ /**
+ * Name of the location where Home Assistant is running.
+ * https://www.home-assistant.io/docs/configuration/basic/#name
+ */
+ name?: string | Secret;
+
+ /**
+ * Packages in Home Assistant provide a way to bundle different component’s configuration together. It allows for "splitting" your configuration.
+ * https://www.home-assistant.io/docs/configuration/packages/
+ */
+ packages?: Array | IncludeNamed;
+
+ /**
+ * Pick your time zone from the column TZ of Wikipedia’s list of tz database time
+ * https://www.home-assistant.io/docs/configuration/basic/#time_zone
+ * https://www.wikiwand.com/en/List_of_tz_database_time_zones
+ */
+ time_zone?: TimeZone | Secret;
+
+ /**
+ * "metric" for Metric, "imperial" for Imperial.
+ * This also sets temperature unit Home Assistant will use.
+ * https://www.home-assistant.io/docs/configuration/basic/#unit_system
+ */
+ unit_system?: UnitSystem | Secret;
+
+ /**
+ * List of folders that can be used as sources for sending files.
+ * https://www.home-assistant.io/docs/configuration/basic/#whitelist_external_dirs
+ */
+ whitelist_external_dirs?: string[] | Secret;
+}
+
+export interface CoreCustomize {
+ [key: string]: CoreCustomizeItem | IncludeNamed;
+}
+
+/**
+ * @TJS-additionalProperties true
+ */
+interface CoreCustomizeItem {
+ /**
+ * For switches with an assumed state two buttons are shown (turn off, turn on) instead of a switch.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/#assumed_state
+ */
+ assumed_state?: boolean;
+
+ /**
+ * Sets the class of the device, changing the device state and icon that is displayed on the UI (see below).
+ * Please note: It does not set the unit_of_measurement.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/#device_class
+ */
+ device_class?: DeviceClasses;
+
+ /**
+ * URL to use as picture for entity.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/#entity_picture
+ */
+ entity_picture?: string;
+
+ /**
+ * Name of the entity as displayed in the UI.
+ * Please note that most of the time you can just rename the entity in the UI itself.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/#friendly_name
+ */
+ friendly_name?: string;
+
+ /**
+ * Any icon from MaterialDesignIcons.com. Prefix name with mdi:. For example: mdi:home.
+ * Please note that most of the time you can just change the entity icon in the UI itself.
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/#icon
+ */
+ icon?: string;
+
+ /**
+ * Sets the initial state for automations, on (true) or off (false).
+ * https://www.home-assistant.io/docs/configuration/customizing-devices/#initial_state
+ */
+ initial_state?: boolean;
+
+ /**
+ * Defines the units of measurement, if any. This will also influence the graphical presentation in the history visualization as continuous value. Sensors with missing unit_of_measurement are showing as discrete values.
+ * https://wwww.home-assistant.io/docs/configuration/customizing-devices/#unit_of_measurement
+ */
+ unit_of_measurement?: string;
+}
+
+/**
+ * TODO: Definitions below need to be extracted in a similar fashion as integrations.
+ */
+export type AuthProviders =
+ | HomeAssistantAuthProvider
+ | TrustedNetworksAuthProvider
+ | CommandLineAuthProvider
+ | LegacyApiPasswordAuthProvider;
+
+export interface HomeAssistantAuthProvider {
+ type: "homeassistant";
+}
+export interface TrustedNetworksAuthProvider {
+ type: "trusted_networks";
+ trusted_networks: string | string[] | any[];
+ trusted_users?: {
+ [key: string]: string | Array;
+ };
+ allow_bypass_login?: boolean;
+}
+export interface CommandLineAuthProvider {
+ type: "command_line";
+ command: string;
+ args?: any;
+ meta?: boolean;
+}
+export interface LegacyApiPasswordAuthProvider {
+ type: "legacy_api_password";
+ api_password: string;
+}
diff --git a/src/language-service/src/schemas/generateSchemas.ts b/src/language-service/src/schemas/generateSchemas.ts
index fb88b3320b..0b89d47b94 100644
--- a/src/language-service/src/schemas/generateSchemas.ts
+++ b/src/language-service/src/schemas/generateSchemas.ts
@@ -1,36 +1,45 @@
import { resolve } from "path";
+// eslint-disable-next-line import/no-extraneous-dependencies
import * as TJS from "typescript-json-schema";
import * as fs from "fs";
-import { PathToSchemaMapping } from "./schemaService";
import * as path from "path";
+import { PathToSchemaMapping } from "./schemaService";
const settings: TJS.PartialArgs = {
- required: true,
- noExtraProps: true
+ required: true,
+ noExtraProps: true,
};
const compilerOptions: TJS.CompilerOptions = {
- strictNullChecks: true
+ strictNullChecks: true,
};
-var jsonPath = path.join(__dirname, "mappings.json");
-var filecontents = fs.readFileSync(jsonPath, "utf-8");
+const jsonPath = path.join(__dirname, "mappings.json");
+const filecontents = fs.readFileSync(jsonPath, "utf-8");
-var outputFolder = path.join(__dirname, "json");
+const outputFolder = path.join(__dirname, "json");
if (!fs.existsSync(outputFolder)) {
- fs.mkdirSync(outputFolder);
+ fs.mkdirSync(outputFolder);
}
if (fs.readdirSync(outputFolder).length > 0 && process.argv[2] === "--quick") {
- console.debug("Skipping schema generation becasue there already schema files");
+ console.debug(
+ "Skipping schema generation because there already schema files"
+ );
+} else {
+ console.log("Generating schema's...");
+ const pathToSchemaMappings: PathToSchemaMapping[] = JSON.parse(filecontents);
+ pathToSchemaMappings.forEach((mapping) => {
+ console.log(mapping.path);
+ const program = TJS.getProgramFromFiles(
+ [resolve(path.join(__dirname, mapping.tsFile))],
+ compilerOptions
+ );
+ const schema = TJS.generateSchema(program, mapping.fromType, settings);
+ fs.writeFileSync(
+ path.join(outputFolder, mapping.file),
+ JSON.stringify(schema)
+ );
+ });
}
-else {
- console.log("Generating schema's...");
- var pathToSchemaMappings: PathToSchemaMapping[] = JSON.parse(filecontents);
- pathToSchemaMappings.forEach(mapping => {
- let program = TJS.getProgramFromFiles([resolve(path.join(__dirname, mapping.tsFile))], compilerOptions);
- let schema = TJS.generateSchema(program, mapping.fromType, settings);
- fs.writeFileSync(path.join(outputFolder, mapping.file), JSON.stringify(schema));
- });
-}
\ No newline at end of file
diff --git a/src/language-service/src/schemas/homeassistant.ts b/src/language-service/src/schemas/homeassistant.ts
index 3f946c0f30..088966c881 100644
--- a/src/language-service/src/schemas/homeassistant.ts
+++ b/src/language-service/src/schemas/homeassistant.ts
@@ -1,227 +1,90 @@
-import { Automations, ConditionsConfig, TimePeriod } from "./automation";
+import { Core } from "./core";
import { Sensors } from "./sensors";
+// eslint-disable-next-line import/extensions
+import * as integrations from "./integrations";
+import { IncludeList, IncludeNamed } from "./types";
/**
* @TJS-additionalProperties true
*/
-export interface HomeAssistantRoot {
- homeassistant?: HomeAssistantComponent | IncludeTags;
- automation?: Automations | IncludeTags;
- group?: GroupComponent | IncludeTags | null;
- panel_iframe?: PanelIframeComponent | IncludeTags;
- sensor?: null | Array | IncludeTags;
- scene?: SceneComponentEntry[] | IncludeTags;
- input_boolean?: InputBooleanEntry | IncludeTags;
- script?: Script | IncludeTags;
- http?: any;
- default_config?: any;
- person?: any;
- system_health?: any;
- panel_custom?: any;
- updater?: any;
- discovery?: any;
- conversation?: any;
- history?: any;
- config?: any;
- logbook?: any;
- sun?: any;
- tts?: any;
- recorder?: any;
- ifttt?: any;
- ios?: any;
- mqtt?: any;
- remote?: any;
+export interface HomeAssistantRoot
+ extends InternalIntegrations,
+ CoreIntegrations,
+ CustomIntegrations {
+ /**
+ * Home Assistant Core configuration
+ * https://www.home-assistant.io/docs/configuration/basic
+ */
+ homeassistant?: Core | IncludeList;
}
-export interface HomeAssistantComponent {
- name?: string;
- latitude?: string | number;
- longitude?: string | number;
- elevation?: string | number;
- unit_system?: "metric" | "imperial";
- time_zone?: string;
- whitelist_external_dirs?: string[];
- customize?: CustomizeComponent | IncludeTags;
- customize_domain?: any;
- customize_glob?: any;
- packages?: Array | NamedPackageInclude | IncludeTags;
- auth_providers?: AuthProviders[] | IncludeTags;
- auth_mfa_modules?: Array | IncludeTags;
-}
-
-export interface NamedPackageInclude {
- [key: string]: HomeAssistantRoot | IncludeTags;
-}
-
-/**
- * @TJS-type string
- * @TJS-pattern [.]yaml|[.]yml$
- */
-export interface IncludeTag { }
-
/**
- * @TJS-type string
+ * This interface contains all integrations that are marked as "internal" to
+ * Home Assistant. Core things like light, switch, sensor, automations.
+ * These integrations generally do not connect with a device or service.
*/
-export interface IncludeFolderTag { }
-
-export type IncludeTags = IncludeTag | IncludeFolderTag;
-
-/**
- * @TJS-type string
- * @TJS-pattern [.]yaml|[.]yml$
- */
-export interface SecretTag { }
-
-
-export interface PanelIframeComponent {
- [key: string]: PanelIframeComponentEntry;
+export interface InternalIntegrations {
+ /**
+ * Automations offer the capability to call a service based on a simple or complex trigger. Automation allows a condition such as a sunset to cause an event, such as a light turning on.
+ * https://www.home-assistant.io/docs/automation/
+ */
+ automation?: integrations.Automation.Schema | IncludeList;
+
+ /**
+ * Groups allows you to combine multiple entities into a single group entity.
+ * https://www.home-assistant.io/integrations/group
+ */
+ group?: integrations.Group.Schema | IncludeNamed;
+
+ /**
+ * The input_boolean integration allows the user to define boolean values that can be controlled via the frontend and can be used within conditions of automation. This can for example be used to disable or enable certain automations.
+ * https://www.home-assistant.io/integrations/input_boolean
+ */
+ input_boolean?: integrations.InputBoolean.Schema | IncludeNamed;
+
+ /**
+ * The panel_iframe support allows you to add additional panels to your Home Assistant frontend. The panels are listed in the sidebar and can contain external resources like the web frontend of your router, your monitoring system, or your media server.
+ * https://www.home-assistant.io/integrations/panel_iframe
+ */
+ panel_iframe?: integrations.PanelIframe.Schema | IncludeNamed;
+
+ /**
+ * The script integration allows users to specify a sequence of actions to be executed by Home Assistant. These are run when you turn the script on. The script integration will create an entity for each script and allow them to be controlled via services.
+ * https://www.home-assistant.io/integrations/script
+ */
+ script?: integrations.Script.Schema | IncludeNamed;
+
+ /**
+ * You can create scenes that capture the states you want certain entities to be. For example, a scene can specify that light A should be turned on and light B should be bright red.
+ * https://www.home-assistant.io/integrations/scene
+ */
+ scene?: integrations.Scene.Schema | IncludeList;
+
+ sensor?: null | Array | IncludeList; // TODO: Migrate to new structure
}
-export interface PanelIframeComponentEntry {
- title: string;
- url: string;
- icon?: string;
- require_admin?: boolean;
-}
-
-export type CustomizeFile = CustomizeComponent | CustomizeComponent[];
-export interface CustomizeComponent {
- [key: string]: CustomizeComponentEntry;
-}
/**
- * @TJS-additionalProperties true
+ * This interface contains all integrations that are not marked internal
+ * but are shipped with Home Assistant by default.
*/
-export interface CustomizeComponentEntry {
- friendly_name?: string;
- homebridge_name?: string;
- hidden?: boolean;
- homebridge_hidden?: boolean;
- emulated_hue_hidden?: boolean;
- entity_picture?: string;
- icon?: string;
- assumed_state?: boolean;
- device_class?: string;
- unit_of_measurement?: string;
- initial_state?: boolean;
-}
-export interface GroupComponent {
- [key: string]: GroupComponentEntry | string[];
-}
-export interface GroupComponentEntry {
- name?: string;
- view?: boolean;
- icon?: string;
- control?: string;
- entities: string | string[];
- all?: boolean;
-}
-
-export type AuthProviders =
- HomeAssistantAuthProvider |
- TrustedNetworksAuthProvider |
- CommandLineAuthProvider |
- LegacyApiPasswordAuthProvider;
-
-export interface HomeAssistantAuthProvider {
- type: "homeassistant";
-}
-export interface TrustedNetworksAuthProvider {
- type: "trusted_networks";
- trusted_networks: string | string[] | any[];
- trusted_users?: {
- [key: string]: string | Array
- };
- allow_bypass_login?: boolean;
-}
-export interface CommandLineAuthProvider {
- type: "command_line";
- command: string;
- args?: any;
- meta?: boolean;
-}
-export interface LegacyApiPasswordAuthProvider {
- type: "legacy_api_password";
- api_password: string | SecretTag;
-}
-
-export type SceneComponentEntries = SceneComponentEntry | Array;
-
-export interface SceneComponentEntry {
- id?: string;
- name: string;
- icon?: string;
- entities: { [name: string]: string | boolean | EntitySceneConfig };
-}
-
-/**
- * @TJS-additionalProperties true
- */
-export interface EntitySceneConfig {
- state?: boolean | string;
- brightness?: number | string;
- source?: string;
- color_temp?: number | string;
- xy_color?: any;
-}
-
-export interface InputBooleanEntry {
- [name: string]: {
- name?: string;
- initial?: boolean;
- icon?: string;
- } | null;
-}
-
-export type ScriptFile = SequencedAction | ScriptAction | Script | Script[];
-
-export interface Script {
- [name: string]: SequencedAction | ScriptAction;
-}
-
-export interface SequencedAction {
- alias?: string;
- icon?: string;
- description?: string;
- fields?: Array | ScriptField;
- sequence: ScriptAction | Array;
-}
-
-export interface ScriptField {
- [name: string]: {
- description: string;
- example: string;
- };
-}
-
-export type ScriptAction = ServiceAction | DelayAction | WaitAction | EventAction;
-
-export interface ServiceAction {
- service?: string;
- service_template?: string;
- data?: any;
- data_template?: any;
- entity_id?: string | string[];
-}
-export interface DelayAction {
- delay: string | number | TimePeriod;
-}
-export interface WaitAction {
- wait_template: string;
- timeout?: string;
- continue_on_timeout?: boolean | string;
-}
-export interface EventAction {
- event: string;
- event_data: EventActionData;
- event_data_template?: any;
+export interface CoreIntegrations {
+ /**
+ * DEPRECATED as of Home Assistant 0.113.0
+ *
+ * The Philips Hue integration allows you to control and monitor the lights and motion sensors connected to your Hue bridge.
+ * https://www.home-assistant.io/integrations/hue
+ */
+ hue?: integrations.Hue.Schema | IncludeNamed;
}
/**
- * @TJS-additionalProperties true
+ * This interface contains definitions for custom integrations, also known as:
+ * custom_components.
*/
-export interface EventActionData {
- name?: string;
- message?: string;
- entity_id?: string;
- domain?: string;
+export interface CustomIntegrations {
+ /**
+ * Home Assistant Community Store
+ * https://hacs.xyz/
+ */
+ hacs?: integrations.HACS.Schema | IncludeNamed;
}
diff --git a/src/language-service/src/schemas/integrations/automation.ts b/src/language-service/src/schemas/integrations/automation.ts
new file mode 100644
index 0000000000..040c50c9d7
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/automation.ts
@@ -0,0 +1,421 @@
+/**
+ * Automation integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/__init__.py
+ */
+import {
+ Deprecated,
+ Entity,
+ EntityDeviceTracker,
+ EntityZone,
+ IncludeList,
+ State,
+ Template,
+ Time,
+ TimePeriod,
+} from "../types";
+import { Action } from "../actions";
+import { Condition } from "../conditions";
+
+export type Domain = "automation";
+export type Schema = Item[] | IncludeList;
+
+type Mode = "single" | "parallel" | "queue" | "restart";
+
+interface Item {
+ /**
+ * A unique identifier for this automation.
+ * Do not use the same twice, ever!
+ * https://www.home-assistant.io/docs/automation/
+ */
+ id?: string;
+
+ /**
+ * Alias will be used to generate an entity_id from.
+ * https://www.home-assistant.io/docs/automation/
+ */
+ alias?: string;
+
+ /**
+ * Description of the automation.
+ * This is helpful to know what the automation does.
+ * https://www.home-assistant.io/docs/automation/
+ */
+ description?: string;
+
+ /**
+ * DEPRECATED since Home Assistant 0.112.
+ * This option has no effect. Please remove it from your configuration.
+ */
+ hide_entity?: Deprecated;
+
+ /**
+ * When you create a new automation, it will be enabled unless you explicitly add initial_state: false to it or turn it off manually via UI/another automation/developer tools.
+ * In case automations need to be always enabled or disabled when Home Assistant starts, then you can set the initial_state in your automations. Otherwise, the previous state will be restored.
+ * https://www.home-assistant.io/docs/automation/#automation-initial-state
+ */
+ initial_state?: boolean;
+
+ /**
+ * The automation’s mode configuration option controls what happens when the automation is triggered while the actions are still running from a previous trigger.
+ * https://next.home-assistant.io/docs/automation/#automation-modes
+ */
+ mode?: Mode;
+
+ /**
+ * Triggers describe events that should trigger the automation rule.
+ * https://www.home-assistant.io/docs/automation/#automation-basics
+ */
+ trigger: Trigger | Trigger[] | IncludeList;
+
+ /**
+ * Conditions are optional tests that can limit an automation rule to only work in your specific use cases. A condition will test against the current state of the system. This includes the current time, devices, people and other things like the sun.
+ * https://www.home-assistant.io/docs/automation/#automation-basics
+ */
+ condition?: Condition | Condition[] | IncludeList;
+
+ /**
+ * The action(s) which will be performed when a rule is triggered and all conditions are met. For example, it can turn a light on, set the temperature on your thermostat or activate a scene.
+ * https://www.home-assistant.io/docs/automation/#automation-basics
+ */
+ action: Action | Action[] | IncludeList;
+}
+
+type Trigger =
+ | TriggerDevice
+ | TriggerEvent
+ | TriggerGeolocation
+ | TriggerHomeAssistant
+ | TriggerMqtt
+ | TriggerNumericState
+ | TriggerState
+ | TriggerSun
+ | TriggerTemplate
+ | TriggerTime
+ | TriggerTimePattern
+ | TriggerWebhook
+ | TriggerZone;
+
+/**
+ * @TJS-additionalProperties true
+ */
+interface TriggerDevice {
+ /**
+ * Device triggers encompass a set of events that are defined by an integration.
+ * In contrast to state triggers, device triggers are tied to a device and not necessarily an entity. To use a device trigger, set up an automation through the browser frontend.
+ * https://www.home-assistant.io/docs/automation/trigger/#device-triggers
+ */
+ platform: "device";
+
+ /**
+ * The internal ID of the device to trigger on
+ * https://www.home-assistant.io/docs/automation/trigger/#device-triggers
+ */
+ device_id: string;
+
+ /**
+ * The integration domain this device trigger is provided by.
+ * https://www.home-assistant.io/docs/automation/trigger/#device-triggers
+ */
+ domain: string;
+}
+
+interface TriggerEvent {
+ /**
+ * Fires when an event is being received. Events are the raw building blocks of Home Assistant. You can match events on just the event name or also require specific event data to be present.
+ * https://www.home-assistant.io/docs/automation/trigger/#event-trigger
+ */
+ platform: "event";
+
+ /**
+ * Additional event data that has to match before triggering.
+ * https://www.home-assistant.io/docs/automation/trigger/#event-trigger
+ */
+ event_data?: {
+ [key: string]: any;
+ };
+
+ /**
+ * The name of the event to listen for.
+ * https://www.home-assistant.io/docs/automation/trigger/#event-trigger
+ */
+ event_type:
+ | "automation_reloaded"
+ | "call_service"
+ | "component_loaded"
+ | "platform_discovered"
+ | "scene_reloaded"
+ | "service_executed"
+ | "service_registered"
+ | "state_changed"
+ | "time_changed"
+ | string;
+}
+
+interface TriggerGeolocation {
+ /**
+ * Geolocation trigger fires when an entity is appearing in or disappearing from a zone.
+ * https://www.home-assistant.io/docs/automation/trigger/#geolocation-trigger
+ */
+ platform: "geo_location";
+
+ /**
+ * Trigger when the entity leaves or enters the zone defined.
+ * https://www.home-assistant.io/docs/automation/trigger/#geolocation-trigger
+ */
+ event: "enter" | "leave";
+
+ /**
+ * The source is directly linked to one of the Geolocation platforms.
+ * https://www.home-assistant.io/docs/automation/trigger/#geolocation-trigger
+ */
+ source: string;
+
+ /**
+ * The zone to trigger on when a entity is appearing in or disappearing from.
+ * https://www.home-assistant.io/docs/automation/trigger/#geolocation-trigger
+ */
+ zone: EntityZone;
+}
+
+interface TriggerHomeAssistant {
+ /**
+ * This trigger fires when Home Assistant has started up or going to shut down.
+ * https://www.home-assistant.io/docs/automation/trigger/#home-assistant-trigger
+ */
+ platform: "homeassistant";
+
+ /**
+ * Specified the event to listen to: Either the Home Assistant start or shutdown event.
+ * https://www.home-assistant.io/docs/automation/trigger/#home-assistant-trigger
+ */
+ event: "start" | "shutdown";
+}
+
+interface TriggerMqtt {
+ /**
+ * Fires when a specific message is received on given MQTT topic
+ * https://www.home-assistant.io/docs/automation/trigger/#mqtt-trigger
+ */
+ platform: "mqtt";
+
+ /**
+ * The default payload encoding is ‘utf-8’.
+ * For images and other byte payloads use encoding: '' to disable payload decoding completely.
+ * https://www.home-assistant.io/docs/automation/trigger/#mqtt-trigger
+ */
+ encoding?: string;
+
+ /**
+ * The payload to match on before triggering.
+ * https://www.home-assistant.io/docs/automation/trigger/#mqtt-trigger
+ */
+ payload?: string;
+
+ /**
+ * The matching QoS level of the state topic. Default is 0.
+ * https://www.home-assistant.io/docs/automation/trigger/#mqtt-trigger
+ *
+ * @TJS-type integer
+ * @minimum 0
+ * @maximum 2
+ */
+ qos?: number;
+
+ /**
+ * The MQTT topic to subscribe and listen to.
+ * https://www.home-assistant.io/docs/automation/trigger/#mqtt-trigger
+ */
+ topic: string;
+}
+
+interface TriggerNumericState {
+ /**
+ * Fires when numeric value of an entity’s state crosses a given threshold.
+ * https://www.home-assistant.io/docs/automation/trigger/#numeric-state-trigger
+ */
+ platform: "numeric_state";
+
+ /**
+ * The entity ID or list of entity IDs to monitor the numeric state for.
+ * https://www.home-assistant.io/docs/automation/trigger/#numeric-state-trigger
+ */
+ entity_id: Entity | Entity[];
+
+ /**
+ * Fire this trigger if the numeric state of the monitored entity (or entities) is changing from above to below the given threshold.
+ * https://www.home-assistant.io/docs/automation/trigger/#numeric-state-trigger
+ */
+ below?: number;
+
+ /**
+ * Fire this trigger if the numeric state of the monitored entity (or entities) is changing from below to above the given threshold.
+ * https://www.home-assistant.io/docs/automation/trigger/#numeric-state-trigger
+ */
+ above?: number;
+
+ /**
+ * An optional value template to use as the numeric state value.
+ * https://www.home-assistant.io/docs/automation/trigger/#numeric-state-trigger
+ */
+ value_template?: Template;
+
+ /**
+ * The amount of time this threshold must be held until this trigger fires.
+ * https://www.home-assistant.io/docs/automation/trigger/#numeric-state-trigger
+ */
+ for?: TimePeriod | Template;
+}
+
+interface TriggerState {
+ /**
+ * This trigger fires when the state of any of given entities changes.
+ * https://www.home-assistant.io/docs/automation/trigger/#state-trigger
+ */
+ platform: "state";
+
+ /**
+ * The entity ID or list of entity IDs to monitor the state for.
+ * https://www.home-assistant.io/docs/automation/trigger/#state-trigger
+ */
+ entity_id: Entity | Entity[];
+
+ /**
+ * The amount of time the entity or entities state must be held until this trigger fires.
+ * https://www.home-assistant.io/docs/automation/trigger/#state-trigger
+ */
+ for?: TimePeriod | Template;
+
+ /**
+ * The state the entity or entities had before changing to its new state.
+ * https://www.home-assistant.io/docs/automation/trigger/#state-trigger
+ */
+ from?: State | State[];
+
+ /**
+ * The state the entity or entities have changed to.
+ * https://www.home-assistant.io/docs/automation/trigger/#state-trigger
+ */
+ to?: State | State[];
+}
+
+interface TriggerSun {
+ /**
+ * This trigger fires when the sun is setting or rising.
+ * https://www.home-assistant.io/docs/automation/trigger/#sun-trigger
+ */
+ platform: "sun";
+
+ /**
+ * The event to fire on, either on sunset or sunrise.
+ * https://www.home-assistant.io/docs/automation/trigger/#sun-trigger
+ */
+ event: "sunset" | "sunrise";
+
+ /**
+ * Optional offset from the sunrise or sunset. For example "-00:45:00" will trigger 45 minutes before sunrise or sunset.
+ * https://www.home-assistant.io/docs/automation/trigger/#sun-trigger
+ */
+ offset?: TimePeriod;
+}
+
+interface TriggerTemplate {
+ /**
+ * Template triggers work by evaluating a template on every state change for all of the recognized entities. The trigger will fire if the state change caused the template to render ‘true’.
+ * https://www.home-assistant.io/docs/automation/trigger/#template-trigger
+ */
+ platform: "template";
+
+ /**
+ * The template to render for this trigger. The event will fire is the result is true.
+ * https://www.home-assistant.io/docs/automation/trigger/#template-trigger
+ */
+ value_template: Template;
+
+ /**
+ * The amount of time the template must be resulting in true until this trigger fires.
+ * https://www.home-assistant.io/docs/automation/trigger/#template-trigger
+ */
+ for?: TimePeriod | Template;
+}
+
+interface TriggerTime {
+ /**
+ * The time trigger is configured to fire once at a specific point in time each day.
+ * https://www.home-assistant.io/docs/automation/trigger/#time-trigger
+ */
+ platform: "time";
+
+ /**
+ * Time of day to trigger on, in HH:MM:SS, 24 hours clock format. For example: "13:30:00"
+ */
+ at: Time;
+}
+
+interface TriggerTimePattern {
+ /**
+ * With the time pattern trigger, you can match if the hour, minute or second of the current time matches a specific value.
+ * https://www.home-assistant.io/docs/automation/trigger/#time-pattern-trigger
+ */
+ platform: "time_pattern";
+
+ /**
+ * The hour or hours to trigger on.
+ * You can prefix the value with a / to match whenever the value is divisible by that number. You can specify * to match any value.
+ * https://www.home-assistant.io/docs/automation/trigger/#time-pattern-trigger
+ */
+ hours?: string;
+
+ /**
+ * The minute or minutes to trigger on.
+ * You can prefix the value with a / to match whenever the value is divisible by that number. You can specify * to match any value.
+ * https://www.home-assistant.io/docs/automation/trigger/#time-pattern-trigger
+ */
+ minutes?: string | number;
+
+ /**
+ * The second or seconds to trigger on.
+ * You can prefix the value with a / to match whenever the value is divisible by that number. You can specify * to match any value.
+ * https://www.home-assistant.io/docs/automation/trigger/#time-pattern-trigger
+ */
+ seconds?: string | number;
+}
+
+interface TriggerWebhook {
+ /**
+ * Webhook trigger fires when a web request is made to the webhook endpoint.
+ * https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger
+ */
+ platform: "webhook";
+
+ /**
+ * The webhook ID to use, defines the endpoint: /api/webhook/
+ * https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger
+ */
+ webhook_id: string;
+}
+
+interface TriggerZone {
+ /**
+ * Zone trigger fires when an entity is entering or leaving the zone. For zone automation to work, you need to have setup a device tracker platform that supports reporting GPS coordinates.
+ * https://www.home-assistant.io/docs/automation/trigger/#zone-trigger
+ */
+ platform: "zone";
+
+ /**
+ * The entity ID(s) of the device tracker(s) to monitor on a given zone.
+ * https://www.home-assistant.io/docs/automation/trigger/#zone-trigger
+ */
+ entity_id: EntityDeviceTracker | EntityDeviceTracker[];
+
+ /**
+ * The zone(s) to monitor for the given device tracker(s).
+ * https://www.home-assistant.io/docs/automation/trigger/#zone-trigger
+ */
+ zone: EntityZone | EntityZone[];
+
+ /**
+ * Trigger when the entity leaves or enters the zone(s) defined.
+ * https://www.home-assistant.io/docs/automation/trigger/#zone-trigger
+ */
+ event: "enter" | "leave";
+}
diff --git a/src/language-service/src/schemas/integrations/group.ts b/src/language-service/src/schemas/integrations/group.ts
new file mode 100644
index 0000000000..5f01554583
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/group.ts
@@ -0,0 +1,36 @@
+/**
+ * Group integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/group/__init__.py
+ */
+import { Entity, Entities, IncludeNamed } from "../types";
+
+export type Domain = "group";
+export interface Schema {
+ [key: string]: Item | IncludeNamed;
+}
+
+interface Item {
+ /**
+ * Set this to true if the group state should only turn on if all grouped entities are on, false otherwise.
+ * https://www.home-assistant.io/integrations/group
+ */
+ all?: boolean;
+
+ /**
+ * A list of entities to group.
+ * https://www.home-assistant.io/integrations/group#entities
+ */
+ entities: Entities | Entity[];
+
+ /**
+ * The icon that shows in the frontend.
+ * https://www.home-assistant.io/integrations/group#icon
+ */
+ icon?: string;
+
+ /**
+ * Name of the group.
+ * https://www.home-assistant.io/integrations/group#name
+ */
+ name?: string;
+}
diff --git a/src/language-service/src/schemas/integrations/hacs.ts b/src/language-service/src/schemas/integrations/hacs.ts
new file mode 100644
index 0000000000..ba88aeba22
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/hacs.ts
@@ -0,0 +1,71 @@
+/**
+ * Home Assistant Community Store
+ * https://hacs.xyz/
+ * Source: https://github.com/hacs/integration/blob/1.1.2/custom_components/hacs/configuration_schema.py
+ */
+import { Secret } from "../types";
+
+export type Domain = "hacs";
+export interface Schema {
+ /**
+ * Github Personal Access Token.
+ * https://hacs.xyz/docs/configuration/legacy
+ *
+ * @TJS-pattern ^[0-9a-fA-F]{40}$
+ */
+ token: string | Secret;
+
+ /**
+ * Enable tracking of AppDaemon apps.
+ * https://hacs.xyz/docs/configuration/legacy
+ */
+ appdaemon?: boolean;
+
+ /**
+ * Enable hacs debug mode.
+ * https://hacs.xyz/docs/configuration/legacy
+ */
+ debug?: boolean;
+
+ /**
+ * Boolean to enable experimental features.
+ * https://hacs.xyz/docs/configuration/legacy
+ */
+ experimental?: boolean;
+
+ /**
+ * Development option to point to the development repository of the frontend.
+ */
+ frontend_repo_url?: string;
+
+ /**
+ * Development option to point to the development repository of the frontend.
+ */
+ frontend_repo?: string;
+
+ /**
+ * Enable tracking of NetDaemon apps.
+ * https://hacs.xyz/docs/configuration/legacy
+ */
+ netdaemon?: boolean;
+
+ /**
+ * Number of releases to show in the version selector.
+ * https://hacs.xyz/docs/configuration/legacy
+ *
+ * @TSJ-type integer
+ */
+ release_limit?: number;
+
+ /**
+ * The icon used for the sidepanel link.
+ * https://hacs.xyz/docs/configuration/legacy
+ */
+ sidepanel_icon?: string;
+
+ /**
+ * he name used for the sidepanel link.
+ * https://hacs.xyz/docs/configuration/legacy
+ */
+ sidepanel_title?: string;
+}
diff --git a/src/language-service/src/schemas/integrations/hue.ts b/src/language-service/src/schemas/integrations/hue.ts
new file mode 100644
index 0000000000..a676b412b4
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/hue.ts
@@ -0,0 +1,36 @@
+/**
+ * Hue integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/hue/__init__.py
+ */
+import { IncludeList, Deprecated } from "../types";
+
+export type Domain = "hue";
+export interface Schema {
+ bridges: Item[] | IncludeList;
+}
+
+interface Item {
+ /**
+ * DEPRECATED as of Home Assistant 0.113.0
+ *
+ * The Philips Hue integration allows you to control and monitor the lights and motion sensors connected to your Hue bridge.
+ * https://www.home-assistant.io/integrations/hue
+ */
+ allow_hue_groups?: Deprecated;
+
+ /**
+ * DEPRECATED as of Home Assistant 0.113.0
+ *
+ * The Philips Hue integration allows you to control and monitor the lights and motion sensors connected to your Hue bridge.
+ * https://www.home-assistant.io/integrations/hue
+ */
+ allow_unreachable?: Deprecated;
+
+ /**
+ * DEPRECATED as of Home Assistant 0.113.0
+ *
+ * The Philips Hue integration allows you to control and monitor the lights and motion sensors connected to your Hue bridge.
+ * https://www.home-assistant.io/integrations/hue
+ */
+ host: Deprecated;
+}
diff --git a/src/language-service/src/schemas/integrations/index.d.ts b/src/language-service/src/schemas/integrations/index.d.ts
new file mode 100644
index 0000000000..fb94d5a720
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/index.d.ts
@@ -0,0 +1,8 @@
+export * as Automation from "./automation";
+export * as Group from "./group";
+export * as HACS from "./hacs";
+export * as Hue from "./hue";
+export * as InputBoolean from "./input_boolean";
+export * as PanelIframe from "./panel_iframe";
+export * as Scene from "./scene";
+export * as Script from "./script";
diff --git a/src/language-service/src/schemas/integrations/input_boolean.ts b/src/language-service/src/schemas/integrations/input_boolean.ts
new file mode 100644
index 0000000000..91b464d709
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/input_boolean.ts
@@ -0,0 +1,30 @@
+/**
+ * Input Boolean integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/input_boolean/__init__.py
+ */
+import { IncludeNamed } from "../types";
+
+export type Domain = "input_boolean";
+export interface Schema {
+ [key: string]: Item | IncludeNamed | null;
+}
+
+interface Item {
+ /**
+ * The icon that shows in the frontend.
+ * https://www.home-assistant.io/integrations/input_boolean#icon
+ */
+ icon?: string;
+
+ /**
+ * Initial value when Home Assistant starts.
+ * https://www.home-assistant.io/integrations/input_boolean#initial
+ */
+ initial?: boolean;
+
+ /**
+ * Name of the input boolean.
+ * https://www.home-assistant.io/integrations/input_boolean#name
+ */
+ name?: string;
+}
diff --git a/src/language-service/src/schemas/integrations/panel_iframe.ts b/src/language-service/src/schemas/integrations/panel_iframe.ts
new file mode 100644
index 0000000000..f2c91aacbe
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/panel_iframe.ts
@@ -0,0 +1,38 @@
+/**
+ * iframe Panel integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/panel_iframe/__init__.py
+ */
+import { IncludeNamed, Secret } from "../types";
+
+export type Domain = "panel_iframe";
+export interface Schema {
+ [key: string]: Item | IncludeNamed;
+}
+
+interface Item {
+ /**
+ * The icon that shows in the sidebar/menu.
+ * https://www.home-assistant.io/integrations/panel_iframe/#icon
+ */
+ icon?: string;
+
+ /**
+ * If admin access is required to see this iframe.
+ * https://www.home-assistant.io/integrations/panel_iframe/#require_admin
+ */
+ require_admin?: boolean;
+
+ /**
+ * Friendly title for the panel. Will be used in the sidebar/menu.
+ * https://www.home-assistant.io/integrations/panel_iframe/#title
+ */
+ title: string;
+
+ /**
+ * The absolute URL or relative URL with an absolute path to open.
+ * https://www.home-assistant.io/integrations/panel_iframe/#url
+ *
+ * @TJS-format uri
+ */
+ url: string | Secret;
+}
diff --git a/src/language-service/src/schemas/integrations/scene.ts b/src/language-service/src/schemas/integrations/scene.ts
new file mode 100644
index 0000000000..4d5faa461c
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/scene.ts
@@ -0,0 +1,66 @@
+/**
+ * Scene integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/scene/__init__.py
+ */
+import { IncludeNamed, IncludeList, Deprecated } from "../types";
+
+export type Domain = "scene";
+export type Schema = Item[] | IncludeList;
+
+interface Item {
+ /**
+ * Entities to control and their desired state.
+ * https://www.home-assistant.io/integrations/scene#entities
+ */
+ entities:
+ | {
+ [entity: string]: ItemEntity;
+ }
+ | IncludeNamed;
+
+ /**
+ * The icon that shows in the frontend.
+ * https://www.home-assistant.io/integrations/scene#icon
+ */
+ icon?: string;
+
+ /**
+ * A unique identifier for this automation.
+ * Do not use the same twice, ever!
+ * https://www.home-assistant.io/integrations/scene
+ */
+ id?: string;
+
+ /**
+ * Friendly name of scene.
+ * https://www.home-assistant.io/integrations/scene#name
+ */
+ name: string;
+}
+
+/**
+ * @TJS-additionalProperties true
+ */
+export interface ItemEntity {
+ state?: string;
+ /**
+ * @TSJ-type integer
+ * @minimum 0
+ * @maximum 255
+ */
+ brightness?: number | string;
+ source?: string;
+ /**
+ * @minimum 1
+ */
+ color_temp?: number | string;
+ xy_color?: any;
+
+ /**
+ * DEPRECATED.
+ *
+ * Using transitions on scene using this property is no longer supported.
+ * Alternative: https://www.home-assistant.io/docs/scene/#using-scene-transitions
+ */
+ transition?: Deprecated;
+}
diff --git a/src/language-service/src/schemas/integrations/script.ts b/src/language-service/src/schemas/integrations/script.ts
new file mode 100644
index 0000000000..95b7ed370a
--- /dev/null
+++ b/src/language-service/src/schemas/integrations/script.ts
@@ -0,0 +1,76 @@
+/**
+ * Group integration
+ * Source: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/__init__.py
+ */
+import { IncludeNamed, IncludeList } from "../types";
+import { Action } from "../actions";
+
+export type Domain = "script";
+export interface Schema {
+ [key: string]: Item | IncludeNamed;
+}
+
+type Mode = "single" | "restart" | "queued" | "parallel";
+
+interface Item {
+ /**
+ * Alias will be used to generate an entity_id from.
+ * https://www.home-assistant.io/integrations/script/#alias
+ */
+ alias?: string;
+
+ /**
+ * Description of the automation.
+ * This is helpful to know what the automation does.
+ * https://www.home-assistant.io/integrations/script/#description
+ */
+ description?: string;
+
+ /**
+ * A list of variables that can be passed into this script when calling it. They become available within the templates in that script.
+ * https://www.home-assistant.io/integrations/script/#passing-variables-to-scripts
+ */
+ fields?: {
+ [key: string]: Field;
+ };
+
+ /**
+ * The icon that shows in the frontend.
+ * https://www.home-assistant.io/integrations/script/#icon
+ */
+ icon?: string;
+
+ /**
+ * Controls maximum number of runs executing and/or queued up to run at a time. Only valid with modes queued and parallel.
+ * https://www.home-assistant.io/integrations/script/#max
+ *
+ * @TJS-type integer
+ */
+ max?: number;
+
+ /**
+ * Controls what happens when script is invoked while it is still running from one or more previous invocations.
+ * https://www.home-assistant.io/integrations/script/#script-modes
+ */
+ mode?: Mode;
+
+ /**
+ * The sequence of actions to be performed in the script.
+ * https://www.home-assistant.io/integrations/script/#sequence
+ */
+ sequence: Action | Action[] | IncludeList;
+}
+
+interface Field {
+ /**
+ * Description of this script parameter.
+ * https://www.home-assistant.io/integrations/script/#description
+ */
+ description?: string;
+
+ /**
+ * An example value for this script paramter.
+ * https://www.home-assistant.io/integrations/script/#example
+ */
+ example?: string;
+}
diff --git a/src/language-service/src/schemas/mappings.json b/src/language-service/src/schemas/mappings.json
index 52d9ff3f2b..5c463d0be7 100644
--- a/src/language-service/src/schemas/mappings.json
+++ b/src/language-service/src/schemas/mappings.json
@@ -1,77 +1,77 @@
[
{
"key": "homeassistant",
- "path": "configuration.yaml",
+ "path": "configuration.yaml",
"file": "homeassistant.json",
"tsFile": "homeassistant.ts",
"fromType": "HomeAssistantRoot"
},
{
"key": "homeassistant-packages",
- "path": "configuration.yaml/homeassistant/packages",
+ "path": "configuration.yaml/homeassistant/packages",
"file": "homeassistant-packages.json",
"tsFile": "homeassistant.ts",
"fromType": "HomeAssistantRoot"
},
{
"key": "homeassistant-customize",
- "path": "configuration.yaml/homeassistant/customize",
+ "path": "configuration.yaml/homeassistant/customize",
"file": "homeassistant-customize.json",
"tsFile": "homeassistant.ts",
- "fromType": "CustomizeFile"
+ "fromType": "CoreCustomize"
},
{
"key": "homeassistant-scene",
- "path": "configuration.yaml/scene",
+ "path": "configuration.yaml/scene",
"file": "homeassistant-scene.json",
- "tsFile": "homeassistant.ts",
- "fromType": "SceneComponentEntries"
+ "tsFile": "integrations/scene.ts",
+ "fromType": "Schema"
},
{
"key": "homeassistant-input-boolean",
- "path": "configuration.yaml/input_boolean",
+ "path": "configuration.yaml/input_boolean",
"file": "homeassistant-input-boolean.json",
- "tsFile": "homeassistant.ts",
- "fromType": "InputBooleanEntry"
+ "tsFile": "integrations/input_boolean.ts",
+ "fromType": "Schema"
},
{
"key": "homeassistant-script",
- "path": "configuration.yaml/script",
+ "path": "configuration.yaml/script",
"file": "homeassistant-script.json",
- "tsFile": "homeassistant.ts",
- "fromType": "ScriptFile"
- },
+ "tsFile": "integrations/script.ts",
+ "fromType": "Schema"
+ },
{
"key": "homeassistant-sensor",
- "path": "configuration.yaml/sensor",
+ "path": "configuration.yaml/sensor",
"file": "homeassistant-sensor.json",
"tsFile": "sensors.ts",
"fromType": "SensorFile"
- },
+ },
{
"key": "automations",
- "path": "configuration.yaml/automation",
+ "path": "configuration.yaml/automation",
"file": "automations.json",
- "tsFile": "automation.ts",
- "fromType": "AutomationsFile"
+ "tsFile": "integrations/automation.ts",
+ "fromType": "Schema"
},
{
"key": "ui-lovelace",
- "path": "ui-lovelace.yaml",
+ "path": "ui-lovelace.yaml",
"file": "ui-lovelace.json",
"tsFile": "ui-lovelace.ts",
"fromType": "LovelaceConfig"
},
{
"key": "lovelace-views",
- "path": "ui-lovelace.yaml/views",
+ "path": "ui-lovelace.yaml/views",
"file": "lovelace-views.json",
"tsFile": "ui-lovelace.ts",
"fromType": "LovelaceViewConfigs"
},
{
"key": "lovelace-cards",
- "path": "ui-lovelace.yaml/views/cards",
+ "path": "ui-lovelace.yaml/views/cards",
"file": "lovelace-cards.json",
"tsFile": "ui-lovelace.ts",
"fromType": "LoveLaceCardFile"
diff --git a/src/language-service/src/schemas/schemaService.ts b/src/language-service/src/schemas/schemaService.ts
index f2bd0005f3..b74583cdef 100644
--- a/src/language-service/src/schemas/schemaService.ts
+++ b/src/language-service/src/schemas/schemaService.ts
@@ -1,62 +1,73 @@
import * as path from "path";
import * as fs from "fs";
-import { HaFileInfo } from "../haConfig/dto";
-import { ISchemaContributions } from 'vscode-json-languageservice/lib/umd/services/jsonSchemaService';
import { JSONSchema } from "yaml-language-server/out/server/src/languageservice/jsonSchema";
+import { HaFileInfo } from "../haConfig/dto";
export class SchemaServiceForIncludes {
+ private mappings: Array;
- private mappings: Array;
+ constructor() {
+ const jsonPathMappings = path.join(__dirname, "mappings.json");
+ const mappingFileContents = fs.readFileSync(jsonPathMappings, "utf-8");
+ this.mappings = JSON.parse(mappingFileContents);
+ this.mappings.forEach((mapping) => {
+ const jsonPath = path.join(__dirname, "json", mapping.file);
+ const filecontents = fs.readFileSync(jsonPath, "utf-8");
+ const schema = JSON.parse(filecontents);
+ mapping.schema = schema;
+ });
+ }
- constructor() {
- let jsonPath = path.join(__dirname, "mappings.json");
- let filecontents = fs.readFileSync(jsonPath, "utf-8");
- this.mappings = JSON.parse(filecontents);
- this.mappings.forEach(mapping => {
- var jsonPath = path.join(__dirname, "json", mapping.file);
- var filecontents = fs.readFileSync(jsonPath, "utf-8");
- var schema = JSON.parse(filecontents);
- mapping.schema = schema;
- });
- }
+ public getSchemaContributions(haFiles: HaFileInfo[]): any {
+ const results: Array<{
+ uri: string;
+ fileMatch?: string[];
+ schema?: JSONSchema;
+ }> = [];
- public getSchemaContributions(haFiles: HaFileInfo[]): ISchemaContributions {
- let results: Array<{ uri: string, fileMatch?: string[], schema?: JSONSchema }> = [];
+ for (const [sourceFile, sourceFileMapping] of haFiles.entries()) {
+ let sourceFileMappingPath = sourceFileMapping.path.replace(
+ "homeassistant/packages/",
+ ""
+ );
+ sourceFileMappingPath = sourceFileMappingPath.replace(
+ /cards\/cards/g,
+ "cards"
+ );
- for (var sourceFile in haFiles) {
- var sourceFileMapping = haFiles[sourceFile];
- let sourceFileMappingPath = sourceFileMapping.path.replace("homeassistant/packages/", "");
- sourceFileMappingPath = sourceFileMappingPath.replace(/cards\/cards/g, "cards");
+ const relatedPathToSchemaMapping = this.mappings.find(
+ (x) => x.path === sourceFileMappingPath
+ );
+ if (relatedPathToSchemaMapping) {
+ const id = `http://schemas.home-assistant.io/${relatedPathToSchemaMapping.key}`;
+ let relativePath = path.relative(
+ process.cwd(),
+ haFiles[sourceFile].filename
+ );
+ relativePath = relativePath.replace("\\", "/");
+ const fileass = `**/${encodeURI(relativePath)}`;
+ let resultEntry = results.find((x) => x.uri === id);
- var relatedPathToSchemaMapping = this.mappings.find(x => x.path === sourceFileMappingPath);
- if (relatedPathToSchemaMapping) {
- let id = `http://schemas.home-assistant.io/${relatedPathToSchemaMapping.key}`;
- let relativePath = path.relative(process.cwd(), haFiles[sourceFile].filename);
- relativePath = relativePath.replace("\\","/");
- let fileass = `**/${encodeURI(relativePath)}`;
- let resultEntry = results.find(x => x.uri === id);
-
- if (!resultEntry) {
- resultEntry = {
- uri: id,
- fileMatch: [fileass],
- schema: relatedPathToSchemaMapping.schema
- };
- results.push(resultEntry);
- }
- else {
- resultEntry.fileMatch.push(fileass);
- }
- }
+ if (!resultEntry) {
+ resultEntry = {
+ uri: id,
+ fileMatch: [fileass],
+ schema: relatedPathToSchemaMapping.schema,
+ };
+ results.push(resultEntry);
+ } else if (resultEntry.fileMatch !== undefined) {
+ resultEntry.fileMatch.push(fileass);
}
- return results;
+ }
}
+ return results;
+ }
}
export interface PathToSchemaMapping {
- key: string;
- path: string;
- file: string;
- tsFile: string;
- fromType: string;
-}
\ No newline at end of file
+ key: string;
+ path: string;
+ file: string;
+ tsFile: string;
+ fromType: string;
+}
diff --git a/src/language-service/src/schemas/sensors.ts b/src/language-service/src/schemas/sensors.ts
index a5cf71f996..95d79bfc67 100644
--- a/src/language-service/src/schemas/sensors.ts
+++ b/src/language-service/src/schemas/sensors.ts
@@ -1,4 +1,3 @@
-
export type Sensors = MqttSensor | TemplateSensor | OtherSensor;
export type SensorFile = Sensors | Sensors[];
@@ -7,50 +6,51 @@ export type SensorFile = Sensors | Sensors[];
* @TJS-additionalProperties true
*/
export interface OtherSensor {
- /**
- * @TJS-pattern (^(?!.*(mqtt|template)).*)$
- */
- platform: string;
+ /**
+ * @TJS-pattern (^(?!.*(mqtt|template)).*)$
+ */
+ platform: string;
}
export interface MqttSensor {
- platform: "mqtt";
- state_topic: string;
- name?: string;
- qos?: number;
- unit_of_measurement?: string;
- icon?: string;
- expire_after?: number;
- value_template?: string;
- force_update?: boolean;
- availability_topic?: string;
- payload_available?: string;
- payload_not_available?: string;
- json_attributes?: string | string[];
- json_attributes_template?: string;
- json_attributes_topic?: string;
- unique_id?: string;
- device_class?: string;
- device?: any;
+ platform: "mqtt";
+ state_topic: string;
+ name?: string;
+ qos?: number;
+ unit_of_measurement?: string;
+ icon?: string;
+ expire_after?: number;
+ value_template?: string;
+ force_update?: boolean;
+ availability_topic?: string;
+ payload_available?: string;
+ payload_not_available?: string;
+ json_attributes?: string | string[];
+ json_attributes_template?: string;
+ json_attributes_topic?: string;
+ unique_id?: string;
+ device_class?: string;
+ device?: any;
+ scan_interval?: number;
}
export interface TemplateSensor {
- platform: "template";
- sensors: {
- [key: string]: TemplateSensorEntry;
- };
+ platform: "template";
+ sensors: {
+ [key: string]: TemplateSensorEntry;
+ };
}
export interface TemplateSensorEntry {
- friendly_name?: string;
- friendly_name_template?: string;
- entity_id?: string | string[];
- unit_of_measurement?: string;
- value_template?: string;
- icon_template?: string;
- entity_picture_template?: string;
- attribute_templates?: {
- [key: string]: string
- };
- availability_template?: string | boolean;
- device_class?: string;
+ friendly_name?: string;
+ friendly_name_template?: string;
+ entity_id?: string | string[];
+ unit_of_measurement?: string;
+ value_template?: string;
+ icon_template?: string;
+ entity_picture_template?: string;
+ attribute_templates?: {
+ [key: string]: string;
+ };
+ availability_template?: string | boolean;
+ device_class?: string;
}
diff --git a/src/language-service/src/schemas/types.ts b/src/language-service/src/schemas/types.ts
new file mode 100644
index 0000000000..08c4909650
--- /dev/null
+++ b/src/language-service/src/schemas/types.ts
@@ -0,0 +1,757 @@
+/**
+ * @TJS-pattern DEPRECATED^
+ */
+export type Deprecated = any;
+
+export type DeviceClasses =
+ | DeviceClassesBinarySensor
+ | DeviceClassesCover
+ | DeviceClassesSensor;
+
+export type DeviceClassesBinarySensor =
+ | "battery"
+ | "battery_charging"
+ | "cold"
+ | "connectivity"
+ | "door"
+ | "garage_door"
+ | "gas"
+ | "heat"
+ | "light"
+ | "lock"
+ | "moisture"
+ | "motion"
+ | "moving"
+ | "occupancy"
+ | "opening"
+ | "plug"
+ | "power"
+ | "presence"
+ | "problem"
+ | "safety"
+ | "smoke"
+ | "sound"
+ | "vibration"
+ | "window";
+
+export type DeviceClassesCover =
+ | "awning"
+ | "blind"
+ | "curtain"
+ | "damper"
+ | "door"
+ | "garage"
+ | "gate"
+ | "shade"
+ | "shutter"
+ | "window";
+
+export type DeviceClassesSensor =
+ | "battery"
+ | "humidity"
+ | "illuminance"
+ | "signal_strength"
+ | "temperature"
+ | "power"
+ | "pressure"
+ | "timestamp";
+
+/**
+ * @TJS-pattern ^(?!.+__)(?!_)[\da-z_]+(?;
+ views: Array;
background?: string;
- resources?: Array<{ type: "css" | "js" | "module" | "html"; url: string }> | IncludeTags;
+ resources?:
+ | Array<{ type: "css" | "js" | "module" | "html"; url: string }>
+ | IncludeList;
}
-
-export type LovelaceViewConfigs = LovelaceViewConfig | Array;
+export type LovelaceViewConfigs =
+ | LovelaceViewConfig
+ | Array;
/**
* @TJS-additionalProperties true
*/
export interface LovelaceViewConfig {
- id?: string | number; //Updated
+ id?: string | number;
index?: number;
title?: string;
badges?: Array;
- cards?: Array; // updated
+ cards?: Array;
path?: string;
icon?: string;
theme?: string;
@@ -50,7 +49,8 @@ export interface LovelaceBadgeConfig {
export type LoveLaceCardFile = LoveLaceCard | Array;
-export type LoveLaceCard = AlarmPanelCardConfig
+export type LoveLaceCard =
+ | AlarmPanelCardConfig
| ConditionalCardConfig
| EmptyStateCardConfig
| EntitiesCardConfig
@@ -78,7 +78,7 @@ export type LoveLaceCard = AlarmPanelCardConfig
| CustomCardConfig;
export interface LovelaceCardConfig {
- id?: string; //Updated
+ id?: string; // Updated
index?: number;
view_index?: number;
type: string;
@@ -91,7 +91,6 @@ export interface LovelaceCardConfig {
style?: string;
}
-// updated
/**
* @TJS-additionalProperties true
*/
@@ -136,14 +135,14 @@ export type ActionConfig =
| NoActionConfig;
export interface AlarmPanelCardConfig extends LovelaceCardConfig {
- type: "alarm-panel"; //Updated
+ type: "alarm-panel"; // Updated
entity: string;
name?: string;
states?: string[];
}
export interface ConditionalCardConfig extends LovelaceCardConfig {
- type: "conditional"; //Updated
+ type: "conditional"; // Updated
card: LovelaceCardConfig;
conditions: Condition[];
}
@@ -161,41 +160,50 @@ export interface EntitiesCardEntityConfig extends EntityConfig {
format?: "relative" | "total" | "date" | "time" | "datetime";
action_name?: string;
service?: string;
- service_data?: object;
+ service_data?: any;
url?: string;
tap_action?: ActionConfig;
hold_action?: ActionConfig;
double_tap_action?: ActionConfig;
- state_color?: boolean;
+ state_color?: boolean;
header?: HeaderFooterPictureWidgetConfig | HeaderFooterButtonWidgetConfig;
footer?: HeaderFooterPictureWidgetConfig | HeaderFooterButtonWidgetConfig;
}
export interface HeaderFooterPictureWidgetConfig extends LovelaceCardConfig {
- type: "picture"
- image: string
+ type: "picture";
+ image: string;
tap_action?: ActionConfig;
hold_action?: ActionConfig;
double_tap_action?: ActionConfig;
}
export interface HeaderFooterButtonWidgetConfig extends LovelaceCardConfig {
- type: "buttons"
+ type: "buttons";
entities: EntityConfig | string;
}
export interface EntitiesCardConfig extends LovelaceCardConfig {
- type: "entities"; //Updated
+ type: "entities";
show_header_toggle?: boolean;
title?: string;
- entities: Array;
+ entities: Array<
+ | EntitiesCardEntityConfig
+ | WebLinkEntityConfig
+ | CallServiceEntityConfig
+ | DividerEntityConfig
+ | SectionEntityConfig
+ | CastEntityConfig
+ | CustomEntityConfig
+ | string
+ >;
theme?: string;
icon?: string;
state_color?: boolean;
}
export interface EntityButtonCardConfig extends LovelaceCardConfig {
- type: "entity-button" | "button"; //Updated
+ type: "entity-button" | "button";
entity: string;
name?: string;
show_name?: boolean;
@@ -207,12 +215,12 @@ export interface EntityButtonCardConfig extends LovelaceCardConfig {
icon_height?: string;
double_tap_action?: ActionConfig;
}
-
export interface EntityFilterCardConfig extends LovelaceCardConfig {
- type: "entity-filter"; //Updated
+ type: "entity-filter";
entities: Array;
- state_filter: Array<{ key: string } | string>; card: Partial;
+ state_filter: Array<{ key: string } | string>;
+ card: Partial;
show_empty?: boolean;
}
@@ -228,7 +236,7 @@ export interface SeverityConfig {
}
export interface GaugeCardConfig extends LovelaceCardConfig {
- type: "gauge"; //Updated
+ type: "gauge";
entity: string;
name?: string;
unit?: string;
@@ -245,7 +253,7 @@ export interface ConfigEntity extends EntityConfig {
}
export interface GlanceCardConfig extends LovelaceCardConfig {
- type: "glance"; //Updated
+ type: "glance";
show_name?: boolean;
show_state?: boolean;
show_icon?: boolean;
@@ -256,14 +264,14 @@ export interface GlanceCardConfig extends LovelaceCardConfig {
}
export interface IframeCardConfig extends LovelaceCardConfig {
- type: "iframe"; //Updated
+ type: "iframe";
aspect_ratio?: string;
title?: string;
url: string;
}
export interface LightCardConfig extends LovelaceCardConfig {
- type: "light"; //Updated
+ type: "light";
entity: string;
name?: string;
theme?: string;
@@ -291,12 +299,12 @@ export interface MarkdownCardConfig extends LovelaceCardConfig {
}
export interface MediaControlCardConfig extends LovelaceCardConfig {
- type: "media-control"; //Updated
+ type: "media-control";
entity: string;
}
export interface PictureCardConfig extends LovelaceCardConfig {
- type: "picture"; //Updated
+ type: "picture";
image?: string;
tap_action?: ActionConfig;
hold_action?: ActionConfig;
@@ -305,12 +313,12 @@ export interface PictureCardConfig extends LovelaceCardConfig {
}
export interface PictureElementsCardConfig extends LovelaceCardConfig {
- type: "picture-elements"; //Updated
+ type: "picture-elements";
title?: string;
image?: string;
camera_image?: string;
camera_view?: any;
- state_image?: {};
+ state_image?: any;
state_filter: string[];
aspect_ratio?: string;
entity?: string;
@@ -319,13 +327,13 @@ export interface PictureElementsCardConfig extends LovelaceCardConfig {
}
export interface PictureEntityCardConfig extends LovelaceCardConfig {
- type: "picture-entity"; //Updated
+ type: "picture-entity";
entity: string;
name?: string;
image?: string;
camera_image?: string;
camera_view?: any;
- state_image?: {};
+ state_image?: any;
state_filter?: string[];
aspect_ratio?: string;
tap_action?: ActionConfig;
@@ -337,13 +345,13 @@ export interface PictureEntityCardConfig extends LovelaceCardConfig {
}
export interface PictureGlanceCardConfig extends LovelaceCardConfig {
- type: "picture-glance"; //Updated
- entities: Array; // Updated
+ type: "picture-glance";
+ entities: Array;
title?: string;
image?: string;
camera_image?: string;
camera_view?: any;
- state_image?: {};
+ state_image?: any;
state_filter?: string[];
aspect_ratio?: string;
entity?: string;
@@ -355,14 +363,14 @@ export interface PictureGlanceCardConfig extends LovelaceCardConfig {
}
export interface PlantStatusCardConfig extends LovelaceCardConfig {
- type: "plant-status"; //Updated
+ type: "plant-status";
name?: string;
entity: string;
theme?: string;
}
export interface SensorCardConfig extends LovelaceCardConfig {
- type: "sensor"; //Updated
+ type: "sensor";
entity: string;
name?: string;
icon?: string;
@@ -373,7 +381,6 @@ export interface SensorCardConfig extends LovelaceCardConfig {
hours_to_show?: number;
}
-//Updated
export interface HistoryGraphConfig extends LovelaceCardConfig {
type: "history-graph";
entities: Array;
@@ -382,25 +389,25 @@ export interface HistoryGraphConfig extends LovelaceCardConfig {
refresh_interval?: number;
}
export interface ShoppingListCardConfig extends LovelaceCardConfig {
- type: "shopping-list"; //Updated
+ type: "shopping-list";
title?: string;
}
export interface StackCardConfig extends LovelaceCardConfig {
- type: "vertical-stack" | "horizontal-stack"; //Updated
+ type: "vertical-stack" | "horizontal-stack";
title?: string;
- cards: Array;
+ cards: Array;
}
export interface ThermostatCardConfig extends LovelaceCardConfig {
- type: "thermostat"; //Updated
+ type: "thermostat";
entity: string;
theme?: string;
name?: string;
}
export interface WeatherForecastCardConfig extends LovelaceCardConfig {
- type: "weather-forecast"; //Updated
+ type: "weather-forecast";
entity: string;
name?: string;
}
@@ -459,7 +466,7 @@ export interface ImageElement {
camera_view?: string;
state_image?: any;
filter?: string;
- state_filter?: object;
+ state_filter?: any;
aspect_ratio?: string;
tap_action?: ActionConfig;
hold_action?: ActionConfig;
@@ -476,7 +483,6 @@ export interface ConditionalElement {
* @TJS-additionalProperties true
*/
export interface CustomElement {
-
/**
* @TJS-pattern custom:(.*)$
*/
@@ -490,7 +496,7 @@ export interface ElementCondition {
}
export type Elements = Array<
- StateBadgeElement
+ | StateBadgeElement
| StateIconElement
| StateLabelElement
| IconElement
diff --git a/src/language-service/tsconfig.json b/src/language-service/tsconfig.json
index 02323f91f4..21c2586c7c 100644
--- a/src/language-service/tsconfig.json
+++ b/src/language-service/tsconfig.json
@@ -1,20 +1,21 @@
{
"compilerOptions": {
- "target": "es6",
- "module": "CommonJS",
+ "module": "commonjs",
+ "target": "es2020",
"outDir": "dist",
- "moduleResolution": "node",
+ "rootDir": "src",
+ "lib": ["ES2020"],
+ "sourceMap": true,
+ "skipLibCheck": true /* todo: remove when WebSocket error is solved*/,
"resolveJsonModule": true,
+ "esModuleInterop": true,
"declaration": true,
- "rootDir": "src",
- "skipLibCheck": true, /* todo: remove when WebSocket error is solved*/
- "lib": [
- "es6"
- ],
- "sourceMap": true
+ "noEmit": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": false,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "noImplicitAny": true
},
- "include": [
- "src/**/*.ts",
- "src/**/*.json"
- ]
-}
\ No newline at end of file
+ "include": ["src/**/*.ts", "src/**/*.json"]
+}
diff --git a/src/server/fileAccessor.ts b/src/server/fileAccessor.ts
index e672ecd932..08a8124310 100644
--- a/src/server/fileAccessor.ts
+++ b/src/server/fileAccessor.ts
@@ -1,109 +1,134 @@
import { TextDocuments } from "vscode-languageserver";
+import { TextDocument } from "vscode-languageserver-textdocument";
import * as fs from "fs";
import * as path from "path";
-import * as vscodeUri from 'vscode-uri';
+import * as vscodeUri from "vscode-uri";
export interface FileAccessor {
- getFileContents(fileName: string): Promise;
- getFilesInFolder(subFolder: string): string[];
- getFilesInFolderRelativeFrom(subFolder: string, relativeFrom: string): string[];
- getFilesInFolderRelativeFromAsFileUri(subFolder: string, relativeFrom: string): string[];
- getRelativePath(relativeFrom: string, filename: string): string;
- getRelativePathAsFileUri(relativeFrom: string, filename: string): string;
- fromUriToLocalPath(uri: string): string;
+ getFileContents(fileName: string): Promise;
+ getFilesInFolder(subFolder: string): string[];
+ getFilesInFolderRelativeFrom(
+ subFolder: string,
+ relativeFrom: string
+ ): string[];
+ getFilesInFolderRelativeFromAsFileUri(
+ subFolder: string,
+ relativeFrom: string
+ ): string[];
+ getRelativePath(relativeFrom: string, filename: string): string;
+ getRelativePathAsFileUri(relativeFrom: string, filename: string): string;
+ fromUriToLocalPath(uri: string): string;
}
export class VsCodeFileAccessor implements FileAccessor {
-
- private ourRoot: string;
-
- constructor(private workspaceFolder: string, private documents: TextDocuments) {
- this.ourRoot = path.resolve();
+ private ourRoot: string;
+
+ constructor(
+ private workspaceFolder: string,
+ private documents: TextDocuments
+ ) {
+ this.ourRoot = path.resolve();
+ }
+
+ public async getFileContents(uri: string): Promise {
+ const fullUri = vscodeUri.URI.file(path.resolve(uri));
+ const textDocument = this.documents.get(fullUri.toString());
+ if (textDocument) {
+ // open file in editor, might not be saved yet
+ return textDocument.getText();
}
-
- public async getFileContents(uri: string): Promise {
- var fullUri = vscodeUri.URI.file(path.resolve(uri));
- var textDocument = this.documents.get(fullUri.toString());
- if (textDocument) {
- // open file in editor, might not be saved yet
- return textDocument.getText();
+ return new Promise((c, e) => {
+ fs.exists(uri, (exists) => {
+ if (!exists) {
+ c(null);
}
- return new Promise((c, e) => {
- fs.exists(uri, (exists) => {
- if (!exists) {
- c(null);
- }
- fs.readFile(uri, "UTF-8", (err, result) => {
- err ? e(err) : c(result);
- });
- });
+ fs.readFile(uri, "UTF-8", (err, result) => {
+ if (err) {
+ e(err);
+ } else {
+ c(result);
+ }
});
+ });
+ });
+ }
+
+ public getFilesInFolder(
+ subFolder: string,
+ filelist: string[] = []
+ ): string[] {
+ subFolder = path.normalize(subFolder);
+
+ try {
+ fs.readdirSync(subFolder).forEach((file) => {
+ filelist = fs.statSync(path.join(subFolder, file)).isDirectory()
+ ? this.getFilesInFolder(path.join(subFolder, file), filelist)
+ : filelist.concat(path.join(subFolder, file));
+ });
+ } catch (err) {
+ console.log(`Cannot find the files in folder ${subFolder}`);
}
-
- public getFilesInFolder(subFolder: string, filelist: string[] = []): string[] {
- subFolder = path.normalize(subFolder);
-
- try {
- fs.readdirSync(subFolder).forEach(file => {
- filelist = fs.statSync(path.join(subFolder, file)).isDirectory()
- ? this.getFilesInFolder(path.join(subFolder, file), filelist)
- : filelist.concat(path.join(subFolder, file));
- });
- }
- catch (err) {
- console.log(`Cannot find the files in folder ${subFolder}`);
- }
- return filelist;
- }
-
- private dealtWithRelativeFrom = (relativeFrom: string): string => {
- if (relativeFrom.startsWith("file://")) {
- relativeFrom = vscodeUri.URI.parse(relativeFrom).fsPath;
- }
- else {
- if (!relativeFrom.startsWith(this.ourRoot)) {
- relativeFrom = path.resolve(relativeFrom);
- }
- relativeFrom = vscodeUri.URI.file(relativeFrom).fsPath;
- }
- return relativeFrom;
- }
-
- public getFilesInFolderRelativeFrom(subFolder: string, relativeFrom: string): string[] {
- relativeFrom = this.dealtWithRelativeFrom(relativeFrom);
-
- var dirOfFile = path.dirname(relativeFrom);
- subFolder = path.join(dirOfFile, subFolder);
- return this.getFilesInFolder(subFolder);
- }
-
- public getFilesInFolderRelativeFromAsFileUri(subFolder: string, relativeFrom: string): string[] {
- var files = this.getFilesInFolderRelativeFrom(subFolder, relativeFrom);
- return files.map(f => vscodeUri.URI.file(f).toString());
- }
-
- public getRelativePath = (relativeFrom: string, filename: string): string => {
- relativeFrom = this.dealtWithRelativeFrom(relativeFrom);
-
- var dirOfFile = path.dirname(relativeFrom);
- let joinedPath = path.join(dirOfFile, filename);
-
- return joinedPath;
- }
-
- public getRelativePathAsFileUri = (relativeFrom: string, filename: string): string => {
- return vscodeUri.URI.file(this.getRelativePath(relativeFrom, filename)).toString();
+ return filelist;
+ }
+
+ private dealtWithRelativeFrom = (relativeFrom: string): string => {
+ if (relativeFrom.startsWith("file://")) {
+ relativeFrom = vscodeUri.URI.parse(relativeFrom).fsPath;
+ } else {
+ if (!relativeFrom.startsWith(this.ourRoot)) {
+ relativeFrom = path.resolve(relativeFrom);
+ }
+ relativeFrom = vscodeUri.URI.file(relativeFrom).fsPath;
}
-
- public fromUriToLocalPath = (uri: string): string => {
- let workspaceFolderUri = vscodeUri.URI.parse(this.workspaceFolder);
- let fileUri = vscodeUri.URI.parse(uri);
- let local = fileUri.fsPath.replace(workspaceFolderUri.fsPath, "");
- if (local[0] === "/" || local[0] === "\\") {
- local = local.substring(1);
- }
- // let joined = path.join(workspaceFolderUri.fsPath, uri);
- // let normalized = path.normalize(joined);
- return local;
+ return relativeFrom;
+ };
+
+ public getFilesInFolderRelativeFrom(
+ subFolder: string,
+ relativeFrom: string
+ ): string[] {
+ relativeFrom = this.dealtWithRelativeFrom(relativeFrom);
+
+ const dirOfFile = path.dirname(relativeFrom);
+ subFolder = path.join(dirOfFile, subFolder);
+ return this.getFilesInFolder(subFolder);
+ }
+
+ public getFilesInFolderRelativeFromAsFileUri(
+ subFolder: string,
+ relativeFrom: string
+ ): string[] {
+ const files = this.getFilesInFolderRelativeFrom(subFolder, relativeFrom);
+ return files.map((f) => vscodeUri.URI.file(f).toString());
+ }
+
+ public getRelativePath = (relativeFrom: string, filename: string): string => {
+ relativeFrom = this.dealtWithRelativeFrom(relativeFrom);
+
+ const dirOfFile = path.dirname(relativeFrom);
+ const joinedPath = path.join(dirOfFile, filename);
+
+ return joinedPath;
+ };
+
+ public getRelativePathAsFileUri = (
+ relativeFrom: string,
+ filename: string
+ ): string => {
+ return vscodeUri.URI.file(
+ this.getRelativePath(relativeFrom, filename)
+ ).toString();
+ };
+
+ public fromUriToLocalPath = (uri: string): string => {
+ const workspaceFolderUri = vscodeUri.URI.parse(this.workspaceFolder);
+ const fileUri = vscodeUri.URI.parse(uri);
+ let local = fileUri.fsPath.replace(workspaceFolderUri.fsPath, "");
+ if (local[0] === "/" || local[0] === "\\") {
+ local = local.substring(1);
}
+ // let joined = path.join(workspaceFolderUri.fsPath, uri);
+ // let normalized = path.normalize(joined);
+ return local;
+ };
}
diff --git a/src/server/server.ts b/src/server/server.ts
index 7beb21d7ba..dac5deb8a1 100644
--- a/src/server/server.ts
+++ b/src/server/server.ts
@@ -1,4 +1,13 @@
-import { createConnection, TextDocuments, ProposedFeatures, ServerCapabilities, Diagnostic } from "vscode-languageserver";
+import {
+ createConnection,
+ TextDocuments,
+ ProposedFeatures,
+ ServerCapabilities,
+ TextDocumentSyncKind,
+ Diagnostic,
+} from "vscode-languageserver";
+import { TextDocument } from "vscode-languageserver-textdocument";
+import { getLanguageService } from "yaml-language-server/out/server/src/languageservice/yamlLanguageService";
import { HaConnection } from "../language-service/src/home-assistant/haConnection";
import { ConfigurationService } from "../language-service/src/configuration";
import { HomeAssistantConfiguration } from "../language-service/src/haConfig/haConfig";
@@ -9,77 +18,83 @@ import { ScriptDefinitionProvider } from "../language-service/src/definition/scr
import { EntityIdCompletionContribution } from "../language-service/src/completionHelpers/entityIds";
import { ServicesCompletionContribution } from "../language-service/src/completionHelpers/services";
import { VsCodeFileAccessor } from "./fileAccessor";
-import { getLanguageService } from "yaml-language-server/out/server/src/languageservice/yamlLanguageService";
-let connection = createConnection(ProposedFeatures.all);
+const connection = createConnection(ProposedFeatures.all);
console.log = connection.console.log.bind(connection.console);
console.warn = connection.window.showWarningMessage.bind(connection.window);
console.error = connection.window.showErrorMessage.bind(connection.window);
-let documents = new TextDocuments();
+const documents = new TextDocuments(TextDocument);
documents.listen(connection);
-connection.onInitialize(async params => {
-
- connection.console.log(`[Home Assistant Language Server(${process.pid})] Started and initialize received`);
+connection.onInitialize((params) => {
+ connection.console.log(
+ `[Home Assistant Language Server(${process.pid})] Started and initialize received`
+ );
- var configurationService = new ConfigurationService();
- var haConnection = new HaConnection(configurationService);
- var fileAccessor = new VsCodeFileAccessor(params.rootUri, documents);
- var haConfig = new HomeAssistantConfiguration(fileAccessor, configurationService);
+ const configurationService = new ConfigurationService();
+ const haConnection = new HaConnection(configurationService);
+ const fileAccessor = new VsCodeFileAccessor(params.rootUri, documents);
+ const haConfig = new HomeAssistantConfiguration(fileAccessor);
- var definitionProviders = [
+ const definitionProviders = [
new IncludeDefinitionProvider(fileAccessor),
- new ScriptDefinitionProvider(haConfig)
+ new ScriptDefinitionProvider(haConfig),
];
- var jsonWorkerContributions = [
+ const jsonWorkerContributions = [
new EntityIdCompletionContribution(haConnection),
- new ServicesCompletionContribution(haConnection)
+ new ServicesCompletionContribution(haConnection),
];
- let schemaServiceForIncludes = new SchemaServiceForIncludes();
+ const schemaServiceForIncludes = new SchemaServiceForIncludes();
- let yamlLanguageService = getLanguageService(
+ const yamlLanguageService = getLanguageService(
+ // eslint-disable-next-line @typescript-eslint/require-await
async () => "",
null,
jsonWorkerContributions
);
- var sendDiagnostics = async (uri: string, diagnostics: Diagnostic[]) => {
+ const sendDiagnostics = (uri: string, diagnostics: Diagnostic[]) => {
connection.sendDiagnostics({
- uri: uri,
- diagnostics: diagnostics
+ uri,
+ diagnostics,
});
};
- let discoverFilesAndUpdateSchemas = async () => {
+ const discoverFilesAndUpdateSchemas = async () => {
try {
await haConfig.discoverFiles();
- await homeAsisstantLanguageService.findAndApplySchemas();
- }
- catch (e) {
- console.error(`Unexpected error during file discovery / schema configuration: ${e}`);
+ homeAsisstantLanguageService.findAndApplySchemas();
+ } catch (e) {
+ console.error(
+ `Unexpected error during file discovery / schema configuration: ${e}`
+ );
}
};
- var homeAsisstantLanguageService = new HomeAssistantLanguageService(
+ let homeAsisstantLanguageService = new HomeAssistantLanguageService(
yamlLanguageService,
haConfig,
haConnection,
definitionProviders,
schemaServiceForIncludes,
sendDiagnostics,
- async () => {
- documents.all().forEach(async d => {
- var diagnostics = await homeAsisstantLanguageService.getDiagnostics(d);
+ () => {
+ documents.all().forEach(async (d) => {
+ const diagnostics = await homeAsisstantLanguageService.getDiagnostics(
+ d
+ );
sendDiagnostics(d.uri, diagnostics);
});
}
);
- documents.onDidChangeContent((e) => homeAsisstantLanguageService.onDocumentChange(e));
+ documents.onDidChangeContent((e) =>
+ homeAsisstantLanguageService.onDocumentChange(e)
+ );
documents.onDidOpen((e) => homeAsisstantLanguageService.onDocumentOpen(e));
let onDidSaveDebounce: NodeJS.Timer;
@@ -88,12 +103,38 @@ connection.onInitialize(async params => {
onDidSaveDebounce = setTimeout(discoverFilesAndUpdateSchemas, 100);
});
- connection.onDocumentSymbol((p) => homeAsisstantLanguageService.onDocumentSymbol(documents.get(p.textDocument.uri)));
- connection.onDocumentFormatting((p) => homeAsisstantLanguageService.onDocumentFormatting(documents.get(p.textDocument.uri), p.options));
- connection.onCompletion((p) => homeAsisstantLanguageService.onCompletion(documents.get(p.textDocument.uri), p.position));
- connection.onCompletionResolve((p) => homeAsisstantLanguageService.onCompletionResolve(p));
- connection.onHover((p) => homeAsisstantLanguageService.onHover(documents.get(p.textDocument.uri), p.position));
- connection.onDefinition((p) => homeAsisstantLanguageService.onDefinition(documents.get(p.textDocument.uri), p.position));
+ connection.onDocumentSymbol((p) =>
+ homeAsisstantLanguageService.onDocumentSymbol(
+ documents.get(p.textDocument.uri)
+ )
+ );
+ connection.onDocumentFormatting((p) =>
+ homeAsisstantLanguageService.onDocumentFormatting(
+ documents.get(p.textDocument.uri),
+ p.options
+ )
+ );
+ connection.onCompletion((p) =>
+ homeAsisstantLanguageService.onCompletion(
+ documents.get(p.textDocument.uri),
+ p.position
+ )
+ );
+ connection.onCompletionResolve((p) =>
+ homeAsisstantLanguageService.onCompletionResolve(p)
+ );
+ connection.onHover((p) =>
+ homeAsisstantLanguageService.onHover(
+ documents.get(p.textDocument.uri),
+ p.position
+ )
+ );
+ connection.onDefinition((p) =>
+ homeAsisstantLanguageService.onDefinition(
+ documents.get(p.textDocument.uri),
+ p.position
+ )
+ );
connection.onDidChangeConfiguration(async (config) => {
configurationService.updateConfiguration(config);
@@ -101,33 +142,40 @@ connection.onInitialize(async params => {
if (!configurationService.isConfigured) {
connection.sendNotification("no-config");
- }
- });
-
- connection.onRequest("callService", (args: { domain: string, service: string, serviceData?: any }) => {
- haConnection.callService(args.domain, args.service, args.serviceData);
+ }
});
- connection.onRequest("checkConfig", async _ => {
- var result = await haConnection.callApi('post', 'config/core/check_config');
+
+ connection.onRequest(
+ "callService",
+ (args: { domain: string; service: string; serviceData?: any }) => {
+ void haConnection.callService(
+ args.domain,
+ args.service,
+ args.serviceData
+ );
+ }
+ );
+ connection.onRequest("checkConfig", (_) => {
+ const result = haConnection.callApi("post", "config/core/check_config");
connection.sendNotification("configuration_check_completed", result);
});
- connection.onRequest("getErrorLog", async _ => {
- var result = await haConnection.callApi('get', 'error_log');
+ connection.onRequest("getErrorLog", (_) => {
+ const result = haConnection.callApi("get", "error_log");
connection.sendNotification("get_eror_log_completed", result);
});
- //fire and forget
- setTimeout(discoverFilesAndUpdateSchemas, 0);
+ // fire and forget
+ setTimeout(discoverFilesAndUpdateSchemas, 0);
return {
capabilities: {
- textDocumentSync: documents.syncKind,
+ textDocumentSync: TextDocumentSyncKind.Full,
completionProvider: { triggerCharacters: [" "], resolveProvider: true },
hoverProvider: true,
documentSymbolProvider: true,
documentFormattingProvider: true,
- definitionProvider: true
- }
+ definitionProvider: true,
+ },
};
});
diff --git a/src/snippets/homeassistant_automation.json b/src/snippets/homeassistant_automation.json
index 114ec7610a..2fa9f2343e 100644
--- a/src/snippets/homeassistant_automation.json
+++ b/src/snippets/homeassistant_automation.json
@@ -1,55 +1,52 @@
{
- "automation": {
- "prefix": "automation",
- "body": [
- "- id: ${1:automation id}",
- " alias: ${2:automation alias (name)}",
- " trigger:",
- " condition:",
- " action:"
- ],
- "description": "Add a Home Assistant automation"
- },
- "condition state": {
- "prefix": "condition-state",
- "body": [
- " - condition: state",
- " entity_id: ${1:entity id}",
- " state: ${2: state}"
- ],
- "description": "Add a Home Assistant state condition for automation"
- },
- "condition template": {
- "prefix": "condition-template",
- "body":[
- " - condition: template",
- " value_template: \"{{ ${1: template} }}\""
- ]
- },
- "trigger state": {
- "prefix": "trigger-state",
- "body": [
- " - platform: state",
- " entity_id: ${1:entity id}",
- " from: ${2: from state}",
- " to: ${3: to state}"
- ],
- "description": "Add a Home Assistant state trigger for automation"
- },
- "action service": {
- "prefix": "action-service",
- "body": [
- " - service: ${1:service name}",
- " data_template:",
- " entity_id: "
- ],
- "description": "Add a Home Assistant service action for automation"
- },
- "action service script turn on": {
- "prefix": "action-script-on",
- "body": [
- " - service: script.turn_on",
- " entity_id: "
- ]
- }
-}
\ No newline at end of file
+ "automation": {
+ "prefix": "automation",
+ "body": [
+ "- id: ${1:automation id}",
+ " alias: ${2:automation alias (name)}",
+ " trigger:",
+ " condition:",
+ " action:"
+ ],
+ "description": "Add a Home Assistant automation"
+ },
+ "condition state": {
+ "prefix": "condition-state",
+ "body": [
+ " - condition: state",
+ " entity_id: ${1:entity id}",
+ " state: ${2: state}"
+ ],
+ "description": "Add a Home Assistant state condition for automation"
+ },
+ "condition template": {
+ "prefix": "condition-template",
+ "body": [
+ " - condition: template",
+ " value_template: \"{{ ${1: template} }}\""
+ ]
+ },
+ "trigger state": {
+ "prefix": "trigger-state",
+ "body": [
+ " - platform: state",
+ " entity_id: ${1:entity id}",
+ " from: ${2: from state}",
+ " to: ${3: to state}"
+ ],
+ "description": "Add a Home Assistant state trigger for automation"
+ },
+ "action service": {
+ "prefix": "action-service",
+ "body": [
+ " - service: ${1:service name}",
+ " data_template:",
+ " entity_id: "
+ ],
+ "description": "Add a Home Assistant service action for automation"
+ },
+ "action service script turn on": {
+ "prefix": "action-script-on",
+ "body": [" - service: script.turn_on", " entity_id: "]
+ }
+}
diff --git a/src/snippets/homeassistant_group.json b/src/snippets/homeassistant_group.json
index 724018515a..4ee7c6711a 100644
--- a/src/snippets/homeassistant_group.json
+++ b/src/snippets/homeassistant_group.json
@@ -1,13 +1,13 @@
{
- "group": {
- "prefix": "group",
- "body": [
- "${1:group id}",
- " name: ${2:group name}",
- " view: no",
- " entities:",
- " - "
- ],
- "description": "Add a Home Assistant group"
- }
-}
\ No newline at end of file
+ "group": {
+ "prefix": "group",
+ "body": [
+ "${1:group id}",
+ " name: ${2:group name}",
+ " view: no",
+ " entities:",
+ " - "
+ ],
+ "description": "Add a Home Assistant group"
+ }
+}
diff --git a/src/snippets/homeassistant_script.json b/src/snippets/homeassistant_script.json
index 8dac30497b..401b041966 100644
--- a/src/snippets/homeassistant_script.json
+++ b/src/snippets/homeassistant_script.json
@@ -1,11 +1,11 @@
{
- "script": {
- "prefix": "script",
- "body": [
- "${1:script id}",
- " alias: \"${2:script alias (name)}\"",
- " sequence:"
- ],
- "description": "Add a Home Assistant script"
- }
-}
\ No newline at end of file
+ "script": {
+ "prefix": "script",
+ "body": [
+ "${1:script id}",
+ " alias: \"${2:script alias (name)}\"",
+ " sequence:"
+ ],
+ "description": "Add a Home Assistant script"
+ }
+}
diff --git a/src/snippets/homeassistant_sensor.json b/src/snippets/homeassistant_sensor.json
index 4c169639b9..e79807a844 100644
--- a/src/snippets/homeassistant_sensor.json
+++ b/src/snippets/homeassistant_sensor.json
@@ -1,13 +1,13 @@
{
- "(binary) sensor template": {
- "prefix": "sensor-template",
- "body": [
- "- platform: template",
- " sensors:",
- " ${1:sensor name}:",
- " friendly_name: \"${2:sensor friendly name}\"",
- " value_template: {{ ${3:sensor value template} }}"
- ],
- "description": "Add a Home Assistant template (binary) sensor"
- }
-}
\ No newline at end of file
+ "(binary) sensor template": {
+ "prefix": "sensor-template",
+ "body": [
+ "- platform: template",
+ " sensors:",
+ " ${1:sensor name}:",
+ " friendly_name: \"${2:sensor friendly name}\"",
+ " value_template: {{ ${3:sensor value template} }}"
+ ],
+ "description": "Add a Home Assistant template (binary) sensor"
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
index c5aa7cba8c..8f00525040 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,24 +1,18 @@
{
"compilerOptions": {
"module": "commonjs",
- "target": "es6",
+ "target": "es2020",
"outDir": "out",
"rootDir": "src",
- "lib": [
- "es6"
- ],
+ "lib": ["ES2020"],
"sourceMap": true,
- "skipLibCheck": true, /* todo: remove when WebSocket error is solved*/
+ "skipLibCheck": true,
"resolveJsonModule": true,
- "moduleResolution": "node"
+ "esModuleInterop": true,
+ "noUnusedParameters": false,
+ "noUnusedLocals": false,
+ "noImplicitAny": false
},
- "include": [
- "src/**/*.ts",
- "src/**/*.json"
- ],
- "exclude": [
- "node_modules",
- ".vscode-test",
- "server"
- ]
-}
\ No newline at end of file
+ "include": ["src/**/*.ts", "src/**/*.json"],
+ "exclude": ["node_modules", ".vscode-test", "server"]
+}
diff --git a/tslint.json b/tslint.json
deleted file mode 100644
index c81ff28fca..0000000000
--- a/tslint.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "rules": {
- "no-string-throw": true,
- "no-unused-expression": true,
- "no-duplicate-variable": true,
- "curly": true,
- "class-name": true,
- "semicolon": [
- true,
- "always"
- ],
- "triple-equals": true
- },
- "defaultSeverity": "warning"
-}