From ca3437930361190df20cde15a25b79223a8d88f0 Mon Sep 17 00:00:00 2001 From: Armano Date: Mon, 23 Dec 2019 03:18:14 +0100 Subject: [PATCH] feat: refactor code, update dependencies and drop tslint --- .editorconfig | 1 + .eslintignore | 4 + .eslintrc.js | 16 + .github/ISSUE_TEMPLATE/feature_request.md | 1 - .prettierignore | 4 + .prettierrc.json | 3 + CODE_OF_CONDUCT.md | 20 +- README.md | 141 +- package-lock.json | 3686 --------------------- package.json | 35 +- scripts/update-ast.ts | 68 +- src/AbstractTokenizer.ts | 22 +- src/ParamsParser.ts | 566 ++-- src/Parser.ts | 143 +- src/ParserLocation.ts | 81 +- src/Symbols.ts | 6 +- src/Tokenizer.ts | 356 +- src/decorators/noParams.ts | 23 +- src/defaultConfig.ts | 12 +- src/enum/CharCodes.ts | 4 +- src/enum/Directives.ts | 2 +- src/enum/NodeNames.ts | 2 +- src/enum/Operators.ts | 36 +- src/enum/ParamNames.ts | 2 +- src/errors/ParseError.ts | 28 +- src/index.ts | 9 +- src/interface/IOptions.ts | 4 +- src/interface/ISourceLocation.ts | 4 +- src/interface/Params.ts | 110 +- src/interface/Tokens.ts | 26 +- src/nodes/AssignNode.ts | 47 +- src/nodes/AttemptNode.ts | 22 +- src/nodes/AutoEscNode.ts | 14 +- src/nodes/BreakNode.ts | 12 +- src/nodes/CommentNode.ts | 16 +- src/nodes/CompressNode.ts | 14 +- src/nodes/ConditionNode.ts | 32 +- src/nodes/EscapeNode.ts | 20 +- src/nodes/FlushNode.ts | 12 +- src/nodes/FtlNode.ts | 16 +- src/nodes/FunctionNode.ts | 20 +- src/nodes/GlobalNode.ts | 47 +- src/nodes/ImportNode.ts | 18 +- src/nodes/IncludeNode.ts | 18 +- src/nodes/InterpolationNode.ts | 18 +- src/nodes/ListNode.ts | 32 +- src/nodes/LocalNode.ts | 47 +- src/nodes/LtNode.ts | 12 +- src/nodes/MacroCallNode.ts | 28 +- src/nodes/MacroNode.ts | 20 +- src/nodes/NoAutoEscNode.ts | 14 +- src/nodes/NoEscapeNode.ts | 14 +- src/nodes/NtNode.ts | 12 +- src/nodes/OutputFormatNode.ts | 26 +- src/nodes/ProgramNode.ts | 24 +- src/nodes/ReturnNode.ts | 18 +- src/nodes/RtNode.ts | 12 +- src/nodes/SettingNode.ts | 28 +- src/nodes/StopNode.ts | 20 +- src/nodes/SwitchCaseNode.ts | 22 +- src/nodes/SwitchDefaultNode.ts | 16 +- src/nodes/SwitchNode.ts | 47 +- src/nodes/TNode.ts | 12 +- src/nodes/TextNode.ts | 16 +- src/nodes/abstract/AbstractAssign.ts | 42 +- src/nodes/abstract/AbstractBodyNode.ts | 14 +- src/nodes/abstract/AbstractNode.ts | 31 +- src/utils/Chars.ts | 49 +- src/utils/Nodes.ts | 277 +- src/utils/Params.ts | 21 +- test/params.spec.ts | 101 +- test/parser-invalid.spec.ts | 93 +- test/parser-valid.spec.ts | 103 +- test/testers/TokenizerTester.ts | 81 +- test/tokenizer-invalid.spec.ts | 160 +- test/tokenizer.spec.ts | 278 +- tsconfig.json | 9 +- tslint.json | 60 - yarn.lock | 2125 ++++++++++++ 79 files changed, 4239 insertions(+), 5366 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc.json delete mode 100644 package-lock.json delete mode 100644 tslint.json create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig index 9d08a1a..ed19d9c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,3 +7,4 @@ indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true +quote_type = single diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..b013cd9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +.github +test/resource/**/* +dist +types diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..43e7952 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,16 @@ +module.exports = { + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + // TODO: enable rules + '@typescript-eslint/interface-name-prefix': ['off'], + '@typescript-eslint/explicit-function-return-type': ['off'], + '@typescript-eslint/no-inferrable-types': ['off'], + '@typescript-eslint/no-explicit-any': ['off'], + }, +}; diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 066b2d9..a09db44 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,7 +1,6 @@ --- name: Feature request about: Suggest an idea for this project - --- **Is your feature request related to a problem? Please describe.** diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..b013cd9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +.github +test/resource/**/* +dist +types diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..bf357fb --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "trailingComma": "all" +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 920df81..68f9278 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -14,21 +14,21 @@ appearance, race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or +- The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities diff --git a/README.md b/README.md index 4938928..d1fd8df 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Freemarker Parser is a javascript implementation of the Freemarker (https://free This project contains **experimental version** of parser ftl to ast tree ## Installation + You can install `freemarker-parser` using [npm](https://npmjs.com): ```bash @@ -19,9 +20,11 @@ $ npm install freemarker-parser --save-dev ``` ## Usage + Require `freemarker-parser` inside of your JavaScript: -### Parser +### Parser + ```ftl <#assign f=1> @@ -31,17 +34,19 @@ Require `freemarker-parser` inside of your JavaScript: ${f} < 0 ``` + ```ts -const freemarker = require("freemarker-parser") +const freemarker = require('freemarker-parser'); -const parser = new freemarker.Parser() -const data = parser.parse(template) +const parser = new freemarker.Parser(); +const data = parser.parse(template); -console.log(data.ast) -console.log(data.tokens) +console.log(data.ast); +console.log(data.tokens); ``` ### Parser (bracket style) + ```ftl [#assign f=1] @@ -51,74 +56,76 @@ console.log(data.tokens) ${f} < 0 [/#if] ``` + ```ts -const freemarker = require("freemarker-parser") +const freemarker = require('freemarker-parser'); -const parser = new freemarker.Parser() +const parser = new freemarker.Parser(); const data = parser.parse(template, { useSquareTags: true, - parseLocation : true, -}) + parseLocation: true, +}); -console.log(data.ast) -console.log(data.tokens) +console.log(data.ast); +console.log(data.tokens); ``` ## Currently supported: - - interpolations `${foo}` - - methods, i.e. `${avg(3, 5)}` - - executing macro - - directives https://freemarker.apache.org/docs/ref_directives.html: - - [`#attempt`](https://freemarker.apache.org/docs/ref_directive_attempt.html) - * `#recover` - - [`#assign`](https://freemarker.apache.org/docs/ref_directive_assign.html) - - [`#global`](https://freemarker.apache.org/docs/ref_directive_global.html) - - [`#local`](https://freemarker.apache.org/docs/ref_directive_local.html) - - [`#if`](https://freemarker.apache.org/docs/ref_directive_if.html) - * `#elseif` - * `#else` - - [`#list`](https://freemarker.apache.org/docs/ref_directive_list.html) - * `#else` - * `#break` - * `#continue` - - [`#include`](https://freemarker.apache.org/docs/ref_directive_include.html) - - [`#import`](https://freemarker.apache.org/docs/ref_directive_import.html) - - [`#macro`](https://freemarker.apache.org/docs/ref_directive_macro.html) - - [`#switch`](https://freemarker.apache.org/docs/ref_directive_switch.html) - * `#case` - * `#default` - * `#break` - - [`#compress`](https://freemarker.apache.org/docs/ref_directive_compress.html) - - [`#function`](https://freemarker.apache.org/docs/ref_directive_function.html) - * `#return` - - [`#parse`](https://freemarker.apache.org/docs/ref_directive_parse.html) - - [`#noparse`](https://freemarker.apache.org/docs/ref_directive_noparse.html) - - [`#stop`](https://freemarker.apache.org/docs/ref_directive_stop.html) - - [`#setting`](https://freemarker.apache.org/docs/ref_directive_setting.html) - - [`#lt`](https://freemarker.apache.org/docs/ref_directive_lt.html) - - [`#t`](https://freemarker.apache.org/docs/ref_directive_t.html) - - [`#nt`](https://freemarker.apache.org/docs/ref_directive_nt.html) - - [`#rt`](https://freemarker.apache.org/docs/ref_directive_rt.html) - - [`#flush`](https://freemarker.apache.org/docs/ref_directive_flush.html) - - [`#escape`](https://freemarker.apache.org/docs/ref_directive_escape.html) - * `#noescape` - - [`#autoesc`](https://freemarker.apache.org/docs/ref_directive_autoesc.html) - - [`#noautoesc`](https://freemarker.apache.org/docs/ref_directive_noautoesc.html) - - [`#outputformat`](https://freemarker.apache.org/docs/ref_directive_outputformat.html) - - [`#ftl`](https://freemarker.apache.org/docs/ref_directive_ftl.html) - - comments `<#-- -->` - - built-ins: - - `?toUpperCase` - - `?toLowerCase` - - `?capitalize` - - `?length` - - `?string("yes", "no")` - - support default values, i.e. `${user!"Anonymous"}` + +- interpolations `${foo}` + - methods, i.e. `${avg(3, 5)}` +- executing macro +- directives https://freemarker.apache.org/docs/ref_directives.html: + - [`#attempt`](https://freemarker.apache.org/docs/ref_directive_attempt.html) + - `#recover` + - [`#assign`](https://freemarker.apache.org/docs/ref_directive_assign.html) + - [`#global`](https://freemarker.apache.org/docs/ref_directive_global.html) + - [`#local`](https://freemarker.apache.org/docs/ref_directive_local.html) + - [`#if`](https://freemarker.apache.org/docs/ref_directive_if.html) + - `#elseif` + - `#else` + - [`#list`](https://freemarker.apache.org/docs/ref_directive_list.html) + - `#else` + - `#break` + - `#continue` + - [`#include`](https://freemarker.apache.org/docs/ref_directive_include.html) + - [`#import`](https://freemarker.apache.org/docs/ref_directive_import.html) + - [`#macro`](https://freemarker.apache.org/docs/ref_directive_macro.html) + - [`#switch`](https://freemarker.apache.org/docs/ref_directive_switch.html) + - `#case` + - `#default` + - `#break` + - [`#compress`](https://freemarker.apache.org/docs/ref_directive_compress.html) + - [`#function`](https://freemarker.apache.org/docs/ref_directive_function.html) + - `#return` + - [`#parse`](https://freemarker.apache.org/docs/ref_directive_parse.html) - [`#noparse`](https://freemarker.apache.org/docs/ref_directive_noparse.html) + - [`#stop`](https://freemarker.apache.org/docs/ref_directive_stop.html) + - [`#setting`](https://freemarker.apache.org/docs/ref_directive_setting.html) + - [`#lt`](https://freemarker.apache.org/docs/ref_directive_lt.html) + - [`#t`](https://freemarker.apache.org/docs/ref_directive_t.html) + - [`#nt`](https://freemarker.apache.org/docs/ref_directive_nt.html) + - [`#rt`](https://freemarker.apache.org/docs/ref_directive_rt.html) + - [`#flush`](https://freemarker.apache.org/docs/ref_directive_flush.html) + - [`#escape`](https://freemarker.apache.org/docs/ref_directive_escape.html) + - `#noescape` + - [`#autoesc`](https://freemarker.apache.org/docs/ref_directive_autoesc.html) + - [`#noautoesc`](https://freemarker.apache.org/docs/ref_directive_noautoesc.html) + - [`#outputformat`](https://freemarker.apache.org/docs/ref_directive_outputformat.html) + - [`#ftl`](https://freemarker.apache.org/docs/ref_directive_ftl.html) +- comments `<#-- -->` +- built-ins: + - `?toUpperCase` + - `?toLowerCase` + - `?capitalize` + - `?length` + - `?string("yes", "no")` +- support default values, i.e. `${user!"Anonymous"}` ## TODO: - - directives: - - `#fallback` - - `#nested` - - `#recurse` - - `#visit` - - `#items` + +- directives: + - `#fallback` + - `#nested` + - `#recurse` + - `#visit` + - `#items` diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 2dcaeb5..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3686 +0,0 @@ -{ - "name": "freemarker-parser", - "version": "1.1.6", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", - "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", - "dev": true - }, - "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" - } - }, - "@babel/traverse": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", - "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/types": "^7.4.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "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" - } - } - } - }, - "@babel/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@types/events": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true - }, - "@types/node": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", - "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", - "dev": true - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "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": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "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=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "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": "http://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" - } - }, - "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 - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "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" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codecov": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.1.0.tgz", - "integrity": "sha512-aWQc/rtHbcWEQLka6WmBAOpV58J2TwyXqlpAQGhQaSiEUoigTTUk6lLd2vB3kXkhnDyzyH74RXfmV4dq2txmdA==", - "dev": true, - "requires": { - "argv": "^0.0.2", - "ignore-walk": "^3.0.1", - "js-yaml": "^3.12.0", - "request": "^2.87.0", - "urlgrey": "^0.4.4" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "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 - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "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 - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "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" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "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 - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "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.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "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==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "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": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "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 - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "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" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "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 - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "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" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "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 - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "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" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "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-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": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "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 - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "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=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz", - "integrity": "sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz", - "integrity": "sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg==", - "dev": true, - "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.4", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz", - "integrity": "sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.4", - "make-dir": "^2.1.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz", - "integrity": "sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.4", - "make-dir": "^2.1.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.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" - } - }, - "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 - } - } - }, - "istanbul-reports": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.2.tgz", - "integrity": "sha512-ZFuTdBQ3PSaPnm02aEA4R6mzQ2AF9w03CYiXADzWbbE48v/EFOWF4MaX4FT0NRdqIk48I7o0RPi+S8TMswaCbQ==", - "dev": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "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 - }, - "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", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "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=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "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" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "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 - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, - "requires": { - "mime-db": "~1.37.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "mocha": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.0.0.tgz", - "integrity": "sha512-A7g9k3yr8oJaXn2IItFnfgjyxFc/LTe6Wwv7FczP+e8G74o9xYNSbMYmCf1ouldRojLrFcOb+z75P6Ak0GX6ug==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "findup-sync": "2.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.12.0", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.4", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "12.0.5", - "yargs-parser": "11.1.1", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "mocha-junit-reporter": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.18.0.tgz", - "integrity": "sha512-y3XuqKa2+HRYtg0wYyhW/XsLm2Ps+pqf9HaTAt7+MVUAKFJaNAHOrNseTZo9KCxjfIbxUWwckP5qCDDPUmjSWA==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz", - "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "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": { - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nyc": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.0.0.tgz", - "integrity": "sha512-R1zC6UZak6pzn5BZQorkSH5GdOGafrwyeja+eimS5Tu+KJ/hCgBc8qA1QWSzxQmT2FDl2lbpqPw7tBDbSvhAHg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.4", - "istanbul-lib-hook": "^2.0.6", - "istanbul-lib-instrument": "^3.2.0", - "istanbul-lib-report": "^2.0.7", - "istanbul-lib-source-maps": "^3.0.5", - "istanbul-reports": "^2.2.2", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.2", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.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 - }, - "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 - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.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==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "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.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "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.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "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 - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true - }, - "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": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "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==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "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" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "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 - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "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" - } - }, - "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 - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "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 - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "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 - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", - "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", - "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" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.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" - } - }, - "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-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.2.tgz", - "integrity": "sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "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-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "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" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "ts-node": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz", - "integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" - } - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "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=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "typescript": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.4.tgz", - "integrity": "sha512-JZHJtA6ZL15+Q3Dqkbh8iCUmvxD3iJ7ujXS+fVkKnwIVAdHc5BJTDNM0aTrnr2luKulFjU7W+SRhDZvi66Ru7Q==", - "dev": true - }, - "uglify-js": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz", - "integrity": "sha512-GpKo28q/7Bm5BcX9vOu4S46FwisbPbAmkkqPnGIpKvKTM96I85N6XHQV+k4I6FA2wxgLhcsSyHoNhzucwCflvA==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, - "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, - "optional": true - } - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "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", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", - "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 76fe1cb..3e4f378 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,15 @@ "version": "1.1.6", "description": "Freemarker Parser is a javascript implementation of the Freemarker", "scripts": { - "build": "npm run lint & tsc", + "build": "npm run lint & npm run format-check & tsc", "pretest": "npm run build", "mocha": "nyc mocha \"test/*.spec.ts\" --reporter=mocha-junit-reporter --reporter-options mochaFile=./test-results/mocha/results.xml", "test": "npm run mocha", "posttest": "nyc report --reporter=lcovonly && codecov -f coverage/*.info", - "lint": "tslint '**/*.ts'", - "lint-fix": "tslint '**/*.ts' --fix", + "format": "prettier --write \"./**/*.{ts,js,json,md}\"", + "format-check": "prettier --list-different \"./**/*.{ts,js,json,md}\"", + "lint": "eslint . --ext .js,.ts", + "lint-fix": "eslint . --ext .js,.ts --fix", "update-ast": "ts-node ./scripts/update-ast.ts", "watch": "tsc --watch", "coverage": "nyc mocha \"test/*.ts\" && nyc report --reporter html" @@ -33,7 +35,7 @@ "ftl" ], "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" }, "author": "Armano (https://github.com/armano2)", "license": "MIT", @@ -43,17 +45,20 @@ "homepage": "https://github.com/armano2/freemarker-parser#readme", "devDependencies": { "@types/glob": "^7.1.1", - "@types/mocha": "^5.2.5", - "@types/node": "^12.0.0", - "codecov": "^3.1.0", - "glob": "^7.1.3", - "mocha": "^6.0.0", - "mocha-junit-reporter": "^1.18.0", - "nyc": "^14.0.0", - "source-map-support": "^0.5.9", - "ts-node": "^8.0.3", - "tslint": "^5.11.0", - "typescript": "^3.1.4" + "@types/mocha": "^5.2.7", + "@types/node": "^12.12.21", + "@typescript-eslint/eslint-plugin": "^2.12.0", + "@typescript-eslint/parser": "^2.12.0", + "codecov": "^3.6.1", + "eslint": "^6.8.0", + "glob": "^7.1.6", + "mocha": "^6.2.2", + "mocha-junit-reporter": "^1.23.1", + "nyc": "^15.0.0", + "prettier": "^1.19.1", + "source-map-support": "^0.5.16", + "ts-node": "^8.5.4", + "typescript": "^3.7.4" }, "dependencies": {}, "nyc": { diff --git a/scripts/update-ast.ts b/scripts/update-ast.ts index 9a9fdba..00d2877 100644 --- a/scripts/update-ast.ts +++ b/scripts/update-ast.ts @@ -1,36 +1,46 @@ -import fs = require('fs') -import glob = require('glob') -import path = require('path') -import { Parser } from '../src' +import fs = require('fs'); +import glob = require('glob'); +import path = require('path'); +import { Parser } from '../src'; -const parser = new Parser() +const parser = new Parser(); -const testsPath = path.join(__dirname, '..', 'test', 'resource') +const testsPath = path.join(__dirname, '..', 'test', 'resource'); -function stringify (text : any) { - return JSON.stringify(text, null, 2) +function stringify(text: any) { + return JSON.stringify(text, null, 2); } -glob('./**/*.ftl', { cwd: testsPath, nodir: true, absolute: true }, (e, files) => { - if (e) { - throw e - } - for (const file of files) { - fs.readFile(file, 'utf8', (err, template) => { - if (err) { - throw err - } - const dirname = path.dirname(file) - const basename = path.basename(file).replace(path.extname(file), '') +glob( + './**/*.ftl', + { cwd: testsPath, nodir: true, absolute: true }, + (e, files) => { + if (e) { + throw e; + } + for (const file of files) { + fs.readFile(file, 'utf8', (err, template) => { + if (err) { + throw err; + } + const dirname = path.dirname(file); + const basename = path.basename(file).replace(path.extname(file), ''); - // tslint:disable-next-line:no-console - console.log(`Updating data ${basename}`) - // tslint:disable-next-line:no-console - console.log(' file:', path.relative(testsPath, file)) + // tslint:disable-next-line:no-console + console.log(`Updating data ${basename}`); + // tslint:disable-next-line:no-console + console.log(' file:', path.relative(testsPath, file)); - const data = parser.parse(template) - fs.writeFileSync(path.join(dirname, `${basename}-tokens.json`), stringify(data.tokens)) - fs.writeFileSync(path.join(dirname, `${basename}-ast.json`), stringify(data.ast)) - }) - } -}) + const data = parser.parse(template); + fs.writeFileSync( + path.join(dirname, `${basename}-tokens.json`), + stringify(data.tokens), + ); + fs.writeFileSync( + path.join(dirname, `${basename}-ast.json`), + stringify(data.ast), + ); + }); + } + }, +); diff --git a/src/AbstractTokenizer.ts b/src/AbstractTokenizer.ts index 80541e9..2e11426 100644 --- a/src/AbstractTokenizer.ts +++ b/src/AbstractTokenizer.ts @@ -1,19 +1,19 @@ export default abstract class AbstractTokenizer { - protected template : string = '' - protected length : number = 0 - protected index : number = 0 + protected template: string = ''; + protected length: number = 0; + protected index: number = 0; - protected charAt (i : number) : string { - return this.template.charAt(i) + protected charAt(i: number): string { + return this.template.charAt(i); } - protected charCodeAt (i : number) : number { - return this.template.charCodeAt(i) + protected charCodeAt(i: number): number { + return this.template.charCodeAt(i); } - protected init (template : string) : void { - this.template = template - this.length = template.length - this.index = 0 + protected init(template: string): void { + this.template = template; + this.length = template.length; + this.index = 0; } } diff --git a/src/ParamsParser.ts b/src/ParamsParser.ts index 360115a..f826321 100644 --- a/src/ParamsParser.ts +++ b/src/ParamsParser.ts @@ -1,8 +1,15 @@ -import AbstractTokenizer from './AbstractTokenizer' -import ECharCodes from './enum/CharCodes' -import {EBinaryOps, ELiterals, EOperators, EUnaryOps, maxBinaryOps, maxUnaryOps} from './enum/Operators' -import ParamNames from './enum/ParamNames' -import ParseError from './errors/ParseError' +import AbstractTokenizer from './AbstractTokenizer'; +import ECharCodes from './enum/CharCodes'; +import { + EBinaryOps, + ELiterals, + EOperators, + EUnaryOps, + maxBinaryOps, + maxUnaryOps, +} from './enum/Operators'; +import ParamNames from './enum/ParamNames'; +import ParseError from './errors/ParseError'; import { AllParamTypes, IArrayExpression, @@ -18,13 +25,13 @@ import { IMemberExpression, IUnaryExpression, IUpdateExpression, -} from './interface/Params' +} from './interface/Params'; import { isDecimalDigit, isIdentifierPart, isIdentifierStart, isWhitespace, -} from './utils/Chars' +} from './utils/Chars'; // Specify values directly // - Strings: "Foo" or 'Foo' or "It's \"quoted\"" or 'It\'s "quoted"' or r"C:\raw\string" @@ -57,31 +64,63 @@ import { // - Assignment operators: =, +=, -=, *=, /=, %=, ++, -- interface IBiopInfo { - value : EOperators - prec : number + value: EOperators; + prec: number; } -function isIBiopInfo (object : any) : object is IBiopInfo { - return object && 'prec' in object +function isIBiopInfo(object: any): object is IBiopInfo { + return object && 'prec' in object; } -function isAllParamTypes (object : any) : object is AllParamTypes { - return object && 'type' in object +function isAllParamTypes(object: any): object is AllParamTypes { + return object && 'type' in object; } /** * Returns the precedence of a binary operator or `0` if it isn't a binary operator * @param opVal */ -function binaryPrecedence (opVal : EOperators) : number { - return EBinaryOps[opVal] || 0 +function binaryPrecedence(opVal: EOperators): number { + return EBinaryOps[opVal] || 0; +} + +function createAssignmentExpression( + operator: string, + left: AllParamTypes, + right: AllParamTypes, +): IAssignmentExpression { + return { type: ParamNames.AssignmentExpression, operator, left, right }; +} + +function createBuiltInExpression( + operator: string, + left: AllParamTypes, + right: AllParamTypes, +): IBuiltInExpression { + return { type: ParamNames.BuiltInExpression, operator, left, right }; +} + +function createUpdateExpression( + operator: string, + argument: AllParamTypes, + prefix: boolean = true, +): IUpdateExpression { + return { type: ParamNames.UpdateExpression, operator, argument, prefix }; } /** * Utility function (gets called from multiple places) * Also note that `a && b` and `a || b` are *logical* expressions, not binary expressions */ -function createBinaryExpression (operator : EOperators, left : AllParamTypes, right : AllParamTypes) : IBinaryExpression | ILogicalExpression | IAssignmentExpression | IBuiltInExpression { +function createBinaryExpression( + operator: EOperators, + left: AllParamTypes, + right: AllParamTypes, +): + | IBinaryExpression + | ILogicalExpression + | IAssignmentExpression + | IBuiltInExpression { switch (operator) { case EOperators.EQUALS: case EOperators.PLUS_EQUALS: @@ -89,96 +128,94 @@ function createBinaryExpression (operator : EOperators, left : AllParamTypes, ri case EOperators.TIMES_EQUALS: case EOperators.DIV_EQUALS: case EOperators.MOD_EQUALS: - return createAssignmentExpression(operator, left, right) + return createAssignmentExpression(operator, left, right); case EOperators.BUILT_IN: - return createBuiltInExpression(operator, left, right) + return createBuiltInExpression(operator, left, right); case EOperators.OR: case EOperators.AND: - return { type: ParamNames.LogicalExpression, operator, left, right } + return { type: ParamNames.LogicalExpression, operator, left, right }; default: - return { type: ParamNames.BinaryExpression, operator, left, right } + return { type: ParamNames.BinaryExpression, operator, left, right }; } } -function createAssignmentExpression (operator : string, left : AllParamTypes, right : AllParamTypes) : IAssignmentExpression { - return { type: ParamNames.AssignmentExpression, operator, left, right } -} - -function createBuiltInExpression (operator : string, left : AllParamTypes, right : AllParamTypes) : IBuiltInExpression { - return { type: ParamNames.BuiltInExpression, operator, left, right } -} - -function createUpdateExpression (operator : string, argument : AllParamTypes, prefix : boolean = true) : IUpdateExpression { - return { type: ParamNames.UpdateExpression, operator, argument, prefix } -} - -function createUnaryExpression (operator : string, argument : AllParamTypes | null, prefix : boolean = true) : IUnaryExpression | IUpdateExpression { +function createUnaryExpression( + operator: string, + argument: AllParamTypes | null, + prefix: boolean = true, +): IUnaryExpression | IUpdateExpression { if (!argument) { - throw new ParseError(`Missing argument in ${prefix ? 'before' : 'after'} '${operator}'`, { start: 0, end: 0 }) + throw new ParseError( + `Missing argument in ${prefix ? 'before' : 'after'} '${operator}'`, + { start: 0, end: 0 }, + ); } switch (operator) { case EOperators.PLUS_PLUS: case EOperators.MINUS_MINUS: - return createUpdateExpression(operator, argument, prefix) + return createUpdateExpression(operator, argument, prefix); default: - return { type: ParamNames.UnaryExpression, operator, argument, prefix } + return { type: ParamNames.UnaryExpression, operator, argument, prefix }; } } export class ParamsParser extends AbstractTokenizer { - constructor (template : string) { - super() - super.init(template) + constructor(template: string) { + super(); + super.init(template); } - public parseExpressions () : AllParamTypes { - let node - const nodes = [] + public parseExpressions(): AllParamTypes { + let node; + const nodes = []; while (this.index < this.length) { // Try to gobble each expression individually - node = this.parseExpression() + node = this.parseExpression(); if (node) { // If we weren't able to find a binary expression and are out of room, then // the expression passed in probably has too much - nodes.push(node) + nodes.push(node); if (this.charCodeAt(this.index) === ECharCodes.Comma) { - ++this.index + ++this.index; } } else if (this.index < this.length) { - throw new ParseError(`Unexpected "${this.charAt(this.index)}"`, { start: this.index, end: this.index }) + throw new ParseError(`Unexpected "${this.charAt(this.index)}"`, { + start: this.index, + end: this.index, + }); } } // If there's only one expression just try returning the expression if (nodes.length === 1) { - return nodes[0] + return nodes[0]; } else { return { type: ParamNames.Compound, body: nodes, - } + }; } } /** * The main parsing function. Much of this code is dedicated to ternary expressions */ - protected parseExpression () : AllParamTypes | null { - const test = this.parseBinaryExpression() - this.parseSpaces() - return test + protected parseExpression(): AllParamTypes | null { + const test = this.parseBinaryExpression(); + this.parseSpaces(); + return test; } /** * Push `index` up to the next non-space character */ - protected parseSpaces () { - let ch = this.charCodeAt(this.index) + protected parseSpaces() { + let ch = this.charCodeAt(this.index); // space or tab while (isWhitespace(ch)) { - ch = this.charCodeAt(++this.index) + ch = this.charCodeAt(++this.index); } } @@ -188,47 +225,46 @@ export class ParamsParser extends AbstractTokenizer { * and move down from 3 to 2 to 1 character until a matching binary operation is found * then, return that binary operation */ - protected parseBinaryOp () : EOperators | null { - this.parseSpaces() - let toCheck = this.template.substr(this.index, maxBinaryOps) - let tcLen = toCheck.length + protected parseBinaryOp(): EOperators | null { + this.parseSpaces(); + let toCheck = this.template.substr(this.index, maxBinaryOps); + let tcLen = toCheck.length; while (tcLen > 0) { - if (EBinaryOps.hasOwnProperty(toCheck)) { - this.index += tcLen - return toCheck as EOperators + if (toCheck in EBinaryOps) { + this.index += tcLen; + return toCheck as EOperators; } - toCheck = toCheck.substr(0, --tcLen) + toCheck = toCheck.substr(0, --tcLen); } - return null + return null; } /** * This function is responsible for gobbling an individual expression, * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)` */ - protected parseBinaryExpression () : AllParamTypes | null { - let node - let biop : EOperators | null - let prec - let stack : Array - let biopInfo - let fbiop - let left - let right - let i + protected parseBinaryExpression(): AllParamTypes | null { + let node; + let biop: EOperators | null; + let prec; + let biopInfo; + let fbiop; + let left; + let right; + let i; // First, try to get the leftmost thing // Then, check to see if there's a binary operator operating on that leftmost thing - left = this.parseToken() - biop = this.parseBinaryOp() + left = this.parseToken(); + biop = this.parseBinaryOp(); // If there wasn't a binary operator, just return the leftmost node if (!biop) { - return left + return left; } if (biop === EOperators.PLUS_PLUS || biop === EOperators.MINUS_MINUS) { - return createUnaryExpression(biop, left, false) + return createUnaryExpression(biop, left, false); } // Otherwise, we need to start a stack to properly place the binary operations in their @@ -236,173 +272,202 @@ export class ParamsParser extends AbstractTokenizer { biopInfo = { value: biop, prec: binaryPrecedence(biop), - } + }; - right = this.parseToken() + right = this.parseToken(); if (!right || !left) { - throw new ParseError(`Expected expression after ${biop}`, { start: this.index, end: this.index }) + throw new ParseError(`Expected expression after ${biop}`, { + start: this.index, + end: this.index, + }); } - stack = [left, biopInfo, right] + const stack: Array = [left, biopInfo, right]; /** * Properly deal with precedence using * @see http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm */ + // eslint-disable-next-line no-constant-condition while (true) { - biop = this.parseBinaryOp() + biop = this.parseBinaryOp(); if (!biop) { - break + break; } - prec = binaryPrecedence(biop) + prec = binaryPrecedence(biop); if (prec === 0) { - break + break; } - biopInfo = { value: biop, prec } + biopInfo = { value: biop, prec }; // Reduce: make a binary expression from the three topmost entries. while (stack.length > 2) { - fbiop = stack[stack.length - 2] + fbiop = stack[stack.length - 2]; if (!isIBiopInfo(fbiop) || prec > fbiop.prec) { - break + break; } - right = stack.pop() - stack.pop() - left = stack.pop() + right = stack.pop(); + stack.pop(); + left = stack.pop(); if (!isAllParamTypes(right) || !isAllParamTypes(left)) { - break + break; } - node = createBinaryExpression(fbiop.value, left, right) - stack.push(node) + node = createBinaryExpression(fbiop.value, left, right); + stack.push(node); } - node = this.parseToken() + node = this.parseToken(); if (!node) { - throw new ParseError(`Expected expression after ${biop}`, { start: this.index, end: this.index }) + throw new ParseError(`Expected expression after ${biop}`, { + start: this.index, + end: this.index, + }); } - stack.push(biopInfo, node) + stack.push(biopInfo, node); } - i = stack.length - 1 - node = stack[i] + i = stack.length - 1; + node = stack[i]; while (i > 1) { - fbiop = stack[i - 1] - left = stack[i - 2] - if (!isIBiopInfo(fbiop) || !isAllParamTypes(left) || !isAllParamTypes(node)) { - throw new ParseError(`Expected expression`, { start: this.index, end: this.index }) + fbiop = stack[i - 1]; + left = stack[i - 2]; + if ( + !isIBiopInfo(fbiop) || + !isAllParamTypes(left) || + !isAllParamTypes(node) + ) { + throw new ParseError(`Expected expression`, { + start: this.index, + end: this.index, + }); } - node = createBinaryExpression(fbiop.value, left, node) - i -= 2 + node = createBinaryExpression(fbiop.value, left, node); + i -= 2; } if (!isAllParamTypes(node)) { - throw new ParseError(`Expected expression`, { start: this.index, end: this.index }) + throw new ParseError(`Expected expression`, { + start: this.index, + end: this.index, + }); } - return node + return node; } /** * An individual part of a binary expression: * e.g. `foo.bar(baz)`, `1`, `"abc"`, `(a % 2)` (because it's in parenthesis) */ - protected parseToken () : AllParamTypes | null { - this.parseSpaces() - const ch = this.charCodeAt(this.index) + protected parseToken(): AllParamTypes | null { + this.parseSpaces(); + const ch = this.charCodeAt(this.index); if (isDecimalDigit(ch) || ch === ECharCodes.Period) { // Char code 46 is a dot `.` which can start off a numeric literal - return this.parseNumericLiteral() + return this.parseNumericLiteral(); } else if (ch === ECharCodes.SingleQuote || ch === ECharCodes.DoubleQuote) { // Single or double quotes - return this.parseStringLiteral() - } else if (isIdentifierStart(ch) || ch === ECharCodes.OpenParenthesis) { // open parenthesis + return this.parseStringLiteral(); + } else if (isIdentifierStart(ch) || ch === ECharCodes.OpenParenthesis) { + // open parenthesis // `foo`, `bar.baz` - return this.parseVariable() + return this.parseVariable(); } else if (ch === ECharCodes.OpenBracket) { - return this.parseArray() + return this.parseArray(); } else if (ch === ECharCodes.OpenBrace) { - return this.parseMap() + return this.parseMap(); } else { - let toCheck = this.template.substr(this.index, maxUnaryOps) - let tcLen = toCheck.length + let toCheck = this.template.substr(this.index, maxUnaryOps); + let tcLen = toCheck.length; while (tcLen > 0) { if (toCheck in EUnaryOps) { - this.index += tcLen - return createUnaryExpression(toCheck, this.parseToken(), true) + this.index += tcLen; + return createUnaryExpression(toCheck, this.parseToken(), true); } - toCheck = toCheck.substr(0, --tcLen) + toCheck = toCheck.substr(0, --tcLen); } } - return null + return null; } /** * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to * keep track of everything in the numeric literal and then calling `parseFloat` on that string */ - protected parseNumericLiteral () : ILiteral { - let rawName = '' - let chCode + protected parseNumericLiteral(): ILiteral { + let rawName = ''; while (isDecimalDigit(this.charCodeAt(this.index))) { - rawName += this.charAt(this.index++) + rawName += this.charAt(this.index++); } - if (this.charCodeAt(this.index) === ECharCodes.Period) { // can start with a decimal marker - rawName += this.charAt(this.index++) + if (this.charCodeAt(this.index) === ECharCodes.Period) { + // can start with a decimal marker + rawName += this.charAt(this.index++); while (isDecimalDigit(this.charCodeAt(this.index))) { - rawName += this.charAt(this.index++) + rawName += this.charAt(this.index++); } } - chCode = this.charCodeAt(this.index) + const chCode = this.charCodeAt(this.index); // Check to make sure this isn't a variable name that start with a number (123abc) if (isIdentifierStart(chCode)) { - throw new ParseError(`Variable names cannot start with a number (${rawName}${this.charAt(this.index)})`, { start: this.index, end: this.index }) + throw new ParseError( + `Variable names cannot start with a number (${rawName}${this.charAt( + this.index, + )})`, + { start: this.index, end: this.index }, + ); } else if (chCode === ECharCodes.Period) { - throw new ParseError('Unexpected period', { start: this.index, end: this.index }) + throw new ParseError('Unexpected period', { + start: this.index, + end: this.index, + }); } return { type: ParamNames.Literal, value: parseFloat(rawName), raw: rawName, - } + }; } /** * Parses a string literal, staring with single or double quotes with basic support for escape codes * e.g. `"hello world"`, `'this is\nJSEP'` */ - protected parseStringLiteral () : ILiteral { - let str = '' - const quote = this.charAt(this.index++) - let closed = false - let ch + protected parseStringLiteral(): ILiteral { + let str = ''; + const quote = this.charAt(this.index++); + let closed = false; + let ch; while (this.index < this.length) { - ch = this.charAt(this.index++) + ch = this.charAt(this.index++); if (ch === quote) { - closed = true - break + closed = true; + break; } else if (ch === '\\') { // Check for all of the common escape codes - ch = this.charAt(this.index++) - str += `\\${ch}` + ch = this.charAt(this.index++); + str += `\\${ch}`; } else { - str += ch + str += ch; } } if (!closed) { - throw new ParseError(`Unclosed quote after "${str}"`, { start: this.index, end: this.index }) + throw new ParseError(`Unclosed quote after "${str}"`, { + start: this.index, + end: this.index, + }); } return { type: ParamNames.Literal, value: str, raw: quote + str + quote, - } + }; } /** @@ -411,38 +476,40 @@ export class ParamsParser extends AbstractTokenizer { * Also, this function checks if that identifier is a literal: * (e.g. `true`, `false`, `null`) or `this` */ - protected parseIdentifier () : IIdentifier | ILiteral { - let ch = this.charCodeAt(this.index) - const start = this.index - let identifier : string + protected parseIdentifier(): IIdentifier | ILiteral { + let ch = this.charCodeAt(this.index); + const start = this.index; if (isIdentifierStart(ch)) { - this.index++ + this.index++; } else { - throw new ParseError(`Unexpected ${this.charAt(this.index)}`, { start: this.index, end: this.index }) + throw new ParseError(`Unexpected ${this.charAt(this.index)}`, { + start: this.index, + end: this.index, + }); } while (this.index < this.length) { - ch = this.charCodeAt(this.index) + ch = this.charCodeAt(this.index); if (isIdentifierPart(ch)) { - this.index++ + this.index++; } else { - break + break; } } - identifier = this.template.slice(start, this.index) + const identifier = this.template.slice(start, this.index); if (identifier in ELiterals) { return { type: ParamNames.Literal, value: ELiterals[identifier], raw: identifier, - } + }; } else { return { type: ParamNames.Identifier, name: identifier, - } + }; } } @@ -453,32 +520,40 @@ export class ParamsParser extends AbstractTokenizer { * until the terminator character `)` or `]` is encountered. * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]` */ - protected parseArguments (termination : number) : AllParamTypes[] { - let chI : number - const args : AllParamTypes[] = [] - let node - let closed = false + protected parseArguments(termination: number): AllParamTypes[] { + let chI: number; + const args: AllParamTypes[] = []; + let node; + let closed = false; while (this.index < this.length) { - this.parseSpaces() - chI = this.charCodeAt(this.index) - if (chI === termination) { // done parsing - closed = true - this.index++ - break - } else if (chI === ECharCodes.Comma) { // between expressions - this.index++ + this.parseSpaces(); + chI = this.charCodeAt(this.index); + if (chI === termination) { + // done parsing + closed = true; + this.index++; + break; + } else if (chI === ECharCodes.Comma) { + // between expressions + this.index++; } else { - node = this.parseExpression() + node = this.parseExpression(); if (!node || node.type === ParamNames.Compound) { - throw new ParseError('Expected comma', { start: this.index, end: this.index }) + throw new ParseError('Expected comma', { + start: this.index, + end: this.index, + }); } - args.push(node) + args.push(node); } } if (!closed) { - throw new ParseError(`Expected ${String.fromCharCode(termination)}`, { start: this.index, end: this.index }) + throw new ParseError(`Expected ${String.fromCharCode(termination)}`, { + start: this.index, + end: this.index, + }); } - return args + return args; } /** @@ -487,50 +562,58 @@ export class ParamsParser extends AbstractTokenizer { * It also gobbles function calls: * e.g. `Math.acos(obj.angle)` */ - protected parseVariable () : AllParamTypes | null { - let chI : number - chI = this.charCodeAt(this.index) - let node : AllParamTypes | null = chI === ECharCodes.OpenParenthesis - ? this.parseGroup() - : this.parseIdentifier() - - this.parseSpaces() - chI = this.charCodeAt(this.index) - while (chI === ECharCodes.Period || chI === ECharCodes.OpenBracket || chI === ECharCodes.OpenParenthesis) { - this.index++ + protected parseVariable(): AllParamTypes | null { + let chI: number; + chI = this.charCodeAt(this.index); + let node: AllParamTypes | null = + chI === ECharCodes.OpenParenthesis + ? this.parseGroup() + : this.parseIdentifier(); + + this.parseSpaces(); + chI = this.charCodeAt(this.index); + while ( + chI === ECharCodes.Period || + chI === ECharCodes.OpenBracket || + chI === ECharCodes.OpenParenthesis + ) { + this.index++; if (chI === ECharCodes.Period) { - this.parseSpaces() + this.parseSpaces(); node = { type: ParamNames.MemberExpression, computed: false, object: node, property: this.parseIdentifier(), - } as IMemberExpression + } as IMemberExpression; } else if (chI === ECharCodes.OpenBracket) { node = { type: ParamNames.MemberExpression, computed: true, object: node, property: this.parseExpression(), - } as IMemberExpression - this.parseSpaces() - chI = this.charCodeAt(this.index) + } as IMemberExpression; + this.parseSpaces(); + chI = this.charCodeAt(this.index); if (chI !== ECharCodes.CloseBracket) { - throw new ParseError('Unclosed [', { start: this.index, end: this.index }) + throw new ParseError('Unclosed [', { + start: this.index, + end: this.index, + }); } - this.index++ + this.index++; } else if (chI === ECharCodes.OpenParenthesis) { // A function call is being made; gobble all the arguments node = { type: ParamNames.CallExpression, arguments: this.parseArguments(ECharCodes.CloseParenthesis), callee: node, - } as ICallExpression + } as ICallExpression; } - this.parseSpaces() - chI = this.charCodeAt(this.index) + this.parseSpaces(); + chI = this.charCodeAt(this.index); } - return node + return node; } /** @@ -540,15 +623,18 @@ export class ParamsParser extends AbstractTokenizer { * that the next thing it should see is the close parenthesis. If not, * then the expression probably doesn't have a `)` */ - protected parseGroup () : AllParamTypes | null { - this.index++ - const node = this.parseExpression() - this.parseSpaces() + protected parseGroup(): AllParamTypes | null { + this.index++; + const node = this.parseExpression(); + this.parseSpaces(); if (this.charCodeAt(this.index) === ECharCodes.CloseParenthesis) { - this.index++ - return node + this.index++; + return node; } else { - throw new ParseError('Unclosed (', { start: this.index, end: this.index }) + throw new ParseError('Unclosed (', { + start: this.index, + end: this.index, + }); } } @@ -557,12 +643,12 @@ export class ParamsParser extends AbstractTokenizer { * This function assumes that it needs to gobble the opening bracket * and then tries to gobble the expressions as arguments. */ - protected parseArray () : IArrayExpression { - this.index++ + protected parseArray(): IArrayExpression { + this.index++; return { type: ParamNames.ArrayExpression, elements: this.parseArguments(ECharCodes.CloseBracket), - } + }; } /** @@ -570,60 +656,72 @@ export class ParamsParser extends AbstractTokenizer { * This function assumes that it needs to gobble the opening brace * and then tries to gobble the expressions as arguments. */ - protected parseMap () : IMapExpression { - let ch : number - let closed = false - const elements : IMapExpressionValues[] = [] - ++this.index + protected parseMap(): IMapExpression { + let ch: number; + let closed = false; + const elements: IMapExpressionValues[] = []; + ++this.index; while (this.index < this.length) { - this.parseSpaces() + this.parseSpaces(); - ch = this.charCodeAt(this.index) + ch = this.charCodeAt(this.index); if (ch === ECharCodes.CloseBrace) { - ++this.index - closed = true - break + ++this.index; + closed = true; + break; } if (ch !== ECharCodes.SingleQuote && ch !== ECharCodes.DoubleQuote) { - throw new ParseError(`Invalid character ${String.fromCharCode(ch)}`, { start: this.index, end: this.index }) + throw new ParseError(`Invalid character ${String.fromCharCode(ch)}`, { + start: this.index, + end: this.index, + }); } - const key = this.parseStringLiteral() + const key = this.parseStringLiteral(); - this.parseSpaces() + this.parseSpaces(); - ch = this.charCodeAt(this.index) + ch = this.charCodeAt(this.index); if (ch !== ECharCodes.Colon) { - throw new ParseError(`Invalid character ${String.fromCharCode(ch)}`, { start: this.index, end: this.index }) + throw new ParseError(`Invalid character ${String.fromCharCode(ch)}`, { + start: this.index, + end: this.index, + }); } - ++this.index - this.parseSpaces() + ++this.index; + this.parseSpaces(); - const value = this.parseExpression() + const value = this.parseExpression(); if (!value) { - throw new ParseError(`Invalid character ${String.fromCharCode(ch)}`, { start: this.index, end: this.index }) + throw new ParseError(`Invalid character ${String.fromCharCode(ch)}`, { + start: this.index, + end: this.index, + }); } - ch = this.charCodeAt(this.index) + ch = this.charCodeAt(this.index); if (ch === ECharCodes.Comma) { - ++this.index + ++this.index; } elements.push({ key, value, - }) + }); } if (!closed) { - ch = this.charCodeAt(this.index) - throw new ParseError('Unclosed {', { start: this.index, end: this.index }) + ch = this.charCodeAt(this.index); + throw new ParseError('Unclosed {', { + start: this.index, + end: this.index, + }); } return { type: ParamNames.MapExpression, elements, - } + }; } } diff --git a/src/Parser.ts b/src/Parser.ts index fcaa2ec..e3b8b01 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -1,147 +1,162 @@ -import ParseError from './errors/ParseError' +import ParseError from './errors/ParseError'; -import { IOptions } from './interface/IOptions' -import { IToken } from './interface/Tokens' +import { IOptions } from './interface/IOptions'; +import { IToken } from './interface/Tokens'; -import { ENodeType } from './Symbols' -import { Tokenizer } from './Tokenizer' +import { ENodeType } from './Symbols'; +import { Tokenizer } from './Tokenizer'; -import { Directives } from './enum/Directives' -import NodeNames from './enum/NodeNames' +import { Directives } from './enum/Directives'; +import NodeNames from './enum/NodeNames'; -import AbstractNode from './nodes/abstract/AbstractNode' -import ProgramNode from './nodes/ProgramNode' +import AbstractNode from './nodes/abstract/AbstractNode'; +import ProgramNode from './nodes/ProgramNode'; -import { ParserLocation } from './ParserLocation' -import Nodes from './utils/Nodes' +import { ParserLocation } from './ParserLocation'; +import Nodes from './utils/Nodes'; -import defaultConfig from './defaultConfig' +import defaultConfig from './defaultConfig'; export interface IParserReturn { - ast : ProgramNode - tokens : IToken[] + ast: ProgramNode; + tokens: IToken[]; } export class Parser extends ParserLocation { - protected options : IOptions = defaultConfig + protected options: IOptions = defaultConfig; - public parse (template : string, options : IOptions = {}) : IParserReturn { - super.parse(template) - const ast = new ProgramNode(0, template.length - 1) - const stack : AbstractNode[] = [] - let parent : AbstractNode = ast - let tokens : IToken[] = [] + public parse(template: string, options: IOptions = {}): IParserReturn { + super.parse(template); + const ast = new ProgramNode(0, template.length - 1); + const stack: AbstractNode[] = []; + let parent: AbstractNode = ast; + let tokens: IToken[] = []; - this.addLocation(parent) + this.addLocation(parent); this.options = { ...defaultConfig, ...options, - } + }; try { - const tokenizer = new Tokenizer(this.options) - tokens = tokenizer.parse(template) + const tokenizer = new Tokenizer(this.options); + tokens = tokenizer.parse(template); } catch (error) { - ast.addError(error) + ast.addError(error); } if (tokens.length === 0) { - this.addLocationToProgram(ast) - return { ast, tokens } + this.addLocationToProgram(ast); + return { ast, tokens }; } - let token : IToken | null = null + let token: IToken | null = null; for (token of tokens) { try { - const tokenType = this.tokenToNodeType(token) + const tokenType = this.tokenToNodeType(token); - if (token.type === ENodeType.CloseDirective || token.type === ENodeType.CloseMacro) { + if ( + token.type === ENodeType.CloseDirective || + token.type === ENodeType.CloseMacro + ) { if (token.params) { - ast.addError(new ParseError(`Close tag '${tokenType}' should have no params`, token)) - continue + ast.addError( + new ParseError( + `Close tag '${tokenType}' should have no params`, + token, + ), + ); + continue; } if (parent.type !== tokenType) { - ast.addError(new ParseError(`Unexpected close tag '${tokenType}'`, token)) - continue + ast.addError( + new ParseError(`Unexpected close tag '${tokenType}'`, token), + ); + continue; } - parent = stack.pop() as AbstractNode // its always + parent = stack.pop() as AbstractNode; // its always } else { - const node = this.addNodeChild(parent, token) + const node = this.addNodeChild(parent, token); if (node !== parent && node.hasBody) { if (!this.isPartial(tokenType, parent.type)) { - stack.push(parent) + stack.push(parent); } - parent = node + parent = node; } } } catch (error) { - ast.addError(error) + ast.addError(error); } } if (stack.length > 0) { - ast.addError(new ParseError(`Unclosed tag '${parent.type}'`, parent)) + ast.addError(new ParseError(`Unclosed tag '${parent.type}'`, parent)); } - this.addLocationToProgram(ast) - return { ast, tokens } + this.addLocationToProgram(ast); + return { ast, tokens }; } - protected addLocationToProgram (parent : ProgramNode) { + protected addLocationToProgram(parent: ProgramNode) { if (this.options.parseLocation) { if (parent.errors) { for (const node of parent.errors) { - this.addLocation(node) + this.addLocation(node); } } } } - protected addNodeChild (parent : AbstractNode, token : IToken) : AbstractNode { - const tokenType = this.tokenToNodeType(token) + protected addNodeChild(parent: AbstractNode, token: IToken): AbstractNode { + const tokenType = this.tokenToNodeType(token); - const node : AbstractNode = Nodes[tokenType](token, parent) + const node: AbstractNode = Nodes[tokenType](token, parent); if (node) { - this.addLocation(node) + this.addLocation(node); } if (parent !== node) { - parent.addToNode(node) + parent.addToNode(node); } - return node + return node; } - protected isPartial (type : NodeNames, parentType : NodeNames) : boolean { + protected isPartial(type: NodeNames, parentType: NodeNames): boolean { switch (type) { case NodeNames.ConditionElse: - return NodeNames.Condition === parentType + return NodeNames.Condition === parentType; case NodeNames.Else: - return NodeNames.Condition === parentType || NodeNames.List === parentType + return ( + NodeNames.Condition === parentType || NodeNames.List === parentType + ); case NodeNames.Recover: - return NodeNames.Attempt === parentType + return NodeNames.Attempt === parentType; } - return false + return false; } - protected tokenToNodeType (token : IToken) : NodeNames { + protected tokenToNodeType(token: IToken): NodeNames { switch (token.type) { case ENodeType.CloseDirective: case ENodeType.OpenDirective: if (token.text in Directives) { - return Directives[token.text as any] as NodeNames + return Directives[token.text as any] as NodeNames; } - break + break; case ENodeType.Interpolation: - return NodeNames.Interpolation + return NodeNames.Interpolation; case ENodeType.Text: - return NodeNames.Text + return NodeNames.Text; case ENodeType.CloseMacro: case ENodeType.OpenMacro: - return NodeNames.MacroCall + return NodeNames.MacroCall; case ENodeType.Comment: - return NodeNames.Comment + return NodeNames.Comment; } - throw new ParseError(`Unknown token \`${token.type}\` - \`${token.text}\``, token) + throw new ParseError( + `Unknown token \`${token.type}\` - \`${token.text}\``, + token, + ); } } diff --git a/src/ParserLocation.ts b/src/ParserLocation.ts index c328c2b..57bf386 100644 --- a/src/ParserLocation.ts +++ b/src/ParserLocation.ts @@ -1,76 +1,77 @@ -import ECharCodes from './enum/CharCodes' -import { ISourceLocation } from './interface/ISourceLocation' -import { ILoc } from './interface/Tokens' +import ECharCodes from './enum/CharCodes'; +import { ISourceLocation } from './interface/ISourceLocation'; +import { ILoc } from './interface/Tokens'; export abstract class ParserLocation { - protected offsets : number[] = [0] - protected template : string = '' + protected offsets: number[] = [0]; + protected template: string = ''; - public parse (template : string) { - this.template = template || '' + public parse(template: string) { + this.template = template || ''; - const offsets = [0] + const offsets = [0]; - for (let offset = 0; offset < template.length;) { + for (let offset = 0; offset < template.length; ) { switch (this.template.charCodeAt(offset)) { case ECharCodes.LineFeed: - offset += 1 - offsets.push(offset) - break + offset += 1; + offsets.push(offset); + break; case ECharCodes.CarriageReturn: - offset += 1 + offset += 1; if (this.template.charCodeAt(offset) === ECharCodes.LineFeed) { - offset += 1 + offset += 1; } - offsets.push(offset) - break + offsets.push(offset); + break; default: - ++offset - break + ++offset; + break; } } - this.offsets = offsets + this.offsets = offsets; } - protected findLowerIndexInRangeArray (value : number) { + protected findLowerIndexInRangeArray(value: number) { if (value >= this.offsets[this.offsets.length - 1]) { - return this.offsets.length - 1 + return this.offsets.length - 1; } - let min = 0 - let max = this.offsets.length - 2 - let mid + let min = 0; + let max = this.offsets.length - 2; + let mid; while (min < max) { - mid = min + ((max - min) >> 1) + mid = min + ((max - min) >> 1); if (value < this.offsets[mid]) { - max = mid - 1 + max = mid - 1; } else if (value >= this.offsets[mid + 1]) { - min = mid + 1 - } else { // value >= this.offsets[mid] && value < this.offsets[mid + 1] - min = mid - break + min = mid + 1; + } else { + // value >= this.offsets[mid] && value < this.offsets[mid + 1] + min = mid; + break; } } - return min + return min; } - protected addLocation (node : ILoc) { + protected addLocation(node: ILoc) { node.loc = { - start : this.locationForIndex(node.start), - end : this.locationForIndex(node.end), - } + start: this.locationForIndex(node.start), + end: this.locationForIndex(node.end), + }; } - protected locationForIndex (index : number) : ISourceLocation { + protected locationForIndex(index: number): ISourceLocation { if (index < 0 || index >= this.template.length || isNaN(index)) { - return { line : 0, column : 0} + return { line: 0, column: 0 }; } - const line = this.findLowerIndexInRangeArray(index) - const column = index - this.offsets[line] + const line = this.findLowerIndexInRangeArray(index); + const column = index - this.offsets[line]; - return { line : line + 1, column : column + 1 } + return { line: line + 1, column: column + 1 }; } } diff --git a/src/Symbols.ts b/src/Symbols.ts index 282fbd9..dc6bbc2 100644 --- a/src/Symbols.ts +++ b/src/Symbols.ts @@ -10,7 +10,7 @@ export enum ENodeType { } export interface ISymbol { - startToken : string - endToken : string[] - type : ENodeType + startToken: string; + endToken: string[]; + type: ENodeType; } diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index 7d076d4..573e0ff 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -1,155 +1,196 @@ -import AbstractTokenizer from './AbstractTokenizer' -import defaultConfig from './defaultConfig' -import ECharCodes from './enum/CharCodes' -import ParseError from './errors/ParseError' -import { IOptions } from './interface/IOptions' -import { IToken } from './interface/Tokens' -import { ENodeType, ISymbol } from './Symbols' -import { isLetter, isWhitespace } from './utils/Chars' +import AbstractTokenizer from './AbstractTokenizer'; +import defaultConfig from './defaultConfig'; +import ECharCodes from './enum/CharCodes'; +import ParseError from './errors/ParseError'; +import { IOptions } from './interface/IOptions'; +import { IToken } from './interface/Tokens'; +import { ENodeType, ISymbol } from './Symbols'; +import { isLetter, isWhitespace } from './utils/Chars'; interface INextPos { - pos : number - text : string + pos: number; + text: string; } interface IParams { - paramText : string - endToken : string + paramText: string; + endToken: string; } export class Tokenizer extends AbstractTokenizer { - protected tokens : IToken[] = [] - protected options : IOptions - protected symbols : ISymbol[] + protected tokens: IToken[] = []; + protected options: IOptions; + protected symbols: ISymbol[]; - protected get openTag () : ECharCodes { - return this.options.squareTags ? ECharCodes.OpenBracket : ECharCodes.Less + protected get openTag(): ECharCodes { + return this.options.squareTags ? ECharCodes.OpenBracket : ECharCodes.Less; } - protected get closeTag () : ECharCodes { - return this.options.squareTags ? ECharCodes.CloseBracket : ECharCodes.Greater + protected get closeTag(): ECharCodes { + return this.options.squareTags + ? ECharCodes.CloseBracket + : ECharCodes.Greater; } - constructor (options : IOptions = {}) { - super() + constructor(options: IOptions = {}) { + super(); this.options = { ...defaultConfig, ...options, - } + }; - const openTag = String.fromCharCode(this.openTag) - const closeTag = String.fromCharCode(this.closeTag) + const openTag = String.fromCharCode(this.openTag); + const closeTag = String.fromCharCode(this.closeTag); this.symbols = [ - { startToken: `${openTag}#--`, endToken: [`--${closeTag}`], type: ENodeType.Comment }, - { startToken: `${openTag}/#`, endToken: [`${closeTag}`], type: ENodeType.CloseDirective }, - { startToken: `${openTag}#`, endToken: [`${closeTag}`, `/${closeTag}`], type: ENodeType.OpenDirective }, - { startToken: `${openTag}/@`, endToken: [`${closeTag}`], type: ENodeType.CloseMacro }, - { startToken: `${openTag}@`, endToken: [`${closeTag}`, `/${closeTag}`], type: ENodeType.OpenMacro }, + { + startToken: `${openTag}#--`, + endToken: [`--${closeTag}`], + type: ENodeType.Comment, + }, + { + startToken: `${openTag}/#`, + endToken: [`${closeTag}`], + type: ENodeType.CloseDirective, + }, + { + startToken: `${openTag}#`, + endToken: [`${closeTag}`, `/${closeTag}`], + type: ENodeType.OpenDirective, + }, + { + startToken: `${openTag}/@`, + endToken: [`${closeTag}`], + type: ENodeType.CloseMacro, + }, + { + startToken: `${openTag}@`, + endToken: [`${closeTag}`, `/${closeTag}`], + type: ENodeType.OpenMacro, + }, // tslint:disable-next-line:no-invalid-template-strings { startToken: '${', endToken: ['}'], type: ENodeType.Interpolation }, - ] + ]; } - public parse (template : string) : IToken[] { - super.init(template) + public parse(template: string): IToken[] { + super.init(template); - this.tokens = [] + this.tokens = []; while (this.index >= 0 && this.index < this.template.length) { - this.parseTemplate() + this.parseTemplate(); } - return this.tokens + return this.tokens; } - protected getNextPos (items : string[]) : INextPos { - let pos = -1 - let text = '' + protected getNextPos(items: string[]): INextPos { + let pos = -1; + let text = ''; for (const item of items) { - const n = this.template.indexOf(item, this.index) + const n = this.template.indexOf(item, this.index); if (n >= 0 && (pos === -1 || n < pos)) { - pos = n - text = item + pos = n; + text = item; } } - return { pos, text } + return { pos, text }; } - protected parseTagName () : string { - let text : string = '' - let ch : number = this.charCodeAt(this.index) + protected parseTagName(): string { + let text: string = ''; + let ch: number = this.charCodeAt(this.index); while (this.index < this.template.length) { if (isWhitespace(ch)) { - ++this.index - break + ++this.index; + break; } - if (ch === this.closeTag || (ch === ECharCodes.Slash && this.charCodeAt(this.index + 1) === this.closeTag)) { - break + if ( + ch === this.closeTag || + (ch === ECharCodes.Slash && + this.charCodeAt(this.index + 1) === this.closeTag) + ) { + break; } - if (isLetter(ch) || ch === ECharCodes.Period || ch === ECharCodes.Underscore) { - text += this.charAt(this.index) - ch = this.charCodeAt(++this.index) + if ( + isLetter(ch) || + ch === ECharCodes.Period || + ch === ECharCodes.Underscore + ) { + text += this.charAt(this.index); + ch = this.charCodeAt(++this.index); } else { - throw new ParseError(`Invalid \`${this.charAt(this.index)}\``, { start: this.index, end: this.index }) + throw new ParseError(`Invalid \`${this.charAt(this.index)}\``, { + start: this.index, + end: this.index, + }); } } - return text + return text; } - protected getToken () : ISymbol | null { - let symbol : ISymbol | null = null - let startPos : number = 0 + protected getToken(): ISymbol | null { + let symbol: ISymbol | null = null; + let startPos: number = 0; for (const item of this.symbols) { - const n = this.template.indexOf(item.startToken, this.index) + const n = this.template.indexOf(item.startToken, this.index); if (n === this.index && (!symbol || n < startPos)) { - symbol = item - startPos = n + symbol = item; + startPos = n; } } - return symbol || null + return symbol || null; } - protected parseTemplate () { - let text : string = '' - const startPos = this.index - let ch : number + protected parseTemplate() { + let text: string = ''; + const startPos = this.index; + let ch: number; while (this.index < this.length) { - ch = this.charCodeAt(this.index) + ch = this.charCodeAt(this.index); if (ch === this.openTag || ch === ECharCodes.$) { - const token = this.getToken() + const token = this.getToken(); if (token) { if (text.length > 0) { - this.addToken(ENodeType.Text, startPos, this.index, text) - text = '' + this.addToken(ENodeType.Text, startPos, this.index, text); + text = ''; } - const start = this.index - this.index += token.startToken.length + const start = this.index; + this.index += token.startToken.length; switch (token.type) { case ENodeType.Comment: - return this.parseComment(token, start) + return this.parseComment(token, start); case ENodeType.OpenDirective: case ENodeType.OpenMacro: - return this.parseOpenDirectiveOrMacro(token, start) - case ENodeType.CloseDirective: + return this.parseOpenDirectiveOrMacro(token, start); + case ENodeType.CloseDirective: case ENodeType.CloseMacro: - return this.parseCloseDirectiveOrMacro(token, start) + return this.parseCloseDirectiveOrMacro(token, start); case ENodeType.Interpolation: - return this.parseInterpolation(token, start) + return this.parseInterpolation(token, start); } } } - text += this.charAt(this.index) - ++this.index + text += this.charAt(this.index); + ++this.index; } - return this.addToken(ENodeType.Text, startPos, this.index, text) + return this.addToken(ENodeType.Text, startPos, this.index, text); } - protected addToken (type : ENodeType, start : number, end : number, text : string, startTag? : string, endTag? : string, params? : string) { + protected addToken( + type: ENodeType, + start: number, + end: number, + text: string, + startTag?: string, + endTag?: string, + params?: string, + ) { this.tokens.push({ type, start, @@ -158,109 +199,164 @@ export class Tokenizer extends AbstractTokenizer { endTag, text, params: params || undefined, - }) + }); } - protected parseComment (symbol : ISymbol, start : number) { - const end = this.getNextPos(symbol.endToken) + protected parseComment(symbol: ISymbol, start: number) { + const end = this.getNextPos(symbol.endToken); if (end.pos === -1) { - throw new ReferenceError(`Unclosed comment`) + throw new ReferenceError(`Unclosed comment`); } - const text = this.template.substring(this.index, end.pos) - this.index = end.pos + end.text.length + const text = this.template.substring(this.index, end.pos); + this.index = end.pos + end.text.length; - this.addToken(symbol.type, start, this.index, text, symbol.startToken, end.text) + this.addToken( + symbol.type, + start, + this.index, + text, + symbol.startToken, + end.text, + ); } - protected parseInterpolation (symbol : ISymbol, start : number) { - const params = this.parseParams(symbol.endToken) - this.addToken(symbol.type, start, this.index, '', symbol.startToken, params.endToken, params.paramText) + protected parseInterpolation(symbol: ISymbol, start: number) { + const params = this.parseParams(symbol.endToken); + this.addToken( + symbol.type, + start, + this.index, + '', + symbol.startToken, + params.endToken, + params.paramText, + ); } - protected parseOpenDirectiveOrMacro (symbol : ISymbol, start : number) { - const typeString = this.parseTagName() + protected parseOpenDirectiveOrMacro(symbol: ISymbol, start: number) { + const typeString = this.parseTagName(); if (typeString.length === 0) { - throw new ParseError(`${symbol.type} name cannot be empty`, { start: this.index, end: this.index }) + throw new ParseError(`${symbol.type} name cannot be empty`, { + start: this.index, + end: this.index, + }); } - const params = this.parseParams(symbol.endToken) - this.addToken(symbol.type, start, this.index, typeString, symbol.startToken, params.endToken, params.paramText) + const params = this.parseParams(symbol.endToken); + this.addToken( + symbol.type, + start, + this.index, + typeString, + symbol.startToken, + params.endToken, + params.paramText, + ); } - protected parseCloseDirectiveOrMacro (symbol : ISymbol, start : number) { - const typeString = this.parseTagName() + protected parseCloseDirectiveOrMacro(symbol: ISymbol, start: number) { + const typeString = this.parseTagName(); if (typeString.length === 0) { - throw new ParseError(`${symbol.type} name cannot be empty`, { start: this.index, end: this.index }) + throw new ParseError(`${symbol.type} name cannot be empty`, { + start: this.index, + end: this.index, + }); } - const params = this.parseParams(symbol.endToken) - this.addToken(symbol.type, start, this.index, typeString, symbol.startToken, params.endToken, params.paramText) + const params = this.parseParams(symbol.endToken); + this.addToken( + symbol.type, + start, + this.index, + typeString, + symbol.startToken, + params.endToken, + params.paramText, + ); } // When you want to test if x > 0 or x >= 0, writing <#if x > 0> and <#if x >= 0> is WRONG, // as the first > will close the #if tag. To work that around, write <#if x gt 0> or <#if gte 0>. // Also note that if the comparison occurs inside parentheses, you will have no such problem, // like <#if foo.bar(x > 0)> works as expected. - protected parseParams (endTags : string[]) : IParams { - let paramText : string = '' - const start = this.index - const stack : number[] = [] - let closeCode : number | undefined + protected parseParams(endTags: string[]): IParams { + let paramText: string = ''; + const start = this.index; + const stack: number[] = []; + let closeCode: number | undefined; while (this.index <= this.length) { - const ch = this.charCodeAt(this.index) + const ch = this.charCodeAt(this.index); - if (closeCode !== ECharCodes.DoubleQuote && closeCode !== ECharCodes.SingleQuote) { + if ( + closeCode !== ECharCodes.DoubleQuote && + closeCode !== ECharCodes.SingleQuote + ) { switch (ch) { case ECharCodes.SingleQuote: // ' case ECharCodes.DoubleQuote: // " - if (closeCode) { stack.push(closeCode) } - closeCode = ch - break + if (closeCode) { + stack.push(closeCode); + } + closeCode = ch; + break; case ECharCodes.OpenParenthesis: // ( - if (closeCode) { stack.push(closeCode) } - closeCode = ECharCodes.CloseParenthesis - break + if (closeCode) { + stack.push(closeCode); + } + closeCode = ECharCodes.CloseParenthesis; + break; case ECharCodes.OpenBracket: // [ - if (closeCode) { stack.push(closeCode) } - closeCode = ECharCodes.CloseBracket - break + if (closeCode) { + stack.push(closeCode); + } + closeCode = ECharCodes.CloseBracket; + break; case ECharCodes.CloseBracket: // ] case ECharCodes.CloseParenthesis: // ) if (!closeCode || ch !== closeCode) { - throw new ParseError(`To many close tags ${String.fromCharCode(ch)}`, { start, end: this.index}) + throw new ParseError( + `To many close tags ${String.fromCharCode(ch)}`, + { start, end: this.index }, + ); } - closeCode = stack.pop() - break + closeCode = stack.pop(); + break; } } else { switch (ch) { case ECharCodes.SingleQuote: // ' case ECharCodes.DoubleQuote: // " if (closeCode === ch) { - closeCode = stack.pop() + closeCode = stack.pop(); } - break + break; } } if (!closeCode) { - const nextPos = this.getNextPos(endTags) + const nextPos = this.getNextPos(endTags); if (nextPos.pos !== -1 && this.index === nextPos.pos) { - this.index += nextPos.text.length - return { paramText, endToken: nextPos.text } + this.index += nextPos.text.length; + return { paramText, endToken: nextPos.text }; } else { - paramText += this.charAt(this.index) - ++this.index + paramText += this.charAt(this.index); + ++this.index; } } else { - paramText += this.charAt(this.index) - ++this.index + paramText += this.charAt(this.index); + ++this.index; } } if (closeCode) { - throw new ParseError(`Missing ${String.fromCharCode(closeCode)} close char`, { start, end: this.index}) + throw new ParseError( + `Missing ${String.fromCharCode(closeCode)} close char`, + { start, end: this.index }, + ); } - throw new ParseError(`Unclosed directive or macro`, { start, end: this.index}) + throw new ParseError(`Unclosed directive or macro`, { + start, + end: this.index, + }); } } diff --git a/src/decorators/noParams.ts b/src/decorators/noParams.ts index cf9241f..e3425ab 100644 --- a/src/decorators/noParams.ts +++ b/src/decorators/noParams.ts @@ -1,17 +1,22 @@ -import ParseError from '../errors/ParseError' -import {IToken} from '../interface/Tokens' -import AbstractNode from '../nodes/abstract/AbstractNode' +import ParseError from '../errors/ParseError'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from '../nodes/abstract/AbstractNode'; -export default function noParams (target : T) : T { +type NoParamsType = new (...args: any[]) => AbstractNode; + +export default function noParams(target: T): T { return class Final extends target { - constructor (...args : any[]) { - super(...args) + constructor(...args: any[]) { + super(...args); if (args[0]) { - const token = args[0] as IToken + const token = args[0] as IToken; if (token.params) { - throw new ParseError(`Unexpected parameter in ${args[0].type}`, token) + throw new ParseError( + `Unexpected parameter in ${args[0].type}`, + token, + ); } } } - } + }; } diff --git a/src/defaultConfig.ts b/src/defaultConfig.ts index 9cc3c52..e3ef326 100644 --- a/src/defaultConfig.ts +++ b/src/defaultConfig.ts @@ -1,8 +1,8 @@ -import {IOptions} from './interface/IOptions' +import { IOptions } from './interface/IOptions'; -const defaultConfig : IOptions = { - squareTags : false, - parseLocation : true, -} +const defaultConfig: IOptions = { + squareTags: false, + parseLocation: true, +}; -export default defaultConfig +export default defaultConfig; diff --git a/src/enum/CharCodes.ts b/src/enum/CharCodes.ts index cb7d59e..2543518 100644 --- a/src/enum/CharCodes.ts +++ b/src/enum/CharCodes.ts @@ -66,7 +66,7 @@ enum ECharCodes { Equal = 0x3d, Greater = 0x3e, QuestionMark = 0x3f, - At = 0X40, + At = 0x40, A = 0x41, B = 0x42, C = 0x43, @@ -150,4 +150,4 @@ enum ECharCodes { MathematicalSpace = 0x205f, Ogham = 0x1680, } -export default ECharCodes +export default ECharCodes; diff --git a/src/enum/Directives.ts b/src/enum/Directives.ts index 397f015..81b52bc 100644 --- a/src/enum/Directives.ts +++ b/src/enum/Directives.ts @@ -1,4 +1,4 @@ -import NodeNames from './NodeNames' +import NodeNames from './NodeNames'; export enum Directives { if = NodeNames.Condition, diff --git a/src/enum/NodeNames.ts b/src/enum/NodeNames.ts index da2059d..bbc09c5 100644 --- a/src/enum/NodeNames.ts +++ b/src/enum/NodeNames.ts @@ -42,4 +42,4 @@ enum NodeNames { OutputFormat = 'OutputFormat', } -export default NodeNames +export default NodeNames; diff --git a/src/enum/Operators.ts b/src/enum/Operators.ts index 645b449..545f460 100644 --- a/src/enum/Operators.ts +++ b/src/enum/Operators.ts @@ -1,20 +1,20 @@ export interface IBinaryOperators { - [n : string] : number + [n: string]: number; } export interface IUnaryOperators { - [n : string] : boolean + [n: string]: boolean; } export interface ILiteralOperators { - [n : string] : boolean + [n: string]: boolean; } export enum EOperators { FALSE = 'false', TRUE = 'true', RAW_STRING = '"', - RAW_STRING2 = '\'', + RAW_STRING2 = "'", DOT = '.', DOT_DOT = '..', DOT_DOT_LESS = '..<', @@ -68,25 +68,25 @@ export enum EOperators { } // Store the values to return for the various literals we may encounter -export const ELiterals : ILiteralOperators = { +export const ELiterals: ILiteralOperators = { [EOperators.TRUE]: true, [EOperators.FALSE]: false, -} +}; // Use a quickly-accessible map to store all of the unary operators -export const EUnaryOps : IUnaryOperators = { +export const EUnaryOps: IUnaryOperators = { [EOperators.MINUS]: true, [EOperators.TIMES]: true, [EOperators.EXCLAM]: true, [EOperators.PLUS]: true, [EOperators.MINUS_MINUS]: true, [EOperators.PLUS_PLUS]: true, -} +}; /** * @see http://en.wikipedia.org/wiki/Order_of_operations#Programming_language */ -export const EBinaryOps : IBinaryOperators = { +export const EBinaryOps: IBinaryOperators = { // Assignment operators (right to left) [EOperators.EQUALS]: 0, [EOperators.PLUS_EQUALS]: 0, @@ -127,20 +127,20 @@ export const EBinaryOps : IBinaryOperators = { // Custom [EOperators.BUILT_IN]: 11, -} +}; // Get return the longest key length of any object -export function getMaxKeyLength (obj : object) : number { - let maxLen = 0 - let len +export function getMaxKeyLength(obj: object): number { + let maxLen = 0; + let len; for (const key of Object.keys(obj)) { - len = key.length + len = key.length; if (len > maxLen) { - maxLen = len + maxLen = len; } } - return maxLen + return maxLen; } -export const maxBinaryOps = getMaxKeyLength(EBinaryOps) -export const maxUnaryOps = getMaxKeyLength(EUnaryOps) +export const maxBinaryOps = getMaxKeyLength(EBinaryOps); +export const maxUnaryOps = getMaxKeyLength(EUnaryOps); diff --git a/src/enum/ParamNames.ts b/src/enum/ParamNames.ts index 632dc96..d1998d6 100644 --- a/src/enum/ParamNames.ts +++ b/src/enum/ParamNames.ts @@ -14,4 +14,4 @@ enum ParamNames { UpdateExpression = 'UpdateExpression', } -export default ParamNames +export default ParamNames; diff --git a/src/errors/ParseError.ts b/src/errors/ParseError.ts index d13fc28..2eb0301 100644 --- a/src/errors/ParseError.ts +++ b/src/errors/ParseError.ts @@ -1,20 +1,20 @@ -import { ISourceLocation } from '../interface/ISourceLocation' -import { ILoc } from '../interface/Tokens' +import { ISourceLocation } from '../interface/ISourceLocation'; +import { ILoc } from '../interface/Tokens'; export default class ParseError implements ILoc { - public message : string - public start : number - public end : number - public loc? : { - start : ISourceLocation, - end : ISourceLocation, - } + public message: string; + public start: number; + public end: number; + public loc?: { + start: ISourceLocation; + end: ISourceLocation; + }; - constructor (message : string, el : ILoc) { - this.message = message - this.start = el.start - this.end = el.end + constructor(message: string, el: ILoc) { + this.message = message; + this.start = el.start; + this.end = el.end; // Set the prototype explicitly. - Object.setPrototypeOf(this, ParseError.prototype) + Object.setPrototypeOf(this, ParseError.prototype); } } diff --git a/src/index.ts b/src/index.ts index 3ffe7f3..fbb4467 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,4 @@ -import { Parser } from './Parser' -import { Tokenizer } from './Tokenizer' +import { Parser } from './Parser'; +import { Tokenizer } from './Tokenizer'; -export { - Parser, - Tokenizer, -} +export { Parser, Tokenizer }; diff --git a/src/interface/IOptions.ts b/src/interface/IOptions.ts index c644074..725a00f 100644 --- a/src/interface/IOptions.ts +++ b/src/interface/IOptions.ts @@ -1,7 +1,7 @@ export interface IOptions { - squareTags? : boolean + squareTags?: boolean; // squareInterpolation? : boolean // TODO: unsupported // hashInterpolation? : boolean // TODO: unsupported - parseLocation? : boolean + parseLocation?: boolean; // useCamelCaseNaming? : boolean // TODO: unsupported } diff --git a/src/interface/ISourceLocation.ts b/src/interface/ISourceLocation.ts index f8fa017..2077e4c 100644 --- a/src/interface/ISourceLocation.ts +++ b/src/interface/ISourceLocation.ts @@ -1,4 +1,4 @@ export interface ISourceLocation { - line : number - column : number + line: number; + column: number; } diff --git a/src/interface/Params.ts b/src/interface/Params.ts index ddc9e0b..009df0b 100644 --- a/src/interface/Params.ts +++ b/src/interface/Params.ts @@ -1,96 +1,106 @@ -import ParamNames from '../enum/ParamNames' +import ParamNames from '../enum/ParamNames'; export interface IExpression { - type : ParamNames + type: ParamNames; } export interface ICompound extends IExpression { - type : ParamNames.Compound - body : AllParamTypes[] + type: ParamNames.Compound; + body: AllParamTypes[]; } export interface ILiteral extends IExpression { - type : ParamNames.Literal - value : any - raw : string + type: ParamNames.Literal; + value: any; + raw: string; } export interface IArrayExpression extends IExpression { - type : ParamNames.ArrayExpression - elements : AllParamTypes[] + type: ParamNames.ArrayExpression; + elements: AllParamTypes[]; } export interface IIdentifier extends IExpression { - type : ParamNames.Identifier - name : string + type: ParamNames.Identifier; + name: string; } export interface IBinaryExpression extends IExpression { - type : ParamNames.BinaryExpression - operator : string - left : AllParamTypes - right : AllParamTypes + type: ParamNames.BinaryExpression; + operator: string; + left: AllParamTypes; + right: AllParamTypes; } export interface ILogicalExpression extends IExpression { - type : ParamNames.LogicalExpression - operator : string - left : AllParamTypes - right : AllParamTypes + type: ParamNames.LogicalExpression; + operator: string; + left: AllParamTypes; + right: AllParamTypes; } export interface IUnaryExpression extends IExpression { - type : ParamNames.UnaryExpression - operator : string - argument : AllParamTypes - prefix : boolean + type: ParamNames.UnaryExpression; + operator: string; + argument: AllParamTypes; + prefix: boolean; } export interface IMemberExpression extends IExpression { - type : ParamNames.MemberExpression - computed : boolean - object : AllParamTypes - property : AllParamTypes | null + type: ParamNames.MemberExpression; + computed: boolean; + object: AllParamTypes; + property: AllParamTypes | null; } export interface ICallExpression extends IExpression { - type : ParamNames.CallExpression - arguments : AllParamTypes[] - callee : AllParamTypes + type: ParamNames.CallExpression; + arguments: AllParamTypes[]; + callee: AllParamTypes; } export interface IAssignmentExpression extends IExpression { - type : ParamNames.AssignmentExpression - operator : string - left : AllParamTypes - right : AllParamTypes + type: ParamNames.AssignmentExpression; + operator: string; + left: AllParamTypes; + right: AllParamTypes; } export interface IBuiltInExpression { - type : ParamNames.BuiltInExpression - operator : string - left : AllParamTypes - right : AllParamTypes + type: ParamNames.BuiltInExpression; + operator: string; + left: AllParamTypes; + right: AllParamTypes; } export interface IUpdateExpression extends IExpression { - type : ParamNames.UpdateExpression - operator : string - prefix : boolean - argument : AllParamTypes + type: ParamNames.UpdateExpression; + operator: string; + prefix: boolean; + argument: AllParamTypes; } export interface IMapExpressionValues { - key : ILiteral - value : AllParamTypes + key: ILiteral; + value: AllParamTypes; } export interface IMapExpression extends IExpression { - type : ParamNames.MapExpression - elements : IMapExpressionValues[] + type: ParamNames.MapExpression; + elements: IMapExpressionValues[]; } -export type AllParamTypes = ILiteral | IArrayExpression | IIdentifier | - IBinaryExpression | ILogicalExpression | IUnaryExpression | IBuiltInExpression | - IMemberExpression | ICallExpression | ICompound | - IAssignmentExpression | IUpdateExpression | IMapExpression +export type AllParamTypes = + | ILiteral + | IArrayExpression + | IIdentifier + | IBinaryExpression + | ILogicalExpression + | IUnaryExpression + | IBuiltInExpression + | IMemberExpression + | ICallExpression + | ICompound + | IAssignmentExpression + | IUpdateExpression + | IMapExpression; diff --git a/src/interface/Tokens.ts b/src/interface/Tokens.ts index 0625306..8e064ba 100644 --- a/src/interface/Tokens.ts +++ b/src/interface/Tokens.ts @@ -1,19 +1,19 @@ -import { ENodeType } from '../Symbols' -import { ISourceLocation } from './ISourceLocation' +import { ENodeType } from '../Symbols'; +import { ISourceLocation } from './ISourceLocation'; export interface ILoc { - start : number - end : number, - loc? : { - start : ISourceLocation, - end : ISourceLocation, - } + start: number; + end: number; + loc?: { + start: ISourceLocation; + end: ISourceLocation; + }; } export interface IToken extends ILoc { - type : ENodeType - startTag? : string - endTag? : string - params? : string - text : string + type: ENodeType; + startTag?: string; + endTag?: string; + params?: string; + text: string; } diff --git a/src/nodes/AssignNode.ts b/src/nodes/AssignNode.ts index b1bccd7..19e766a 100644 --- a/src/nodes/AssignNode.ts +++ b/src/nodes/AssignNode.ts @@ -1,34 +1,43 @@ -import NodeNames from '../enum/NodeNames' -import ParamNames from '../enum/ParamNames' -import { AllParamTypes, IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import AbstractAssign from './abstract/AbstractAssign' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import ParamNames from '../enum/ParamNames'; +import { AllParamTypes, IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import AbstractAssign from './abstract/AbstractAssign'; +import AbstractNode from './abstract/AbstractNode'; export default class AssignNode extends AbstractAssign { - public params? : IExpression[] - public body? : AbstractNode[] + public params?: IExpression[]; + public body?: AbstractNode[]; - constructor (token : IToken) { - super(NodeNames.Assign, token) - this.params = this.checkParams(token) + constructor(token: IToken) { + super(NodeNames.Assign, token); + this.params = this.checkParams(token); - if (this.params.length === 1 && this.params[0].type === ParamNames.Identifier) { - this.body = [] + if ( + this.params.length === 1 && + this.params[0].type === ParamNames.Identifier + ) { + this.body = []; } } - protected isAssignmentExpressionSingle (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpressionSingle( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.Identifier) { - return param + return param; } - return super.isAssignmentExpressionSingle(param, token) + return super.isAssignmentExpressionSingle(param, token); } - protected isAssignmentExpression (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpression( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.UpdateExpression && !param.prefix) { - return param + return param; } - return super.isAssignmentExpression(param, token) + return super.isAssignmentExpression(param, token); } } diff --git a/src/nodes/AttemptNode.ts b/src/nodes/AttemptNode.ts index 89029bc..d5bddc1 100644 --- a/src/nodes/AttemptNode.ts +++ b/src/nodes/AttemptNode.ts @@ -1,20 +1,20 @@ -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; export default class AttemptNode extends AbstractNode { - public body : AbstractNode[] = [] - public fallback? : AbstractNode[] + public body: AbstractNode[] = []; + public fallback?: AbstractNode[]; - get hasBody () : boolean { - return true + get hasBody(): boolean { + return true; } - constructor (token : IToken) { - super(NodeNames.Attempt, token) + constructor(token: IToken) { + super(NodeNames.Attempt, token); } - public addToNode (child : AbstractNode) { - this.fallback ? this.fallback.push(child) : this.body.push(child) + public addToNode(child: AbstractNode) { + this.fallback ? this.fallback.push(child) : this.body.push(child); } } diff --git a/src/nodes/AutoEscNode.ts b/src/nodes/AutoEscNode.ts index 5ec79c2..729dbe4 100644 --- a/src/nodes/AutoEscNode.ts +++ b/src/nodes/AutoEscNode.ts @@ -1,12 +1,12 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; @noParams export default class AutoEscNode extends AbstractBodyNode { - constructor (token : IToken) { - super(NodeNames.AutoEsc, token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.AutoEsc, token); + this.body = []; } } diff --git a/src/nodes/BreakNode.ts b/src/nodes/BreakNode.ts index 1fd5da2..158b21c 100644 --- a/src/nodes/BreakNode.ts +++ b/src/nodes/BreakNode.ts @@ -1,11 +1,11 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class BreakNode extends AbstractNode { - constructor (token : IToken) { - super(NodeNames.Break, token) + constructor(token: IToken) { + super(NodeNames.Break, token); } } diff --git a/src/nodes/CommentNode.ts b/src/nodes/CommentNode.ts index de634a3..e767803 100644 --- a/src/nodes/CommentNode.ts +++ b/src/nodes/CommentNode.ts @@ -1,14 +1,14 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class CommentNode extends AbstractNode { - public text : string + public text: string; - constructor (token : IToken) { - super(NodeNames.Comment, token) - this.text = token.text + constructor(token: IToken) { + super(NodeNames.Comment, token); + this.text = token.text; } } diff --git a/src/nodes/CompressNode.ts b/src/nodes/CompressNode.ts index 9ac9189..f5eb9e8 100644 --- a/src/nodes/CompressNode.ts +++ b/src/nodes/CompressNode.ts @@ -1,12 +1,12 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; @noParams export default class CompressNode extends AbstractBodyNode { - constructor (token : IToken) { - super(NodeNames.Compress, token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.Compress, token); + this.body = []; } } diff --git a/src/nodes/ConditionNode.ts b/src/nodes/ConditionNode.ts index c5b8bac..4a507e8 100644 --- a/src/nodes/ConditionNode.ts +++ b/src/nodes/ConditionNode.ts @@ -1,25 +1,25 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class ConditionNode extends AbstractNode { - public params? : IExpression - public consequent : AbstractNode[] - public alternate? : AbstractNode[] + public params?: IExpression; + public consequent: AbstractNode[]; + public alternate?: AbstractNode[]; - get hasBody () : boolean { - return true + get hasBody(): boolean { + return true; } - constructor (token : IToken) { - super(NodeNames.Condition, token) - this.params = paramParser(token) - this.consequent = [] + constructor(token: IToken) { + super(NodeNames.Condition, token); + this.params = paramParser(token); + this.consequent = []; } - public addToNode (child : AbstractNode) { - this.alternate ? this.alternate.push(child) : this.consequent.push(child) + public addToNode(child: AbstractNode) { + this.alternate ? this.alternate.push(child) : this.consequent.push(child); } } diff --git a/src/nodes/EscapeNode.ts b/src/nodes/EscapeNode.ts index 90a4412..154cf5a 100644 --- a/src/nodes/EscapeNode.ts +++ b/src/nodes/EscapeNode.ts @@ -1,15 +1,15 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; export default class EscapeNode extends AbstractBodyNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Escape, token) - this.params = paramParser(token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.Escape, token); + this.params = paramParser(token); + this.body = []; } } diff --git a/src/nodes/FlushNode.ts b/src/nodes/FlushNode.ts index aadae28..dac7f93 100644 --- a/src/nodes/FlushNode.ts +++ b/src/nodes/FlushNode.ts @@ -1,11 +1,11 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class FlushNode extends AbstractNode { - constructor (token : IToken) { - super(NodeNames.Flush, token) + constructor(token: IToken) { + super(NodeNames.Flush, token); } } diff --git a/src/nodes/FtlNode.ts b/src/nodes/FtlNode.ts index 32fdd0a..236f07e 100644 --- a/src/nodes/FtlNode.ts +++ b/src/nodes/FtlNode.ts @@ -1,13 +1,13 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import AbstractAssign from './abstract/AbstractAssign' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import AbstractAssign from './abstract/AbstractAssign'; export default class FtlNode extends AbstractAssign { - public params? : IExpression[] + public params?: IExpression[]; - constructor (token : IToken) { - super(NodeNames.Assign, token) - this.params = this.checkParams(token) + constructor(token: IToken) { + super(NodeNames.Assign, token); + this.params = this.checkParams(token); } } diff --git a/src/nodes/FunctionNode.ts b/src/nodes/FunctionNode.ts index e103cc2..e494d9d 100644 --- a/src/nodes/FunctionNode.ts +++ b/src/nodes/FunctionNode.ts @@ -1,15 +1,15 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; export default class FunctionNode extends AbstractBodyNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Function, token) - this.params = paramParser(token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.Function, token); + this.params = paramParser(token); + this.body = []; } } diff --git a/src/nodes/GlobalNode.ts b/src/nodes/GlobalNode.ts index 80975c4..6f371ed 100644 --- a/src/nodes/GlobalNode.ts +++ b/src/nodes/GlobalNode.ts @@ -1,34 +1,43 @@ -import NodeNames from '../enum/NodeNames' -import ParamNames from '../enum/ParamNames' -import {AllParamTypes, IExpression} from '../interface/Params' -import { IToken } from '../interface/Tokens' -import AbstractAssign from './abstract/AbstractAssign' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import ParamNames from '../enum/ParamNames'; +import { AllParamTypes, IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import AbstractAssign from './abstract/AbstractAssign'; +import AbstractNode from './abstract/AbstractNode'; export default class GlobalNode extends AbstractAssign { - public params? : IExpression[] - public body? : AbstractNode[] + public params?: IExpression[]; + public body?: AbstractNode[]; - constructor (token : IToken) { - super(NodeNames.Global, token) - this.params = this.checkParams(token) + constructor(token: IToken) { + super(NodeNames.Global, token); + this.params = this.checkParams(token); - if (this.params.length === 1 && this.params[0].type === ParamNames.Identifier) { - this.body = [] + if ( + this.params.length === 1 && + this.params[0].type === ParamNames.Identifier + ) { + this.body = []; } } - protected isAssignmentExpressionSingle (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpressionSingle( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.Identifier) { - return param + return param; } - return super.isAssignmentExpressionSingle(param, token) + return super.isAssignmentExpressionSingle(param, token); } - protected isAssignmentExpression (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpression( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.UpdateExpression && !param.prefix) { - return param + return param; } - return super.isAssignmentExpression(param, token) + return super.isAssignmentExpression(param, token); } } diff --git a/src/nodes/ImportNode.ts b/src/nodes/ImportNode.ts index 6e029d6..9aca3a9 100644 --- a/src/nodes/ImportNode.ts +++ b/src/nodes/ImportNode.ts @@ -1,14 +1,14 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class ImportNode extends AbstractNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Import, token) - this.params = paramParser(token) + constructor(token: IToken) { + super(NodeNames.Import, token); + this.params = paramParser(token); } } diff --git a/src/nodes/IncludeNode.ts b/src/nodes/IncludeNode.ts index d36db45..eb82883 100644 --- a/src/nodes/IncludeNode.ts +++ b/src/nodes/IncludeNode.ts @@ -1,14 +1,14 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class IncludeNode extends AbstractNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Include, token) - this.params = paramParser(token) + constructor(token: IToken) { + super(NodeNames.Include, token); + this.params = paramParser(token); } } diff --git a/src/nodes/InterpolationNode.ts b/src/nodes/InterpolationNode.ts index 6d100ed..10f9a7b 100644 --- a/src/nodes/InterpolationNode.ts +++ b/src/nodes/InterpolationNode.ts @@ -1,14 +1,14 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class InterpolationNode extends AbstractNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Interpolation, token) - this.params = paramParser(token) + constructor(token: IToken) { + super(NodeNames.Interpolation, token); + this.params = paramParser(token); } } diff --git a/src/nodes/ListNode.ts b/src/nodes/ListNode.ts index 5a3f1ce..226221b 100644 --- a/src/nodes/ListNode.ts +++ b/src/nodes/ListNode.ts @@ -1,25 +1,25 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class ListNode extends AbstractNode { - public params? : IExpression - public body : AbstractNode[] - public fallback? : AbstractNode[] + public params?: IExpression; + public body: AbstractNode[]; + public fallback?: AbstractNode[]; - get hasBody () : boolean { - return true + get hasBody(): boolean { + return true; } - constructor (token : IToken) { - super(NodeNames.List, token) - this.params = paramParser(token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.List, token); + this.params = paramParser(token); + this.body = []; } - public addToNode (child : AbstractNode) { - this.fallback ? this.fallback.push(child) : this.body.push(child) + public addToNode(child: AbstractNode) { + this.fallback ? this.fallback.push(child) : this.body.push(child); } } diff --git a/src/nodes/LocalNode.ts b/src/nodes/LocalNode.ts index b3dadc3..d42139d 100644 --- a/src/nodes/LocalNode.ts +++ b/src/nodes/LocalNode.ts @@ -1,34 +1,43 @@ -import NodeNames from '../enum/NodeNames' -import ParamNames from '../enum/ParamNames' -import { AllParamTypes, IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import AbstractAssign from './abstract/AbstractAssign' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import ParamNames from '../enum/ParamNames'; +import { AllParamTypes, IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import AbstractAssign from './abstract/AbstractAssign'; +import AbstractNode from './abstract/AbstractNode'; export default class LocalNode extends AbstractAssign { - public params? : IExpression[] - public body? : AbstractNode[] + public params?: IExpression[]; + public body?: AbstractNode[]; - constructor (token : IToken) { - super(NodeNames.Local, token) - this.params = this.checkParams(token) + constructor(token: IToken) { + super(NodeNames.Local, token); + this.params = this.checkParams(token); - if (this.params.length === 1 && this.params[0].type === ParamNames.Identifier) { - this.body = [] + if ( + this.params.length === 1 && + this.params[0].type === ParamNames.Identifier + ) { + this.body = []; } } - protected isAssignmentExpressionSingle (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpressionSingle( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.Identifier) { - return param + return param; } - return super.isAssignmentExpressionSingle(param, token) + return super.isAssignmentExpressionSingle(param, token); } - protected isAssignmentExpression (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpression( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.UpdateExpression && !param.prefix) { - return param + return param; } - return super.isAssignmentExpression(param, token) + return super.isAssignmentExpression(param, token); } } diff --git a/src/nodes/LtNode.ts b/src/nodes/LtNode.ts index 89ebf4f..cd3821a 100644 --- a/src/nodes/LtNode.ts +++ b/src/nodes/LtNode.ts @@ -1,11 +1,11 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class LtNode extends AbstractNode { - constructor (token : IToken) { - super(NodeNames.Lt, token) + constructor(token: IToken) { + super(NodeNames.Lt, token); } } diff --git a/src/nodes/MacroCallNode.ts b/src/nodes/MacroCallNode.ts index cdaa14c..4800b11 100644 --- a/src/nodes/MacroCallNode.ts +++ b/src/nodes/MacroCallNode.ts @@ -1,21 +1,21 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractBodyNode from './abstract/AbstractBodyNode' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; +import AbstractNode from './abstract/AbstractNode'; export default class MacroCallNode extends AbstractBodyNode { - public params? : IExpression - public name : string - public body? : AbstractNode[] + public params?: IExpression; + public name: string; + public body?: AbstractNode[]; - constructor (token : IToken) { - super(NodeNames.MacroCall, token) - this.name = token.text - this.params = paramParser(token) + constructor(token: IToken) { + super(NodeNames.MacroCall, token); + this.name = token.text; + this.params = paramParser(token); if (token.endTag !== '/>') { - this.body = [] + this.body = []; } } } diff --git a/src/nodes/MacroNode.ts b/src/nodes/MacroNode.ts index 2eab9e3..8f5e880 100644 --- a/src/nodes/MacroNode.ts +++ b/src/nodes/MacroNode.ts @@ -1,15 +1,15 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; export default class MacroNode extends AbstractBodyNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Macro, token) - this.params = paramParser(token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.Macro, token); + this.params = paramParser(token); + this.body = []; } } diff --git a/src/nodes/NoAutoEscNode.ts b/src/nodes/NoAutoEscNode.ts index 9c4e299..bd848eb 100644 --- a/src/nodes/NoAutoEscNode.ts +++ b/src/nodes/NoAutoEscNode.ts @@ -1,12 +1,12 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; @noParams export default class NoAutoEscNode extends AbstractBodyNode { - constructor (token : IToken) { - super(NodeNames.NoAutoEsc, token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.NoAutoEsc, token); + this.body = []; } } diff --git a/src/nodes/NoEscapeNode.ts b/src/nodes/NoEscapeNode.ts index 54bed28..982349a 100644 --- a/src/nodes/NoEscapeNode.ts +++ b/src/nodes/NoEscapeNode.ts @@ -1,12 +1,12 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; @noParams export default class NoEscapeNode extends AbstractBodyNode { - constructor (token : IToken) { - super(NodeNames.NoEscape, token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.NoEscape, token); + this.body = []; } } diff --git a/src/nodes/NtNode.ts b/src/nodes/NtNode.ts index 9280117..272246d 100644 --- a/src/nodes/NtNode.ts +++ b/src/nodes/NtNode.ts @@ -1,11 +1,11 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class NtNode extends AbstractNode { - constructor (token : IToken) { - super(NodeNames.Nt, token) + constructor(token: IToken) { + super(NodeNames.Nt, token); } } diff --git a/src/nodes/OutputFormatNode.ts b/src/nodes/OutputFormatNode.ts index 7a4ca5b..c90303d 100644 --- a/src/nodes/OutputFormatNode.ts +++ b/src/nodes/OutputFormatNode.ts @@ -1,20 +1,20 @@ -import NodeNames from '../enum/NodeNames' -import ParamNames from '../enum/ParamNames' -import ParseError from '../errors/ParseError' -import {IExpression} from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractBodyNode from './abstract/AbstractBodyNode' +import NodeNames from '../enum/NodeNames'; +import ParamNames from '../enum/ParamNames'; +import ParseError from '../errors/ParseError'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; export default class OutputFormatNode extends AbstractBodyNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.OutputFormat, token) - this.params = paramParser(token) - this.body = [] + constructor(token: IToken) { + super(NodeNames.OutputFormat, token); + this.params = paramParser(token); + this.body = []; if (!this.params || this.params.type !== ParamNames.Literal) { - throw new ParseError(`Invalid parameters in ${this.type}`, token) + throw new ParseError(`Invalid parameters in ${this.type}`, token); } } } diff --git a/src/nodes/ProgramNode.ts b/src/nodes/ProgramNode.ts index 14d90ca..9156ea2 100644 --- a/src/nodes/ProgramNode.ts +++ b/src/nodes/ProgramNode.ts @@ -1,24 +1,24 @@ -import NodeNames from '../enum/NodeNames' -import ParseError from '../errors/ParseError' -import AbstractBodyNode from './abstract/AbstractBodyNode' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import ParseError from '../errors/ParseError'; +import AbstractBodyNode from './abstract/AbstractBodyNode'; +import AbstractNode from './abstract/AbstractNode'; export default class ProgramNode extends AbstractBodyNode { - public errors? : ParseError[] - public body : AbstractNode[] + public errors?: ParseError[]; + public body: AbstractNode[]; - constructor (start : number, end : number) { - super(NodeNames.Program, { start, end }) - this.body = [] + constructor(start: number, end: number) { + super(NodeNames.Program, { start, end }); + this.body = []; } - public addError (error : any) : void { + public addError(error: any): void { if (error instanceof ParseError) { if (!this.errors) { - this.errors = [] + this.errors = []; } - this.errors.push(error) + this.errors.push(error); } } } diff --git a/src/nodes/ReturnNode.ts b/src/nodes/ReturnNode.ts index ac296e2..6e454a9 100644 --- a/src/nodes/ReturnNode.ts +++ b/src/nodes/ReturnNode.ts @@ -1,14 +1,14 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class ReturnNode extends AbstractNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Return, token) - this.params = paramParser(token) + constructor(token: IToken) { + super(NodeNames.Return, token); + this.params = paramParser(token); } } diff --git a/src/nodes/RtNode.ts b/src/nodes/RtNode.ts index da7762b..31e8a45 100644 --- a/src/nodes/RtNode.ts +++ b/src/nodes/RtNode.ts @@ -1,11 +1,11 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class RtNode extends AbstractNode { - constructor (token : IToken) { - super(NodeNames.Rt, token) + constructor(token: IToken) { + super(NodeNames.Rt, token); } } diff --git a/src/nodes/SettingNode.ts b/src/nodes/SettingNode.ts index c9d5755..3bbfd8f 100644 --- a/src/nodes/SettingNode.ts +++ b/src/nodes/SettingNode.ts @@ -1,24 +1,24 @@ -import NodeNames from '../enum/NodeNames' -import ParamNames from '../enum/ParamNames' -import ParseError from '../errors/ParseError' -import {IAssignmentExpression} from '../interface/Params' -import { IToken } from '../interface/Tokens' -import AbstractAssign from './abstract/AbstractAssign' +import NodeNames from '../enum/NodeNames'; +import ParamNames from '../enum/ParamNames'; +import ParseError from '../errors/ParseError'; +import { IAssignmentExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import AbstractAssign from './abstract/AbstractAssign'; export default class SettingNode extends AbstractAssign { - public expression : IAssignmentExpression + public expression: IAssignmentExpression; - constructor (token : IToken) { - super(NodeNames.Setting, token) - const params = this.checkParams(token) + constructor(token: IToken) { + super(NodeNames.Setting, token); + const params = this.checkParams(token); if (params.length === 1) { - const param = params[0] + const param = params[0]; if (param.type === ParamNames.AssignmentExpression) { - this.expression = param - return + this.expression = param; + return; } } - throw new ParseError(`Invalid parameters in ${this.type}`, token) + throw new ParseError(`Invalid parameters in ${this.type}`, token); } } diff --git a/src/nodes/StopNode.ts b/src/nodes/StopNode.ts index ee2df7c..38df80d 100644 --- a/src/nodes/StopNode.ts +++ b/src/nodes/StopNode.ts @@ -1,16 +1,16 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class StopNode extends AbstractNode { - public params? : IExpression + public params?: IExpression; - constructor (token : IToken) { - super(NodeNames.Stop, token) - this.params = paramParser(token) + constructor(token: IToken) { + super(NodeNames.Stop, token); + this.params = paramParser(token); } } diff --git a/src/nodes/SwitchCaseNode.ts b/src/nodes/SwitchCaseNode.ts index 86eb5a1..d1046b6 100644 --- a/src/nodes/SwitchCaseNode.ts +++ b/src/nodes/SwitchCaseNode.ts @@ -1,16 +1,16 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; export default class SwitchCaseNode extends AbstractNode { - public params? : IExpression - public consequent : AbstractNode[] + public params?: IExpression; + public consequent: AbstractNode[]; - constructor (token : IToken) { - super(NodeNames.SwitchCase, token) - this.params = paramParser(token) - this.consequent = [] + constructor(token: IToken) { + super(NodeNames.SwitchCase, token); + this.params = paramParser(token); + this.consequent = []; } } diff --git a/src/nodes/SwitchDefaultNode.ts b/src/nodes/SwitchDefaultNode.ts index 0bfa5af..b5388b3 100644 --- a/src/nodes/SwitchDefaultNode.ts +++ b/src/nodes/SwitchDefaultNode.ts @@ -1,14 +1,14 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class SwitchDefaultNode extends AbstractNode { - public consequent : AbstractNode[] + public consequent: AbstractNode[]; - constructor (token : IToken) { - super(NodeNames.SwitchDefault, token) - this.consequent = [] + constructor(token: IToken) { + super(NodeNames.SwitchDefault, token); + this.consequent = []; } } diff --git a/src/nodes/SwitchNode.ts b/src/nodes/SwitchNode.ts index 806481e..0cc7e05 100644 --- a/src/nodes/SwitchNode.ts +++ b/src/nodes/SwitchNode.ts @@ -1,38 +1,39 @@ -import NodeNames from '../enum/NodeNames' -import { IExpression } from '../interface/Params' -import { IToken } from '../interface/Tokens' -import { paramParser } from '../utils/Params' -import AbstractNode from './abstract/AbstractNode' -import SwitchCaseNode from './SwitchCaseNode' -import SwitchDefaultNode from './SwitchDefaultNode' +import NodeNames from '../enum/NodeNames'; +import { IExpression } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { paramParser } from '../utils/Params'; +import AbstractNode from './abstract/AbstractNode'; +import SwitchCaseNode from './SwitchCaseNode'; +import SwitchDefaultNode from './SwitchDefaultNode'; -export type NodeSwitchGroup = SwitchCaseNode | SwitchDefaultNode +export type NodeSwitchGroup = SwitchCaseNode | SwitchDefaultNode; export default class SwitchNode extends AbstractNode { - public params? : IExpression - public cases : NodeSwitchGroup[] + public params?: IExpression; + public cases: NodeSwitchGroup[]; - get hasBody () : boolean { - return true + get hasBody(): boolean { + return true; } - constructor (token : IToken) { - super(NodeNames.Switch, token) - this.params = paramParser(token) - this.cases = [] + constructor(token: IToken) { + super(NodeNames.Switch, token); + this.params = paramParser(token); + this.cases = []; } - public addToNode (child : AbstractNode) { + public addToNode(child: AbstractNode) { if (child instanceof SwitchCaseNode || child instanceof SwitchDefaultNode) { - this.cases.push(child) + this.cases.push(child); } else if (this.cases.length === 0) { - if (child.type === NodeNames.Text) { // TODO: accept only whitespaces - return + if (child.type === NodeNames.Text) { + // TODO: accept only whitespaces + return; } } else { - this.cases[this.cases.length - 1].consequent.push(child) - return + this.cases[this.cases.length - 1].consequent.push(child); + return; } - super.addToNode(child) + super.addToNode(child); } } diff --git a/src/nodes/TNode.ts b/src/nodes/TNode.ts index 666c2ae..88a37c2 100644 --- a/src/nodes/TNode.ts +++ b/src/nodes/TNode.ts @@ -1,11 +1,11 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class TNode extends AbstractNode { - constructor (token : IToken) { - super(NodeNames.T, token) + constructor(token: IToken) { + super(NodeNames.T, token); } } diff --git a/src/nodes/TextNode.ts b/src/nodes/TextNode.ts index 2eed924..950d70c 100644 --- a/src/nodes/TextNode.ts +++ b/src/nodes/TextNode.ts @@ -1,14 +1,14 @@ -import noParams from '../decorators/noParams' -import NodeNames from '../enum/NodeNames' -import { IToken } from '../interface/Tokens' -import AbstractNode from './abstract/AbstractNode' +import noParams from '../decorators/noParams'; +import NodeNames from '../enum/NodeNames'; +import { IToken } from '../interface/Tokens'; +import AbstractNode from './abstract/AbstractNode'; @noParams export default class TextNode extends AbstractNode { - public text : string + public text: string; - constructor (token : IToken) { - super(NodeNames.Text, token) - this.text = token.text + constructor(token: IToken) { + super(NodeNames.Text, token); + this.text = token.text; } } diff --git a/src/nodes/abstract/AbstractAssign.ts b/src/nodes/abstract/AbstractAssign.ts index 996152d..628e388 100644 --- a/src/nodes/abstract/AbstractAssign.ts +++ b/src/nodes/abstract/AbstractAssign.ts @@ -1,35 +1,41 @@ -import ParamNames from '../../enum/ParamNames' -import ParseError from '../../errors/ParseError' -import { AllParamTypes } from '../../interface/Params' -import { IToken } from '../../interface/Tokens' -import { paramParser } from '../../utils/Params' -import AbstractBodyNode from './AbstractBodyNode' +import ParamNames from '../../enum/ParamNames'; +import ParseError from '../../errors/ParseError'; +import { AllParamTypes } from '../../interface/Params'; +import { IToken } from '../../interface/Tokens'; +import { paramParser } from '../../utils/Params'; +import AbstractBodyNode from './AbstractBodyNode'; export default abstract class AbstractAssign extends AbstractBodyNode { - protected checkParams (token : IToken) : AllParamTypes[] { - const params = paramParser(token) + protected checkParams(token: IToken): AllParamTypes[] { + const params = paramParser(token); if (params) { - const result = [] + const result = []; if (params.type === ParamNames.Compound) { for (const param of params.body) { - result.push(this.isAssignmentExpression(param, token)) + result.push(this.isAssignmentExpression(param, token)); } } else { - result.push(this.isAssignmentExpressionSingle(params, token)) + result.push(this.isAssignmentExpressionSingle(params, token)); } - return result + return result; } - throw new ParseError(`${this.type} require params`, token) + throw new ParseError(`${this.type} require params`, token); } - protected isAssignmentExpressionSingle (param : AllParamTypes, token : IToken) : AllParamTypes { - return this.isAssignmentExpression(param, token) + protected isAssignmentExpressionSingle( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { + return this.isAssignmentExpression(param, token); } - protected isAssignmentExpression (param : AllParamTypes, token : IToken) : AllParamTypes { + protected isAssignmentExpression( + param: AllParamTypes, + token: IToken, + ): AllParamTypes { if (param.type === ParamNames.AssignmentExpression) { - return param + return param; } - throw new ParseError(`Invalid parameters in ${this.type}`, token) + throw new ParseError(`Invalid parameters in ${this.type}`, token); } } diff --git a/src/nodes/abstract/AbstractBodyNode.ts b/src/nodes/abstract/AbstractBodyNode.ts index fd23332..05fb806 100644 --- a/src/nodes/abstract/AbstractBodyNode.ts +++ b/src/nodes/abstract/AbstractBodyNode.ts @@ -1,17 +1,17 @@ -import AbstractNode from './AbstractNode' +import AbstractNode from './AbstractNode'; export default abstract class AbstractBodyNode extends AbstractNode { - public body? : AbstractNode[] + public body?: AbstractNode[]; - get hasBody () : boolean { - return Boolean(this.body) + get hasBody(): boolean { + return Boolean(this.body); } - public addToNode (child : AbstractNode) { + public addToNode(child: AbstractNode) { if (this.body) { - this.body.push(child) + this.body.push(child); } else { - super.addToNode(child) + super.addToNode(child); } } } diff --git a/src/nodes/abstract/AbstractNode.ts b/src/nodes/abstract/AbstractNode.ts index c8f1eb3..bd7eabe 100644 --- a/src/nodes/abstract/AbstractNode.ts +++ b/src/nodes/abstract/AbstractNode.ts @@ -1,23 +1,26 @@ -import NodeNames from '../../enum/NodeNames' -import ParseError from '../../errors/ParseError' -import { ILoc } from '../../interface/Tokens' +import NodeNames from '../../enum/NodeNames'; +import ParseError from '../../errors/ParseError'; +import { ILoc } from '../../interface/Tokens'; export default abstract class AbstractNode implements ILoc { - public type : NodeNames - public start : number - public end : number + public type: NodeNames; + public start: number; + public end: number; - get hasBody () : boolean { - return false + get hasBody(): boolean { + return false; } - protected constructor (type : NodeNames, token : ILoc) { - this.type = type - this.start = token.start - this.end = token.end + protected constructor(type: NodeNames, token: ILoc) { + this.type = type; + this.start = token.start; + this.end = token.end; } - public addToNode (child : AbstractNode) : void { - throw new ParseError(`Node ${this.type} can't contain ${child.type}`, child) + public addToNode(child: AbstractNode): void { + throw new ParseError( + `Node ${this.type} can't contain ${child.type}`, + child, + ); } } diff --git a/src/utils/Chars.ts b/src/utils/Chars.ts index 7dcf874..004b603 100644 --- a/src/utils/Chars.ts +++ b/src/utils/Chars.ts @@ -1,34 +1,45 @@ -import ECharCodes from '../enum/CharCodes' -import {EBinaryOps} from '../enum/Operators' +import ECharCodes from '../enum/CharCodes'; +import { EBinaryOps } from '../enum/Operators'; -export function isDecimalDigit (ch : number) : boolean { - return ch >= ECharCodes._0 && ch <= ECharCodes._9 // 0...9 +export function isDecimalDigit(ch: number): boolean { + return ch >= ECharCodes._0 && ch <= ECharCodes._9; // 0...9 } -export function isLetter (ch : number) : boolean { - return (ch >= ECharCodes.a && ch <= ECharCodes.z) || // a...z - (ch >= ECharCodes.A && ch <= ECharCodes.Z) // A...Z +export function isLetter(ch: number): boolean { + return ( + (ch >= ECharCodes.a && ch <= ECharCodes.z) || // a...z + (ch >= ECharCodes.A && ch <= ECharCodes.Z) + ); // A...Z } -export function isWhitespace (ch : number) : boolean { - return ch === ECharCodes.Space || ch === ECharCodes.Tab || ch === ECharCodes.CarriageReturn || ch === ECharCodes.LineFeed +export function isWhitespace(ch: number): boolean { + return ( + ch === ECharCodes.Space || + ch === ECharCodes.Tab || + ch === ECharCodes.CarriageReturn || + ch === ECharCodes.LineFeed + ); } // any non-ASCII that is not an operator -export function isIdentifierStart (ch : number) : boolean { +export function isIdentifierStart(ch: number): boolean { return ( - isLetter(ch) || - (ch === ECharCodes.$) || (ch === ECharCodes.Underscore) || // `$` and `_` - ch >= 128 - ) && !EBinaryOps[String.fromCharCode(ch)] + (isLetter(ch) || + ch === ECharCodes.$ || + ch === ECharCodes.Underscore || // `$` and `_` + ch >= 128) && + !EBinaryOps[String.fromCharCode(ch)] + ); } // any non-ASCII that is not an operator -export function isIdentifierPart (ch : number) : boolean { +export function isIdentifierPart(ch: number): boolean { return ( - isLetter(ch) || + (isLetter(ch) || isDecimalDigit(ch) || - (ch === ECharCodes.$) || (ch === ECharCodes.Underscore) || // `$` and `_` - ch >= 128 - ) && !EBinaryOps[String.fromCharCode(ch)] + ch === ECharCodes.$ || + ch === ECharCodes.Underscore || // `$` and `_` + ch >= 128) && + !EBinaryOps[String.fromCharCode(ch)] + ); } diff --git a/src/utils/Nodes.ts b/src/utils/Nodes.ts index ce0d1f7..667e698 100644 --- a/src/utils/Nodes.ts +++ b/src/utils/Nodes.ts @@ -1,183 +1,204 @@ -import NodeNames from '../enum/NodeNames' -import ParseError from '../errors/ParseError' -import { IToken } from '../interface/Tokens' +import NodeNames from '../enum/NodeNames'; +import ParseError from '../errors/ParseError'; +import { IToken } from '../interface/Tokens'; -import AbstractNode from '../nodes/abstract/AbstractNode' -import AssignNode from '../nodes/AssignNode' -import AttemptNode from '../nodes/AttemptNode' -import AutoEscNode from '../nodes/AutoEscNode' -import BreakNode from '../nodes/BreakNode' -import CommentNode from '../nodes/CommentNode' -import CompressNode from '../nodes/CompressNode' -import ConditionNode from '../nodes/ConditionNode' -import EscapeNode from '../nodes/EscapeNode' -import FlushNode from '../nodes/FlushNode' -import FtlNode from '../nodes/FtlNode' -import FunctionNode from '../nodes/FunctionNode' -import GlobalNode from '../nodes/GlobalNode' -import ImportNode from '../nodes/ImportNode' -import IncludeNode from '../nodes/IncludeNode' -import InterpolationNode from '../nodes/InterpolationNode' -import ListNode from '../nodes/ListNode' -import LocalNode from '../nodes/LocalNode' -import LtNode from '../nodes/LtNode' -import MacroCallNode from '../nodes/MacroCallNode' -import MacroNode from '../nodes/MacroNode' -import NoAutoEscNode from '../nodes/NoAutoEscNode' -import NoEscapeNode from '../nodes/NoEscapeNode' -import NtNode from '../nodes/NtNode' -import OutputFormatNode from '../nodes/OutputFormatNode' -import ReturnNode from '../nodes/ReturnNode' -import RtNode from '../nodes/RtNode' -import SettingNode from '../nodes/SettingNode' -import StopNode from '../nodes/StopNode' -import SwitchCaseNode from '../nodes/SwitchCaseNode' -import SwitchDefaultNode from '../nodes/SwitchDefaultNode' -import SwitchNode from '../nodes/SwitchNode' -import TextNode from '../nodes/TextNode' -import TNode from '../nodes/TNode' +import AbstractNode from '../nodes/abstract/AbstractNode'; +import AssignNode from '../nodes/AssignNode'; +import AttemptNode from '../nodes/AttemptNode'; +import AutoEscNode from '../nodes/AutoEscNode'; +import BreakNode from '../nodes/BreakNode'; +import CommentNode from '../nodes/CommentNode'; +import CompressNode from '../nodes/CompressNode'; +import ConditionNode from '../nodes/ConditionNode'; +import EscapeNode from '../nodes/EscapeNode'; +import FlushNode from '../nodes/FlushNode'; +import FtlNode from '../nodes/FtlNode'; +import FunctionNode from '../nodes/FunctionNode'; +import GlobalNode from '../nodes/GlobalNode'; +import ImportNode from '../nodes/ImportNode'; +import IncludeNode from '../nodes/IncludeNode'; +import InterpolationNode from '../nodes/InterpolationNode'; +import ListNode from '../nodes/ListNode'; +import LocalNode from '../nodes/LocalNode'; +import LtNode from '../nodes/LtNode'; +import MacroCallNode from '../nodes/MacroCallNode'; +import MacroNode from '../nodes/MacroNode'; +import NoAutoEscNode from '../nodes/NoAutoEscNode'; +import NoEscapeNode from '../nodes/NoEscapeNode'; +import NtNode from '../nodes/NtNode'; +import OutputFormatNode from '../nodes/OutputFormatNode'; +import ReturnNode from '../nodes/ReturnNode'; +import RtNode from '../nodes/RtNode'; +import SettingNode from '../nodes/SettingNode'; +import StopNode from '../nodes/StopNode'; +import SwitchCaseNode from '../nodes/SwitchCaseNode'; +import SwitchDefaultNode from '../nodes/SwitchDefaultNode'; +import SwitchNode from '../nodes/SwitchNode'; +import TextNode from '../nodes/TextNode'; +import TNode from '../nodes/TNode'; export interface INodes { - [n : string] : (token : IToken, parent : AbstractNode) => AbstractNode + [n: string]: (token: IToken, parent: AbstractNode) => AbstractNode; } -const Nodes : INodes = { - [NodeNames.Else] (token : IToken, parent : AbstractNode) : AbstractNode { +const Nodes: INodes = { + [NodeNames.Else](token: IToken, parent: AbstractNode): AbstractNode { if (parent instanceof ConditionNode && !parent.alternate) { - parent.alternate = [] - return parent + parent.alternate = []; + return parent; } else if (parent instanceof ListNode && !parent.fallback) { - parent.fallback = [] - return parent + parent.fallback = []; + return parent; } - throw new ParseError(`Error while creating node '${NodeNames.Else}' inside '${parent.type}'`, token) - }, - [NodeNames.Condition] (token : IToken) : ConditionNode { - return new ConditionNode(token) - }, - [NodeNames.ConditionElse] (token : IToken, parent : AbstractNode) : ConditionNode { + throw new ParseError( + `Error while creating node '${NodeNames.Else}' inside '${parent.type}'`, + token, + ); + }, + [NodeNames.Condition](token: IToken): ConditionNode { + return new ConditionNode(token); + }, + [NodeNames.ConditionElse]( + token: IToken, + parent: AbstractNode, + ): ConditionNode { if (parent instanceof ConditionNode && !parent.alternate) { - parent.alternate = [] - return new ConditionNode(token) + parent.alternate = []; + return new ConditionNode(token); } - throw new ParseError(`Error while creating node '${NodeNames.ConditionElse}' inside '${parent.type}'`, token) + throw new ParseError( + `Error while creating node '${NodeNames.ConditionElse}' inside '${parent.type}'`, + token, + ); }, - [NodeNames.Recover] (token : IToken, parent : AbstractNode) : AbstractNode { + [NodeNames.Recover](token: IToken, parent: AbstractNode): AbstractNode { if (parent instanceof AttemptNode) { if (!parent.fallback) { - parent.fallback = [] - return parent + parent.fallback = []; + return parent; } } - throw new ParseError(`Error while creating node '${NodeNames.Recover}' inside '${parent.type}'`, token) + throw new ParseError( + `Error while creating node '${NodeNames.Recover}' inside '${parent.type}'`, + token, + ); }, - [NodeNames.SwitchCase] (token : IToken, parent : AbstractNode) : AbstractNode { + [NodeNames.SwitchCase](token: IToken, parent: AbstractNode): AbstractNode { if (parent instanceof SwitchNode) { - parent.cases.push(new SwitchCaseNode(token)) - return parent + parent.cases.push(new SwitchCaseNode(token)); + return parent; } - throw new ParseError(`Error while creating node '${NodeNames.SwitchCase}' inside '${parent.type}'`, token) + throw new ParseError( + `Error while creating node '${NodeNames.SwitchCase}' inside '${parent.type}'`, + token, + ); }, - [NodeNames.SwitchDefault] (token : IToken, parent : AbstractNode) : AbstractNode { + [NodeNames.SwitchDefault](token: IToken, parent: AbstractNode): AbstractNode { if (parent instanceof SwitchNode) { - parent.cases.push(new SwitchDefaultNode(token)) - return parent + parent.cases.push(new SwitchDefaultNode(token)); + return parent; } - throw new ParseError(`Error while creating node '${NodeNames.SwitchDefault}' inside '${parent.type}'`, token) + throw new ParseError( + `Error while creating node '${NodeNames.SwitchDefault}' inside '${parent.type}'`, + token, + ); }, - [NodeNames.Global] (token : IToken) : GlobalNode { - return new GlobalNode(token) + [NodeNames.Global](token: IToken): GlobalNode { + return new GlobalNode(token); }, - [NodeNames.Local] (token : IToken) : LocalNode { - return new LocalNode(token) + [NodeNames.Local](token: IToken): LocalNode { + return new LocalNode(token); }, - [NodeNames.Assign] (token : IToken) : AssignNode { - return new AssignNode(token) + [NodeNames.Assign](token: IToken): AssignNode { + return new AssignNode(token); }, - [NodeNames.Function] (token : IToken) : FunctionNode { - return new FunctionNode(token) + [NodeNames.Function](token: IToken): FunctionNode { + return new FunctionNode(token); }, - [NodeNames.Return] (token : IToken) : ReturnNode { - return new ReturnNode(token) + [NodeNames.Return](token: IToken): ReturnNode { + return new ReturnNode(token); }, - [NodeNames.Attempt] (token : IToken) : AttemptNode { - return new AttemptNode(token) + [NodeNames.Attempt](token: IToken): AttemptNode { + return new AttemptNode(token); }, - [NodeNames.List] (token : IToken) : ListNode { - return new ListNode(token) + [NodeNames.List](token: IToken): ListNode { + return new ListNode(token); }, - [NodeNames.Macro] (token : IToken) : MacroNode { - return new MacroNode(token) + [NodeNames.Macro](token: IToken): MacroNode { + return new MacroNode(token); }, - [NodeNames.Include] (token : IToken) : IncludeNode { - return new IncludeNode(token) + [NodeNames.Include](token: IToken): IncludeNode { + return new IncludeNode(token); }, - [NodeNames.Interpolation] (token : IToken) : InterpolationNode { - return new InterpolationNode(token) + [NodeNames.Interpolation](token: IToken): InterpolationNode { + return new InterpolationNode(token); }, - [NodeNames.Text] (token : IToken) : TextNode { - return new TextNode(token) + [NodeNames.Text](token: IToken): TextNode { + return new TextNode(token); }, - [NodeNames.MacroCall] (token : IToken) : MacroCallNode { - return new MacroCallNode(token) + [NodeNames.MacroCall](token: IToken): MacroCallNode { + return new MacroCallNode(token); }, - [NodeNames.Comment] (token : IToken) : CommentNode { - return new CommentNode(token) + [NodeNames.Comment](token: IToken): CommentNode { + return new CommentNode(token); }, - [NodeNames.Switch] (token : IToken) : SwitchNode { - return new SwitchNode(token) + [NodeNames.Switch](token: IToken): SwitchNode { + return new SwitchNode(token); }, - [NodeNames.Break] (token : IToken) : BreakNode { - return new BreakNode(token) + [NodeNames.Break](token: IToken): BreakNode { + return new BreakNode(token); }, - [NodeNames.Compress] (token : IToken) : CompressNode { - return new CompressNode(token) + [NodeNames.Compress](token: IToken): CompressNode { + return new CompressNode(token); }, - [NodeNames.Import] (token : IToken) : ImportNode { - return new ImportNode(token) + [NodeNames.Import](token: IToken): ImportNode { + return new ImportNode(token); }, - [NodeNames.Stop] (token : IToken) : StopNode { - return new StopNode(token) + [NodeNames.Stop](token: IToken): StopNode { + return new StopNode(token); }, - [NodeNames.Setting] (token : IToken) : SettingNode { - return new SettingNode(token) + [NodeNames.Setting](token: IToken): SettingNode { + return new SettingNode(token); }, - [NodeNames.Rt] (token : IToken) : RtNode { - return new RtNode(token) + [NodeNames.Rt](token: IToken): RtNode { + return new RtNode(token); }, - [NodeNames.Lt] (token : IToken) : LtNode { - return new LtNode(token) + [NodeNames.Lt](token: IToken): LtNode { + return new LtNode(token); }, - [NodeNames.Nt] (token : IToken) : NtNode { - return new NtNode(token) + [NodeNames.Nt](token: IToken): NtNode { + return new NtNode(token); }, - [NodeNames.T] (token : IToken) : TNode { - return new TNode(token) + [NodeNames.T](token: IToken): TNode { + return new TNode(token); }, - [NodeNames.Flush] (token : IToken) : FlushNode { - return new FlushNode(token) + [NodeNames.Flush](token: IToken): FlushNode { + return new FlushNode(token); }, - [NodeNames.Escape] (token : IToken) : EscapeNode { - return new EscapeNode(token) + [NodeNames.Escape](token: IToken): EscapeNode { + return new EscapeNode(token); }, - [NodeNames.NoEscape] (token : IToken, parent : AbstractNode) : NoEscapeNode { + [NodeNames.NoEscape](token: IToken, parent: AbstractNode): NoEscapeNode { if (parent instanceof EscapeNode || parent instanceof NoEscapeNode) { - return new NoEscapeNode(token) + return new NoEscapeNode(token); } - throw new ParseError(`Error while creating node '${NodeNames.NoEscape}' inside '${parent.type}'`, token) + throw new ParseError( + `Error while creating node '${NodeNames.NoEscape}' inside '${parent.type}'`, + token, + ); }, - [NodeNames.Ftl] (token : IToken) : FtlNode { - return new FtlNode(token) + [NodeNames.Ftl](token: IToken): FtlNode { + return new FtlNode(token); }, - [NodeNames.AutoEsc] (token : IToken) : AutoEscNode { - return new AutoEscNode(token) + [NodeNames.AutoEsc](token: IToken): AutoEscNode { + return new AutoEscNode(token); }, - [NodeNames.NoAutoEsc] (token : IToken) : NoAutoEscNode { - return new NoAutoEscNode(token) + [NodeNames.NoAutoEsc](token: IToken): NoAutoEscNode { + return new NoAutoEscNode(token); }, - [NodeNames.OutputFormat] (token : IToken) : OutputFormatNode { - return new OutputFormatNode(token) + [NodeNames.OutputFormat](token: IToken): OutputFormatNode { + return new OutputFormatNode(token); }, -} +}; -export default Nodes +export default Nodes; diff --git a/src/utils/Params.ts b/src/utils/Params.ts index 8addd1f..4ecea93 100644 --- a/src/utils/Params.ts +++ b/src/utils/Params.ts @@ -1,17 +1,20 @@ -import ParseError from '../errors/ParseError' -import { AllParamTypes } from '../interface/Params' -import {IToken} from '../interface/Tokens' -import { ParamsParser } from '../ParamsParser' +import ParseError from '../errors/ParseError'; +import { AllParamTypes } from '../interface/Params'; +import { IToken } from '../interface/Tokens'; +import { ParamsParser } from '../ParamsParser'; -export function paramParser (token : IToken) : AllParamTypes | undefined { +export function paramParser(token: IToken): AllParamTypes | undefined { if (token.params) { - const parser = new ParamsParser(token.params) + const parser = new ParamsParser(token.params); try { - return parser.parseExpressions() + return parser.parseExpressions(); } catch (e) { - throw new ParseError(e.message, { start: token.start + e.start, end: token.start + e.end }) + throw new ParseError(e.message, { + start: token.start + e.start, + end: token.start + e.end, + }); } } else { - return undefined + return undefined; } } diff --git a/test/params.spec.ts b/test/params.spec.ts index e8f61f8..8a496f8 100644 --- a/test/params.spec.ts +++ b/test/params.spec.ts @@ -1,16 +1,16 @@ -import * as assert from 'assert' -import {EOperators} from '../src/enum/Operators' -import ParamNames from '../src/enum/ParamNames' -import { ParamsParser } from '../src/ParamsParser' +import * as assert from 'assert'; +import { EOperators } from '../src/enum/Operators'; +import ParamNames from '../src/enum/ParamNames'; +import { ParamsParser } from '../src/ParamsParser'; -function parse (template : string) { - const parser = new ParamsParser(template) - return parser.parseExpressions() +function parse(template: string) { + const parser = new ParamsParser(template); + return parser.parseExpressions(); } describe('params parser', () => { it('BinaryExpression', () => { - const result = parse('a + 1') + const result = parse('a + 1'); const expected = { type: ParamNames.BinaryExpression, operator: EOperators.PLUS, @@ -23,11 +23,11 @@ describe('params parser', () => { value: 1, raw: '1', }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('non-literal variable', () => { - const result = parse('foo.baz') + const result = parse('foo.baz'); const expected = { type: ParamNames.MemberExpression, computed: false, @@ -39,11 +39,11 @@ describe('params parser', () => { type: ParamNames.Identifier, name: 'baz', }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('non-literal array', () => { - const result = parse('foo[\'baz\']') + const result = parse("foo['baz']"); const expected = { type: ParamNames.MemberExpression, computed: true, @@ -54,13 +54,13 @@ describe('params parser', () => { property: { type: ParamNames.Literal, value: 'baz', - raw: '\'baz\'', + raw: "'baz'", }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('unary prefix', () => { - const result = parse('++foo') + const result = parse('++foo'); const expected = { type: ParamNames.UpdateExpression, operator: EOperators.PLUS_PLUS, @@ -69,11 +69,11 @@ describe('params parser', () => { type: ParamNames.Identifier, name: 'foo', }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('unary suffix', () => { - const result = parse('foo++') + const result = parse('foo++'); const expected = { type: ParamNames.UpdateExpression, operator: EOperators.PLUS_PLUS, @@ -82,11 +82,11 @@ describe('params parser', () => { type: ParamNames.Identifier, name: 'foo', }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('toUpperCase', () => { - const result = parse('foo?toUpperCase') + const result = parse('foo?toUpperCase'); const expected = { type: ParamNames.BuiltInExpression, left: { @@ -98,11 +98,11 @@ describe('params parser', () => { type: ParamNames.Identifier, name: 'toUpperCase', }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('array expression', () => { - const result = parse('["","a"]') + const result = parse('["","a"]'); const expected = { type: ParamNames.ArrayExpression, elements: [ @@ -117,20 +117,19 @@ describe('params parser', () => { raw: '"a"', }, ], - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('empty object expression', () => { - const result = parse('{}') + const result = parse('{}'); const expected = { type: ParamNames.MapExpression, - elements: [ - ], - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + elements: [], + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('object expression', () => { - const result = parse('{"x":1,"y":2}') + const result = parse('{"x":1,"y":2}'); const expected = { type: ParamNames.MapExpression, elements: [ @@ -159,11 +158,11 @@ describe('params parser', () => { }, }, ], - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); it('to string', () => { - const result = parse('foo?string("yes")') + const result = parse('foo?string("yes")'); const expected = { type: ParamNames.BuiltInExpression, left: { @@ -185,7 +184,7 @@ describe('params parser', () => { type: ParamNames.Identifier, }, }, - } - assert.deepStrictEqual(result, expected, 'value is not matching') - }) -}) + }; + assert.deepStrictEqual(result, expected, 'value is not matching'); + }); +}); diff --git a/test/parser-invalid.spec.ts b/test/parser-invalid.spec.ts index 3949055..1dccbcb 100644 --- a/test/parser-invalid.spec.ts +++ b/test/parser-invalid.spec.ts @@ -1,44 +1,59 @@ -import * as assert from 'assert' -import * as fs from 'fs' -import glob = require('glob') -import * as path from 'path' -import { Parser } from '../src' +import * as assert from 'assert'; +import * as fs from 'fs'; +import glob = require('glob'); +import * as path from 'path'; +import { Parser } from '../src'; -const parser = new Parser() +const parser = new Parser(); -const testsPath = path.join(__dirname, 'resource', 'invalid') +const testsPath = path.join(__dirname, 'resource', 'invalid'); -function cleanup (data : any) { - return JSON.parse(JSON.stringify(data)) +function cleanup(data: any) { + return JSON.parse(JSON.stringify(data)); } -glob('./**/*.ftl', { cwd: testsPath, nodir: true, absolute: true }, (e : Error | null, files : string[]) => { - if (e) { - throw e - } - for (const file of files) { - describe(file, () => { - const dirname = path.dirname(file) - const basename = path.basename(file).replace(path.extname(file), '') - - const template = fs.readFileSync(file, 'utf8') - const data = parser.parse(template) - - it('should have errors', () => { - if (!data.ast.errors) { - assert.fail('This test should have an error') - } - }) - - it('should have correct tokens', () => { - const code = JSON.parse(fs.readFileSync(path.join(dirname, `${basename}-tokens.json`), 'utf8')) - assert.deepStrictEqual(cleanup(data.tokens), code, 'tokens do not match') - }) - - it('should have correct ast', () => { - const code = JSON.parse(fs.readFileSync(path.join(dirname, `${basename}-ast.json`), 'utf8')) - assert.deepStrictEqual(cleanup(data.ast), code, 'ast do not match') - }) - }) - } -}) +glob( + './**/*.ftl', + { cwd: testsPath, nodir: true, absolute: true }, + (e: Error | null, files: string[]) => { + if (e) { + throw e; + } + for (const file of files) { + describe(file, () => { + const dirname = path.dirname(file); + const basename = path.basename(file).replace(path.extname(file), ''); + + const template = fs.readFileSync(file, 'utf8'); + const data = parser.parse(template); + + it('should have errors', () => { + if (!data.ast.errors) { + assert.fail('This test should have an error'); + } + }); + + it('should have correct tokens', () => { + const code = JSON.parse( + fs.readFileSync( + path.join(dirname, `${basename}-tokens.json`), + 'utf8', + ), + ); + assert.deepStrictEqual( + cleanup(data.tokens), + code, + 'tokens do not match', + ); + }); + + it('should have correct ast', () => { + const code = JSON.parse( + fs.readFileSync(path.join(dirname, `${basename}-ast.json`), 'utf8'), + ); + assert.deepStrictEqual(cleanup(data.ast), code, 'ast do not match'); + }); + }); + } + }, +); diff --git a/test/parser-valid.spec.ts b/test/parser-valid.spec.ts index 7a3688d..094d278 100644 --- a/test/parser-valid.spec.ts +++ b/test/parser-valid.spec.ts @@ -1,48 +1,69 @@ -import * as assert from 'assert' -import * as fs from 'fs' -import glob = require('glob') -import * as path from 'path' -import { Parser } from '../src' +import * as assert from 'assert'; +import * as fs from 'fs'; +import glob = require('glob'); +import * as path from 'path'; +import { Parser } from '../src'; -const parser = new Parser() +const parser = new Parser(); -const baseDir = path.join(__dirname, '..') +const baseDir = path.join(__dirname, '..'); -const testsPath = path.join(__dirname, 'resource', 'valid') +const testsPath = path.join(__dirname, 'resource', 'valid'); -function cleanup (data : any) { - return JSON.parse(JSON.stringify(data)) +function cleanup(data: any) { + return JSON.parse(JSON.stringify(data)); } -glob('./**/*.ftl', { cwd: testsPath, nodir: true, absolute: true }, (e : Error | null, files : string[]) => { - if (e) { - throw e - } - for (const file of files) { - describe(file, () => { - const dirname = path.dirname(file) - const basename = path.basename(file).replace(path.extname(file), '') - - const template = fs.readFileSync(file, 'utf8') - const data = parser.parse(template) - - it('should have no errors', () => { - if (data.ast.errors) { - for (const error of data.ast.errors) { - assert.fail(`${error.message}\n\tfile:.\\${path.relative(baseDir, file)}:${error.loc ? `${error.loc.start.column}:${error.loc.start.line}` : '0:0'}`) +glob( + './**/*.ftl', + { cwd: testsPath, nodir: true, absolute: true }, + (e: Error | null, files: string[]) => { + if (e) { + throw e; + } + for (const file of files) { + describe(file, () => { + const dirname = path.dirname(file); + const basename = path.basename(file).replace(path.extname(file), ''); + + const template = fs.readFileSync(file, 'utf8'); + const data = parser.parse(template); + + it('should have no errors', () => { + if (data.ast.errors) { + for (const error of data.ast.errors) { + assert.fail( + `${error.message}\n\tfile:.\\${path.relative(baseDir, file)}:${ + error.loc + ? `${error.loc.start.column}:${error.loc.start.line}` + : '0:0' + }`, + ); + } } - } - }) - - it('should have correct tokens', () => { - const code = JSON.parse(fs.readFileSync(path.join(dirname, `${basename}-tokens.json`), 'utf8')) - assert.deepStrictEqual(cleanup(data.tokens), code, 'tokens do not match') - }) - - it('should have correct ast', () => { - const code = JSON.parse(fs.readFileSync(path.join(dirname, `${basename}-ast.json`), 'utf8')) - assert.deepStrictEqual(cleanup(data.ast), code, 'ast do not match') - }) - }) - } -}) + }); + + it('should have correct tokens', () => { + const code = JSON.parse( + fs.readFileSync( + path.join(dirname, `${basename}-tokens.json`), + 'utf8', + ), + ); + assert.deepStrictEqual( + cleanup(data.tokens), + code, + 'tokens do not match', + ); + }); + + it('should have correct ast', () => { + const code = JSON.parse( + fs.readFileSync(path.join(dirname, `${basename}-ast.json`), 'utf8'), + ); + assert.deepStrictEqual(cleanup(data.ast), code, 'ast do not match'); + }); + }); + } + }, +); diff --git a/test/testers/TokenizerTester.ts b/test/testers/TokenizerTester.ts index a5bf901..f862653 100644 --- a/test/testers/TokenizerTester.ts +++ b/test/testers/TokenizerTester.ts @@ -1,57 +1,74 @@ -import * as assert from 'assert' -import { IToken } from '../../src/interface/Tokens' -import { ENodeType } from '../../src/Symbols' +import * as assert from 'assert'; +import { IToken } from '../../src/interface/Tokens'; +import { ENodeType } from '../../src/Symbols'; export default class Tester { - public static instance (tokens : IToken[]) { - return new Tester(tokens) + public static instance(tokens: IToken[]) { + return new Tester(tokens); } - private readonly tokens : IToken[] - private index : number = 0 + private readonly tokens: IToken[]; + private index: number = 0; - private get token () { - return this.tokens[this.index] + private get token() { + return this.tokens[this.index]; } - constructor (tokens : IToken[]) { - this.tokens = tokens + constructor(tokens: IToken[]) { + this.tokens = tokens; } - public hasCount (value : number) { - assert.strictEqual(this.tokens.length, value, 'Invalid amount of elements') - return this + public hasCount(value: number) { + assert.strictEqual(this.tokens.length, value, 'Invalid amount of elements'); + return this; } - public nextToken () { - ++this.index - return this + public nextToken() { + ++this.index; + return this; } - public get (index : number) { - this.index = index - return this + public get(index: number) { + this.index = index; + return this; } - public isType (tokenType : ENodeType) { - assert.strictEqual(this.token.type, tokenType, `[${this.index}] Is not a ${tokenType}`) - return this + public isType(tokenType: ENodeType) { + assert.strictEqual( + this.token.type, + tokenType, + `[${this.index}] Is not a ${tokenType}`, + ); + return this; } - public hasNoParams () { + public hasNoParams() { if (this.token.params) { - assert.strictEqual(this.token.params.length, 0, `[${this.index}] Expected to have no params`) + assert.strictEqual( + this.token.params.length, + 0, + `[${this.index}] Expected to have no params`, + ); } - return this + return this; } - public hasParams (params? : string) { - assert.strictEqual(this.token.params, params, `[${this.index}] Found ${this.token.params || 'no params'} but expected ${params || 'no params'}`) - return this + public hasParams(params?: string) { + assert.strictEqual( + this.token.params, + params, + `[${this.index}] Found ${this.token.params || + 'no params'} but expected ${params || 'no params'}`, + ); + return this; } - public hasText (text : string) { - assert.strictEqual(this.token.text, text, `[${this.index}] text do not match`) - return this + public hasText(text: string) { + assert.strictEqual( + this.token.text, + text, + `[${this.index}] text do not match`, + ); + return this; } } diff --git a/test/tokenizer-invalid.spec.ts b/test/tokenizer-invalid.spec.ts index 14d439f..a5e5038 100644 --- a/test/tokenizer-invalid.spec.ts +++ b/test/tokenizer-invalid.spec.ts @@ -1,118 +1,158 @@ -import * as assert from 'assert' +import * as assert from 'assert'; -import { Tokenizer } from '../src' -import { IToken } from '../src/interface/Tokens' +import { Tokenizer } from '../src'; +import { IToken } from '../src/interface/Tokens'; -const tokenizer = new Tokenizer() +const tokenizer = new Tokenizer(); -function parse (text : string) : IToken[] { - return tokenizer.parse(text) +function parse(text: string): IToken[] { + return tokenizer.parse(text); } describe('errors', () => { it('invalid amount of brackets', () => { try { - parse('<#foo foo)>') - assert.fail('should fail') + parse('<#foo foo)>'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'To many close tags )', 'error message is invalid') + assert.strictEqual( + e.message, + 'To many close tags )', + 'error message is invalid', + ); } try { - parse('<#foo foo(>') - assert.fail('should fail') + parse('<#foo foo(>'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Missing ) close char', 'error message is invalid') + assert.strictEqual( + e.message, + 'Missing ) close char', + 'error message is invalid', + ); } - }) + }); it('unclosed comment', () => { try { - parse('<#-- foo bar') - assert.fail('should fail') + parse('<#-- foo bar'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Unclosed comment', 'error message is invalid') + assert.strictEqual( + e.message, + 'Unclosed comment', + 'error message is invalid', + ); } - }) + }); it('missing close tag in directive', () => { try { - parse('<#') - assert.fail('should fail') + parse('<#'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'OpenDirective name cannot be empty', 'error message is invalid') - assert.strictEqual(e.start, 2, 'start pos is invalid') + assert.strictEqual( + e.message, + 'OpenDirective name cannot be empty', + 'error message is invalid', + ); + assert.strictEqual(e.start, 2, 'start pos is invalid'); } - }) + }); it('missing close tag in macro', () => { try { - parse('<@') - assert.fail('should fail') + parse('<@'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'OpenMacro name cannot be empty', 'error message is invalid') - assert.strictEqual(e.start, 2, 'start pos is invalid') + assert.strictEqual( + e.message, + 'OpenMacro name cannot be empty', + 'error message is invalid', + ); + assert.strictEqual(e.start, 2, 'start pos is invalid'); } - }) + }); it('invalid character in macro name', () => { try { - parse('<@?') - assert.fail('should fail') + parse('<@?'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Invalid `?`', 'error message is invalid') - assert.strictEqual(e.start, 2, 'start pos is invalid') + assert.strictEqual(e.message, 'Invalid `?`', 'error message is invalid'); + assert.strictEqual(e.start, 2, 'start pos is invalid'); } - }) + }); it('invalid character in directive name', () => { try { - parse('<@&') - assert.fail('should fail') + parse('<@&'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Invalid `&`', 'error message is invalid') - assert.strictEqual(e.start, 2, 'start pos is invalid') + assert.strictEqual(e.message, 'Invalid `&`', 'error message is invalid'); + assert.strictEqual(e.start, 2, 'start pos is invalid'); } - }) -}) + }); +}); describe('error_expresion', () => { it('to many close tags ]', () => { try { - parse('<@foo a["foo"]]') - assert.fail('should fail') + parse('<@foo a["foo"]]'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'To many close tags ]', 'error message is invalid') + assert.strictEqual( + e.message, + 'To many close tags ]', + 'error message is invalid', + ); } - }) + }); it('to many close tags )', () => { try { - parse('<@foo a("foo"))') - assert.fail('should fail') + parse('<@foo a("foo"))'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'To many close tags )', 'error message is invalid') + assert.strictEqual( + e.message, + 'To many close tags )', + 'error message is invalid', + ); } - }) -}) + }); +}); describe('unclosed', () => { it('directive', () => { try { - parse('<#foo') - assert.fail('should fail') + parse('<#foo'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Unclosed directive or macro', 'error message is invalid') + assert.strictEqual( + e.message, + 'Unclosed directive or macro', + 'error message is invalid', + ); } - }) + }); it('macro', () => { try { - parse('<@foo') - assert.fail('should fail') + parse('<@foo'); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Unclosed directive or macro', 'error message is invalid') + assert.strictEqual( + e.message, + 'Unclosed directive or macro', + 'error message is invalid', + ); } - }) + }); it('interpolation', () => { try { - parse(`\${ foo`) - assert.fail('should fail') + parse(`\${ foo`); + assert.fail('should fail'); } catch (e) { - assert.strictEqual(e.message, 'Unclosed directive or macro', 'error message is invalid') + assert.strictEqual( + e.message, + 'Unclosed directive or macro', + 'error message is invalid', + ); } - }) -}) + }); +}); diff --git a/test/tokenizer.spec.ts b/test/tokenizer.spec.ts index 20e6dc9..7197e06 100644 --- a/test/tokenizer.spec.ts +++ b/test/tokenizer.spec.ts @@ -1,213 +1,277 @@ -import { Tokenizer } from '../src' -import { IToken } from '../src/interface/Tokens' -import { ENodeType } from '../src/Symbols' -import Tester from './testers/TokenizerTester' +import { Tokenizer } from '../src'; +import { IToken } from '../src/interface/Tokens'; +import { ENodeType } from '../src/Symbols'; +import Tester from './testers/TokenizerTester'; -const tokenizer = new Tokenizer() +const tokenizer = new Tokenizer(); -function parse (text : string) : IToken[] { - return tokenizer.parse(text) +function parse(text: string): IToken[] { + return tokenizer.parse(text); } describe('parsing directives', () => { it('no arguments', () => { - const tokens = parse('<#foo>') + const tokens = parse('<#foo>'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.OpenDirective).hasNoParams() - }) + .isType(ENodeType.OpenDirective) + .hasNoParams(); + }); it('no arguments, self closing', () => { - const tokens = parse('<#foo/>') + const tokens = parse('<#foo/>'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.OpenDirective).hasNoParams() - }) + .isType(ENodeType.OpenDirective) + .hasNoParams(); + }); it('many, no arguments', () => { - const tokens = parse('<#foo><#foo>') + const tokens = parse('<#foo><#foo>'); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.OpenDirective).hasNoParams() + .isType(ENodeType.OpenDirective) + .hasNoParams() .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams() - }) + .isType(ENodeType.OpenDirective) + .hasNoParams(); + }); it('many, no arguments, with text', () => { - const tokens = parse('foo<#foo>foo<#foo>foo') + const tokens = parse('foo<#foo>foo<#foo>foo'); Tester.instance(tokens) .hasCount(5) - .isType(ENodeType.Text).hasNoParams().hasText('foo') + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo') .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams() + .isType(ENodeType.OpenDirective) + .hasNoParams() .nextToken() - .isType(ENodeType.Text).hasNoParams().hasText('foo') + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo') .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams() + .isType(ENodeType.OpenDirective) + .hasNoParams() .nextToken() - .isType(ENodeType.Text).hasNoParams().hasText('foo') - }) + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo'); + }); it('no arguments, with close tag', () => { - const tokens = parse('<#foo>') + const tokens = parse('<#foo>'); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.OpenDirective).hasNoParams() + .isType(ENodeType.OpenDirective) + .hasNoParams() .nextToken() - .isType(ENodeType.CloseDirective).hasNoParams() - }) + .isType(ENodeType.CloseDirective) + .hasNoParams(); + }); it('with arguments', () => { - const tokens = parse('<#foo bar>') + const tokens = parse('<#foo bar>'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.OpenDirective).hasParams('bar') - }) + .isType(ENodeType.OpenDirective) + .hasParams('bar'); + }); it('many, with arguments', () => { - const tokens = parse('<#foo bar><#foo bar test><#foo bar less>') + const tokens = parse('<#foo bar><#foo bar test><#foo bar less>'); Tester.instance(tokens) .hasCount(3) - .isType(ENodeType.OpenDirective).hasParams('bar') + .isType(ENodeType.OpenDirective) + .hasParams('bar') .nextToken() - .isType(ENodeType.OpenDirective).hasParams('bar test') + .isType(ENodeType.OpenDirective) + .hasParams('bar test') .nextToken() - .isType(ENodeType.OpenDirective).hasParams('bar less') - }) -}) + .isType(ENodeType.OpenDirective) + .hasParams('bar less'); + }); +}); describe('parsing macros', () => { it('no arguments', () => { - const tokens = parse('<@foo>') + const tokens = parse('<@foo>'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.OpenMacro).hasNoParams() - }) + .isType(ENodeType.OpenMacro) + .hasNoParams(); + }); it('no arguments, self closing', () => { - const tokens = parse('<@foo/>') + const tokens = parse('<@foo/>'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.OpenMacro).hasNoParams() - }) + .isType(ENodeType.OpenMacro) + .hasNoParams(); + }); it('many, no arguments', () => { - const tokens = parse('<@foo><@foo>') + const tokens = parse('<@foo><@foo>'); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.OpenMacro).hasNoParams() + .isType(ENodeType.OpenMacro) + .hasNoParams() .nextToken() - .isType(ENodeType.OpenMacro).hasNoParams() - }) + .isType(ENodeType.OpenMacro) + .hasNoParams(); + }); it('many, no arguments, with text', () => { - const tokens = parse('foo<@foo>foo<@foo>foo') + const tokens = parse('foo<@foo>foo<@foo>foo'); Tester.instance(tokens) .hasCount(5) - .isType(ENodeType.Text).hasNoParams().hasText('foo') + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo') .nextToken() - .isType(ENodeType.OpenMacro).hasNoParams() + .isType(ENodeType.OpenMacro) + .hasNoParams() .nextToken() - .isType(ENodeType.Text).hasNoParams().hasText('foo') + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo') .nextToken() - .isType(ENodeType.OpenMacro).hasNoParams() + .isType(ENodeType.OpenMacro) + .hasNoParams() .nextToken() - .isType(ENodeType.Text).hasNoParams().hasText('foo') - }) + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo'); + }); it('no arguments, with close tag', () => { - const tokens = parse('<@foo>') + const tokens = parse('<@foo>'); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.OpenMacro).hasNoParams() + .isType(ENodeType.OpenMacro) + .hasNoParams() .nextToken() - .isType(ENodeType.CloseMacro).hasNoParams() - }) + .isType(ENodeType.CloseMacro) + .hasNoParams(); + }); it('with arguments', () => { - const tokens = parse('<@foo bar>') + const tokens = parse('<@foo bar>'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.OpenMacro).hasParams('bar') - }) + .isType(ENodeType.OpenMacro) + .hasParams('bar'); + }); it('many, with arguments', () => { - const tokens = parse('<@foo bar><@foo bar test><@foo bar less>') + const tokens = parse('<@foo bar><@foo bar test><@foo bar less>'); Tester.instance(tokens) .hasCount(3) - .isType(ENodeType.OpenMacro).hasParams('bar') + .isType(ENodeType.OpenMacro) + .hasParams('bar') .nextToken() - .isType(ENodeType.OpenMacro).hasParams('bar test') + .isType(ENodeType.OpenMacro) + .hasParams('bar test') .nextToken() - .isType(ENodeType.OpenMacro).hasParams('bar less') - }) -}) + .isType(ENodeType.OpenMacro) + .hasParams('bar less'); + }); +}); describe('parsing comments', () => { it('coment with text', () => { - const tokens = parse('<#-- <@d> -->') + const tokens = parse('<#-- <@d> -->'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.Comment).hasNoParams().hasText(' <@d> ') - }) + .isType(ENodeType.Comment) + .hasNoParams() + .hasText(' <@d> '); + }); it('coment in directive', () => { - const tokens = parse('<#foo><#-- foo -->') + const tokens = parse('<#foo><#-- foo -->'); Tester.instance(tokens) .hasCount(3) - .isType(ENodeType.OpenDirective).hasNoParams() + .isType(ENodeType.OpenDirective) + .hasNoParams() .nextToken() - .isType(ENodeType.Comment).hasNoParams().hasText(' foo ') + .isType(ENodeType.Comment) + .hasNoParams() + .hasText(' foo ') .nextToken() - .isType(ENodeType.CloseDirective).hasNoParams() - }) -}) + .isType(ENodeType.CloseDirective) + .hasNoParams(); + }); +}); describe('parsing text', () => { it('empty text', () => { - const tokens = parse('') - Tester.instance(tokens) - .hasCount(0) - }) + const tokens = parse(''); + Tester.instance(tokens).hasCount(0); + }); it('raw text', () => { - const tokens = parse('') + const tokens = parse(''); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.Text).hasNoParams().hasText('') - }) + .isType(ENodeType.Text) + .hasNoParams() + .hasText(''); + }); it('text after directive', () => { - const tokens = parse('<#foo>foo') + const tokens = parse('<#foo>foo'); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.OpenDirective).hasNoParams() + .isType(ENodeType.OpenDirective) + .hasNoParams() .nextToken() - .isType(ENodeType.Text).hasNoParams().hasText('foo') - }) + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo'); + }); it('text before directive', () => { - const tokens = parse('foo<#foo>') + const tokens = parse('foo<#foo>'); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.Text).hasNoParams().hasText('foo') + .isType(ENodeType.Text) + .hasNoParams() + .hasText('foo') .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams() - }) -}) + .isType(ENodeType.OpenDirective) + .hasNoParams(); + }); +}); describe('html', () => { it('simple', () => { - const tokens = parse('

This is include-subdir.ftl

') + const tokens = parse('

This is include-subdir.ftl

'); Tester.instance(tokens) .hasCount(1) - .isType(ENodeType.Text).hasNoParams().hasText('

This is include-subdir.ftl

') - }) + .isType(ENodeType.Text) + .hasNoParams() + .hasText('

This is include-subdir.ftl

'); + }); it('advance', () => { - const tokens = parse('

This is include-subdir.ftl

<#include "include-subdir2.ftl">') + const tokens = parse( + '

This is include-subdir.ftl

<#include "include-subdir2.ftl">', + ); Tester.instance(tokens) .hasCount(2) - .isType(ENodeType.Text).hasNoParams().hasText('

This is include-subdir.ftl

') + .isType(ENodeType.Text) + .hasNoParams() + .hasText('

This is include-subdir.ftl

') .nextToken() - .isType(ENodeType.OpenDirective).hasParams('"include-subdir2.ftl"') - }) -}) + .isType(ENodeType.OpenDirective) + .hasParams('"include-subdir2.ftl"'); + }); +}); describe('names', () => { it('directive', () => { - const tokens = parse('<#foo/><#Foo/><#FoO/><#Fo_O/>') + const tokens = parse('<#foo/><#Foo/><#FoO/><#Fo_O/>'); Tester.instance(tokens) .hasCount(4) - .isType(ENodeType.OpenDirective).hasNoParams().hasText('foo') + .isType(ENodeType.OpenDirective) + .hasNoParams() + .hasText('foo') .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams().hasText('Foo') + .isType(ENodeType.OpenDirective) + .hasNoParams() + .hasText('Foo') .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams().hasText('FoO') + .isType(ENodeType.OpenDirective) + .hasNoParams() + .hasText('FoO') .nextToken() - .isType(ENodeType.OpenDirective).hasNoParams().hasText('Fo_O') - }) -}) + .isType(ENodeType.OpenDirective) + .hasNoParams() + .hasText('Fo_O'); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index b92d9ee..4e125af 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,9 +12,7 @@ "declaration": true, "diagnostics": true, "forceConsistentCasingInFileNames": false, - "lib": [ - "esnext" - ], + "lib": ["esnext"], "module": "commonjs", "moduleResolution": "node", "newLine": "LF", @@ -25,7 +23,6 @@ "noImplicitThis": true, "noUnusedLocals": true, "noUnusedParameters": true, - "declarationDir": "./types/", "outDir": "./dist/", "sourceMap": true, "sourceRoot": "./src/", @@ -35,7 +32,5 @@ "strictNullChecks": true, "target": "es2015" }, - "include": [ - "src/**/*.ts" - ] + "include": ["src/**/*.ts"] } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index bf1f1c4..0000000 --- a/tslint.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "extends": "tslint:latest", - "rules": { - "no-implicit-dependencies": [true, "dev"], - "semicolon": [true, "never"], - "typedef-whitespace": [true, { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - }], - "no-debugger": { - "severity": "error" - }, - "no-object-literal-type-assertion": false, - "space-before-function-paren": true, - "quotemark": [true, "single"], - "no-bitwise": false, - "max-line-length": [false], - "object-literal-sort-keys": false, - "ban-types": { - "options": [ - [ - "Object", - "Avoid using the `Object` type. Did you mean `object`?" - ], - [ - "Function", - "Avoid using the `Function` type. Prefer a specific function type, like `() => void`." - ], - [ - "Boolean", - "Avoid using the `Boolean` type. Did you mean `boolean`?" - ], - [ - "Number", - "Avoid using the `Number` type. Did you mean `number`?" - ], - [ - "String", - "Avoid using the `String` type. Did you mean `string`?" - ], - [ - "Symbol", - "Avoid using the `Symbol` type. Did you mean `symbol`?" - ] - ], - "severity": "error" - } - }, - "linterOptions": { - "exclude": [ - "node_modules/**", - "dist/**", - "coverage/**", - "types/**/*" - ] - } -} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b9bc503 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2125 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.7.5": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.7.4", "@babel/generator@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== + dependencies: + "@babel/types" "^7.7.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.7.4", "@babel/parser@^7.7.5", "@babel/parser@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== + +"@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" + integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/mocha@^5.2.7": + version "5.2.7" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" + integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== + +"@types/node@*", "@types/node@^12.12.21": + version "12.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.21.tgz#aa44a6363291c7037111c47e4661ad210aded23f" + integrity sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA== + +"@typescript-eslint/eslint-plugin@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.12.0.tgz#0da7cbca7b24f4c6919e9eb31c704bfb126f90ad" + integrity sha512-1t4r9rpLuEwl3hgt90jY18wJHSyb0E3orVL3DaqwmpiSDHmHiSspVsvsFF78BJ/3NNG3qmeso836jpuBWYziAA== + dependencies: + "@typescript-eslint/experimental-utils" "2.12.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.12.0.tgz#e0a76ffb6293e058748408a191921e453c31d40d" + integrity sha512-jv4gYpw5N5BrWF3ntROvCuLe1IjRenLy5+U57J24NbPGwZFAjhnM45qpq0nDH1y/AZMb3Br25YiNVwyPbz6RkA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.12.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.12.0.tgz#393f1604943a4ca570bb1a45bc8834e9b9158884" + integrity sha512-lPdkwpdzxEfjI8TyTzZqPatkrswLSVu4bqUgnB03fHSOwpC7KSerPgJRgIAf11UGNf7HKjJV6oaPZI4AghLU6g== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.12.0" + "@typescript-eslint/typescript-estree" "2.12.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.12.0.tgz#bd9e547ccffd17dfab0c3ab0947c80c8e2eb914c" + integrity sha512-rGehVfjHEn8Frh9UW02ZZIfJs6SIIxIu/K1bbci8rFfDE/1lQ8krIJy5OXOV3DVnNdDPtoiPOdEANkLMrwXbiQ== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" + integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +arg@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.2.tgz#e70c90579e02c63d80e3ad4e31d8bfdb8bd50064" + integrity sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argv@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" + integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +codecov@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.6.1.tgz#f39fc49413445555f81f8e3ca5730992843b4517" + integrity sha512-IUJB6WG47nWK7o50etF8jBadxdMw7DmoQg05yIljstXFBGB6clOZsIj6iD4P82T2YaIU3qq+FFu8K9pxgkCJDQ== + dependencies: + argv "^0.0.2" + ignore-walk "^3.0.1" + js-yaml "^3.13.1" + teeny-request "^3.11.3" + urlgrey "^0.4.4" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +debug@3.2.6, debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + dependencies: + strip-bom "^4.0.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + 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" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +find-cache-dir@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" + integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.0" + pkg-dir "^4.1.0" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +fromentries@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" + integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + 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" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + +graceful-fs@^4.1.15: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hasha@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.1.0.tgz#dd05ccdfcfe7dab626247ce2a58efe461922f4ca" + integrity sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-instrument@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz#53321a7970f076262fd3292c8f9b2e4ac544aae1" + integrity sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ== + dependencies: + "@babel/core" "^7.7.5" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" + integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.0" + istanbul-lib-coverage "^3.0.0-alpha.1" + make-dir "^3.0.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^3.3.3" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70" + integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +mkdirp@0.5.1, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha-junit-reporter@^1.23.1: + version "1.23.1" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.1.tgz#ba11519c0b967f404e4123dd69bc4ba022ab0f12" + integrity sha512-qeDvKlZyAH2YJE1vhryvjUQ06t2hcnwwu4k5Ddwn0GQINhgEYFhlGM0DwYCVUHq5cuo32qAW6HDsTHt7zz99Ng== + dependencies: + debug "^2.2.0" + md5 "^2.1.0" + mkdirp "~0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.0" + +mocha@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" + integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.1" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-preload@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + +nyc@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.0.tgz#eb32db2c0f29242c2414fe46357f230121cfc162" + integrity sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.0" + js-yaml "^3.13.1" + make-dir "^3.0.0" + node-preload "^0.2.0" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + uuid "^3.3.3" + yargs "^15.0.2" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + dependencies: + es6-error "^4.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.3.2: + version "1.14.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.4.1, semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +source-map-support@^0.5.16, source-map-support@^0.5.6: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== + dependencies: + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +teeny-request@^3.11.3: + version "3.11.3" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-3.11.3.tgz#335c629f7645e5d6599362df2f3230c4cbc23a55" + integrity sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw== + dependencies: + https-proxy-agent "^2.2.1" + node-fetch "^2.2.0" + uuid "^3.3.2" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +ts-node@^8.5.4: + version "8.5.4" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.5.4.tgz#a152add11fa19c221d0b48962c210cf467262ab2" + integrity sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.8.0, type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^3.7.4: + version "3.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" + integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urlgrey@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" + integrity sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8= + +uuid@^3.3.2, uuid@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b" + integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xml@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@13.1.1, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" + integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.0, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yargs@^15.0.2: + version "15.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3" + integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^16.1.0" + +yn@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==