From 677e8511e60a7cc789dd33a4f295a46beeaf1137 Mon Sep 17 00:00:00 2001 From: harttle Date: Sun, 17 Feb 2019 04:47:08 +0800 Subject: [PATCH] chore(TypeScript): refactor objects into classes fix: `Nil`(null, undefined) now renders as empty string change: `parser.parseValue()` renamed to `parser.parseOutput` change: registered tags/filters become static and shared across different liquid instances --- .eslintrc.json | 4 + README.md | 4 +- package-lock.json | 3770 +++++++---------- package.json | 11 +- rollup.config.js | 45 +- src/builtin/filters/array.js | 25 + src/builtin/filters/date.ts | 18 + src/builtin/filters/html.ts | 29 + src/builtin/filters/index.ts | 12 + src/builtin/filters/math.ts | 26 + src/builtin/filters/object.ts | 5 + src/builtin/filters/string.ts | 32 + src/builtin/filters/url.ts | 4 + src/builtin/tags/assign.ts | 20 + src/builtin/tags/block.ts | 29 + src/builtin/tags/break.ts | 7 + src/builtin/tags/capture.ts | 29 + src/builtin/tags/case.ts | 38 + src/builtin/tags/comment.ts | 13 + src/builtin/tags/continue.ts | 7 + src/builtin/tags/cycle.ts | 41 + src/builtin/tags/decrement.ts | 27 + src/builtin/tags/for.ts | 93 + src/builtin/tags/if.ts | 39 + src/builtin/tags/include.ts | 56 + src/builtin/tags/increment.ts | 29 + src/builtin/tags/index.ts | 21 + src/builtin/tags/layout.ts | 41 + src/builtin/tags/raw.ts | 19 + src/builtin/tags/tablerow.ts | 68 + src/builtin/tags/unless.ts | 29 + src/filter.js | 68 - src/filters.js | 139 - src/liquid-options.ts | 38 + src/{index.ts => liquid.ts} | 91 +- src/operators.js | 17 - src/parser.ts | 106 - src/parser/delimited-token.ts | 12 + src/parser/html-token.ts | 9 + src/{lexical.js => parser/lexical.ts} | 2 +- src/parser/output-token.ts | 8 + src/parser/parse-stream.ts | 47 + src/parser/parser.ts | 43 + src/parser/tag-token.ts | 18 + .../template-browser.ts} | 6 +- src/{ => parser}/template.ts | 4 +- src/parser/token.ts | 14 + src/parser/tokenizer.ts | 53 + .../whitespace-ctrl.ts} | 9 +- src/render.js | 62 - src/render/render.ts | 24 + src/{syntax.js => render/syntax.ts} | 21 +- src/scope/block-mode.ts | 8 + src/{ => scope}/scope.ts | 40 +- src/scope/scopes.ts | 4 + src/tag.js | 63 - src/tags/assign.js | 23 - src/tags/capture.js | 32 - src/tags/case.js | 39 - src/tags/comment.js | 15 - src/tags/cycle.js | 43 - src/tags/decrement.js | 32 - src/tags/for.js | 93 - src/tags/if.js | 40 - src/tags/include.js | 57 - src/tags/increment.js | 34 - src/tags/index.js | 31 - src/tags/layout.js | 75 - src/tags/raw.js | 21 - src/tags/tablerow.js | 70 - src/tags/unless.js | 29 - src/template/filter.ts | 51 + src/template/html.ts | 15 + src/template/itemplate.ts | 7 + src/template/output.ts | 17 + src/template/tag/hash.ts | 20 + src/template/tag/tag.ts | 43 + src/template/tag/tagimpl.ts | 8 + src/template/template.ts | 8 + src/template/value.ts | 30 + src/tokenizer.js | 90 - src/types.ts | 2 + src/util/assert.ts | 2 +- src/util/error.ts | 14 +- src/util/{promise.js => promise.ts} | 8 +- src/util/{strftime.js => strftime.ts} | 48 +- src/util/underscore.ts | 11 +- test/.eslintrc.json | 11 - test/e2e/eval-value.ts | 14 + test/e2e/{express.js => express.ts} | 16 +- ...arse-and-render.js => parse-and-render.ts} | 6 +- test/e2e/{render-file.js => render-file.ts} | 0 ...{whitespace-ctrl.js => whitespace-ctrl.ts} | 8 +- test/e2e/{xhr.js => xhr.ts} | 36 +- test/mocha.opts | 2 - test/unit/filter.ts | 55 +- test/unit/{filters.js => filters.ts} | 11 +- test/unit/{lexical.js => lexical.ts} | 6 +- test/unit/{index.js => liquid.ts} | 6 +- test/unit/options/{cache.js => cache.ts} | 4 +- test/unit/options/{strict.js => strict.ts} | 4 +- .../unit/options/{trimming.js => trimming.ts} | 4 +- test/unit/output.ts | 56 + test/unit/parser.js | 49 - test/unit/render.js | 120 - test/unit/render.ts | 38 + test/unit/{scope.js => scope.ts} | 2 +- test/unit/{syntax.js => syntax.ts} | 12 +- test/unit/{tag.js => tag.ts} | 32 +- test/unit/tags/{assign.js => assign.ts} | 2 +- test/unit/tags/{capture.js => capture.ts} | 2 +- test/unit/tags/{case.js => case.ts} | 2 +- test/unit/tags/{comment.js => comment.ts} | 2 +- test/unit/tags/{cycle.js => cycle.ts} | 2 +- test/unit/tags/{decrement.js => decrement.ts} | 2 +- test/unit/tags/{for.js => for.ts} | 2 +- test/unit/tags/{if.js => if.ts} | 2 +- test/unit/tags/{include.js => include.ts} | 2 +- test/unit/tags/{increment.js => increment.ts} | 2 +- test/unit/tags/{layout.js => layout.ts} | 2 +- test/unit/tags/{raw.js => raw.ts} | 2 +- test/unit/tags/{tablerow.js => tablerow.ts} | 2 +- test/unit/tags/{unless.js => unless.ts} | 5 +- ...emplate-browser.js => template-browser.ts} | 10 +- test/unit/{template.js => template.ts} | 2 +- test/unit/{tokenizer.js => tokenizer.ts} | 31 +- test/unit/util/{assert.js => assert.ts} | 0 test/unit/util/{error.js => error.ts} | 2 +- test/unit/util/{promise.js => promise.ts} | 2 +- test/unit/util/{strftime.js => strftime.ts} | 4 +- .../util/{underscore.js => underscore.ts} | 12 +- test/unit/value.ts | 72 + test/unit/{xhr.js => xhr.ts} | 10 +- tsconfig.json | 12 +- 134 files changed, 3327 insertions(+), 3858 deletions(-) create mode 100644 src/builtin/filters/array.js create mode 100644 src/builtin/filters/date.ts create mode 100644 src/builtin/filters/html.ts create mode 100644 src/builtin/filters/index.ts create mode 100644 src/builtin/filters/math.ts create mode 100644 src/builtin/filters/object.ts create mode 100644 src/builtin/filters/string.ts create mode 100644 src/builtin/filters/url.ts create mode 100644 src/builtin/tags/assign.ts create mode 100644 src/builtin/tags/block.ts create mode 100644 src/builtin/tags/break.ts create mode 100644 src/builtin/tags/capture.ts create mode 100644 src/builtin/tags/case.ts create mode 100644 src/builtin/tags/comment.ts create mode 100644 src/builtin/tags/continue.ts create mode 100644 src/builtin/tags/cycle.ts create mode 100644 src/builtin/tags/decrement.ts create mode 100644 src/builtin/tags/for.ts create mode 100644 src/builtin/tags/if.ts create mode 100644 src/builtin/tags/include.ts create mode 100644 src/builtin/tags/increment.ts create mode 100644 src/builtin/tags/index.ts create mode 100644 src/builtin/tags/layout.ts create mode 100644 src/builtin/tags/raw.ts create mode 100644 src/builtin/tags/tablerow.ts create mode 100644 src/builtin/tags/unless.ts delete mode 100644 src/filter.js delete mode 100644 src/filters.js create mode 100644 src/liquid-options.ts rename src/{index.ts => liquid.ts} (51%) delete mode 100644 src/operators.js delete mode 100644 src/parser.ts create mode 100644 src/parser/delimited-token.ts create mode 100644 src/parser/html-token.ts rename src/{lexical.js => parser/lexical.ts} (99%) create mode 100644 src/parser/output-token.ts create mode 100644 src/parser/parse-stream.ts create mode 100644 src/parser/parser.ts create mode 100644 src/parser/tag-token.ts rename src/{template-browser.js => parser/template-browser.ts} (88%) rename src/{ => parser}/template.ts (90%) create mode 100644 src/parser/token.ts create mode 100644 src/parser/tokenizer.ts rename src/{whitespace-ctrl.js => parser/whitespace-ctrl.ts} (78%) delete mode 100644 src/render.js create mode 100644 src/render/render.ts rename src/{syntax.js => render/syntax.ts} (68%) create mode 100644 src/scope/block-mode.ts rename src/{ => scope}/scope.ts (86%) create mode 100644 src/scope/scopes.ts delete mode 100644 src/tag.js delete mode 100644 src/tags/assign.js delete mode 100644 src/tags/capture.js delete mode 100644 src/tags/case.js delete mode 100644 src/tags/comment.js delete mode 100644 src/tags/cycle.js delete mode 100644 src/tags/decrement.js delete mode 100644 src/tags/for.js delete mode 100644 src/tags/if.js delete mode 100644 src/tags/include.js delete mode 100644 src/tags/increment.js delete mode 100644 src/tags/index.js delete mode 100644 src/tags/layout.js delete mode 100644 src/tags/raw.js delete mode 100644 src/tags/tablerow.js delete mode 100644 src/tags/unless.js create mode 100644 src/template/filter.ts create mode 100644 src/template/html.ts create mode 100644 src/template/itemplate.ts create mode 100644 src/template/output.ts create mode 100644 src/template/tag/hash.ts create mode 100644 src/template/tag/tag.ts create mode 100644 src/template/tag/tagimpl.ts create mode 100644 src/template/template.ts create mode 100644 src/template/value.ts delete mode 100644 src/tokenizer.js create mode 100644 src/types.ts rename src/util/{promise.js => promise.ts} (79%) rename src/util/{strftime.js => strftime.ts} (80%) delete mode 100644 test/.eslintrc.json create mode 100644 test/e2e/eval-value.ts rename test/e2e/{express.js => express.ts} (87%) rename test/e2e/{parse-and-render.js => parse-and-render.ts} (93%) rename test/e2e/{render-file.js => render-file.ts} (100%) rename test/e2e/{whitespace-ctrl.js => whitespace-ctrl.ts} (98%) rename test/e2e/{xhr.js => xhr.ts} (89%) delete mode 100644 test/mocha.opts rename test/unit/{filters.js => filters.ts} (98%) rename test/unit/{lexical.js => lexical.ts} (98%) rename test/unit/{index.js => liquid.ts} (91%) rename test/unit/options/{cache.js => cache.ts} (92%) rename test/unit/options/{strict.js => strict.ts} (91%) rename test/unit/options/{trimming.js => trimming.ts} (97%) create mode 100644 test/unit/output.ts delete mode 100644 test/unit/parser.js delete mode 100644 test/unit/render.js create mode 100644 test/unit/render.ts rename test/unit/{scope.js => scope.ts} (99%) rename test/unit/{syntax.js => syntax.ts} (91%) rename test/unit/{tag.js => tag.ts} (74%) rename test/unit/tags/{assign.js => assign.ts} (98%) rename test/unit/tags/{capture.js => capture.ts} (96%) rename test/unit/tags/{case.js => case.ts} (98%) rename test/unit/tags/{comment.js => comment.ts} (97%) rename test/unit/tags/{cycle.js => cycle.ts} (96%) rename test/unit/tags/{decrement.js => decrement.ts} (98%) rename test/unit/tags/{for.js => for.ts} (99%) rename test/unit/tags/{if.js => if.ts} (99%) rename test/unit/tags/{include.js => include.ts} (99%) rename test/unit/tags/{increment.js => increment.ts} (98%) rename test/unit/tags/{layout.js => layout.ts} (99%) rename test/unit/tags/{raw.js => raw.ts} (95%) rename test/unit/tags/{tablerow.js => tablerow.ts} (98%) rename test/unit/tags/{unless.js => unless.ts} (93%) rename test/unit/{template-browser.js => template-browser.ts} (93%) rename test/unit/{template.js => template.ts} (93%) rename test/unit/{tokenizer.js => tokenizer.ts} (74%) rename test/unit/util/{assert.js => assert.ts} (100%) rename test/unit/util/{error.js => error.ts} (99%) rename test/unit/util/{promise.js => promise.ts} (98%) rename test/unit/util/{strftime.js => strftime.ts} (98%) rename test/unit/util/{underscore.js => underscore.ts} (93%) create mode 100644 test/unit/value.ts rename test/unit/{xhr.js => xhr.ts} (85%) diff --git a/.eslintrc.json b/.eslintrc.json index 4815abce6..72fc0a478 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,12 +1,16 @@ { "extends": "standard", "env": { + "mocha": true, "es6": true, "browser": true, "node": true }, + "parser": "@typescript-eslint/parser", "plugins": [ + "mocha", "standard", + "@typescript-eslint", "promise" ], "rules": { diff --git a/README.md b/README.md index 3dc40378d..688503c06 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ Filter arguments will be passed to the registered filter function, for example: engine.registerFilter('add', (initial, arg1, arg2) => initial + arg1 + arg2) ``` -See existing filter implementations here: +See existing filter implementations here: ## Register Tags @@ -232,7 +232,7 @@ engine.registerTag('upper', { * `parse`: Read tokens from `remainTokens` until your end token. * `render`: Combine scope data with your parsed tokens into HTML string. -See existing tag implementations here: +See existing tag implementations here: ## Plugin API diff --git a/package-lock.json b/package-lock.json index fb0570408..bf963aeab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,24 +14,16 @@ } }, "@babel/generator": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.0.tgz", - "integrity": "sha512-dZTwMvTgWfhmibq4V9X+LMf6Bgl7zAodRn9PvcPdhlzFMbvUutx74dbEv7Atz3ToeEpevYEJtAwfxq/bDCzHWg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz", + "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==", "dev": true, "requires": { - "@babel/types": "7.3.0", + "@babel/types": "7.3.3", "jsesc": "2.5.2", - "lodash": "4.17.10", + "lodash": "4.17.11", "source-map": "0.5.7", "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } } }, "@babel/helper-function-name": { @@ -42,7 +34,7 @@ "requires": { "@babel/helper-get-function-arity": "7.0.0", "@babel/template": "7.2.2", - "@babel/types": "7.3.0" + "@babel/types": "7.3.3" } }, "@babel/helper-get-function-arity": { @@ -51,7 +43,7 @@ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "@babel/types": "7.3.0" + "@babel/types": "7.3.3" } }, "@babel/helper-split-export-declaration": { @@ -60,7 +52,7 @@ "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", "dev": true, "requires": { - "@babel/types": "7.3.0" + "@babel/types": "7.3.3" } }, "@babel/highlight": { @@ -72,49 +64,12 @@ "chalk": "2.4.2", "esutils": "2.0.2", "js-tokens": "4.0.0" - }, - "dependencies": { - "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.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "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 - }, - "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" - } - } } }, "@babel/parser": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.1.tgz", - "integrity": "sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz", + "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==", "dev": true }, "@babel/template": { @@ -124,8 +79,8 @@ "dev": true, "requires": { "@babel/code-frame": "7.0.0", - "@babel/parser": "7.3.1", - "@babel/types": "7.3.0" + "@babel/parser": "7.3.3", + "@babel/types": "7.3.3" } }, "@babel/traverse": { @@ -135,62 +90,31 @@ "dev": true, "requires": { "@babel/code-frame": "7.0.0", - "@babel/generator": "7.3.0", + "@babel/generator": "7.3.3", "@babel/helper-function-name": "7.1.0", "@babel/helper-split-export-declaration": "7.0.0", - "@babel/parser": "7.3.1", - "@babel/types": "7.3.0", + "@babel/parser": "7.3.3", + "@babel/types": "7.3.3", "debug": "4.1.1", - "globals": "11.10.0", - "lodash": "4.17.10" - }, - "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" - } - }, - "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", - "dev": true - }, - "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 - } + "globals": "11.11.0", + "lodash": "4.17.11" } }, "@babel/types": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.0.tgz", - "integrity": "sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz", + "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==", "dev": true, "requires": { "esutils": "2.0.2", - "lodash": "4.17.10", + "lodash": "4.17.11", "to-fast-properties": "2.0.0" - }, - "dependencies": { - "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 - } } }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", - "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { "call-me-maybe": "1.0.1", @@ -199,17 +123,17 @@ }, "@nodelib/fs.stat": { "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz", - "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, "@octokit/endpoint": { - "version": "3.1.1", - "resolved": "http://registry.npm.taobao.org/@octokit/endpoint/download/@octokit/endpoint-3.1.1.tgz", - "integrity": "sha1-7emv76pNa3WEFp4SNGQlxvu0XMM=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.1.3.tgz", + "integrity": "sha512-vAWzeoj9Lzpl3V3YkWKhGzmDUoMfKpyxJhpq74/ohMvmLXDoEuAGnApy/7TRi3OmnjyX2Lr+e9UGGAD0919ohA==", "dev": true, "requires": { - "deepmerge": "3.0.0", + "deepmerge": "3.2.0", "is-plain-object": "2.0.4", "universal-user-agent": "2.0.3", "url-template": "2.0.8" @@ -217,20 +141,20 @@ }, "@octokit/request": { "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/@octokit/request/download/@octokit/request-2.3.0.tgz", - "integrity": "sha1-2iZyMIvPC5N272b1G92+Xrh8wAo=", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.3.0.tgz", + "integrity": "sha512-5YRqYNZOAaL7+nt7w3Scp6Sz4P2g7wKFP9npx1xdExMomk8/M/ICXVLYVam2wzxeY0cIc6wcKpjC5KI4jiNbGw==", "dev": true, "requires": { - "@octokit/endpoint": "3.1.1", + "@octokit/endpoint": "3.1.3", "is-plain-object": "2.0.4", "node-fetch": "2.3.0", "universal-user-agent": "2.0.3" } }, "@octokit/rest": { - "version": "16.13.3", - "resolved": "http://registry.npm.taobao.org/@octokit/rest/download/@octokit/rest-16.13.3.tgz", - "integrity": "sha1-cG/ZnrlN5/rRPE698tWJu030G6U=", + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.15.0.tgz", + "integrity": "sha512-Un+e7rgh38RtPOTe453pT/KPM/p2KZICimBmuZCd2wEo8PacDa4h6RqTPZs+f2DPazTTqdM7QU4LKlUjgiBwWw==", "dev": true, "requires": { "@octokit/request": "2.3.0", @@ -253,7 +177,7 @@ "@semantic-release/error": "2.2.0", "aggregate-error": "2.0.0", "fs-extra": "7.0.1", - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "@semantic-release/commit-analyzer": { @@ -262,35 +186,18 @@ "integrity": "sha512-2lb+t6muGenI86mYGpZYOgITx9L3oZYF697tJoqXeQEk0uw0fm+OkkOuDTBA3Oax9ftoNIrCKv9bwgYvxrbM6w==", "dev": true, "requires": { - "conventional-changelog-angular": "5.0.2", + "conventional-changelog-angular": "5.0.3", "conventional-commits-filter": "2.0.1", "conventional-commits-parser": "3.0.1", "debug": "4.1.1", "import-from": "2.1.0", - "lodash": "4.17.10" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } + "lodash": "4.17.11" } }, "@semantic-release/error": { "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/@semantic-release/error/download/@semantic-release/error-2.2.0.tgz", - "integrity": "sha1-7p1aCcmWnq3h7IZHdq7aXFzdu/A=", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", "dev": true }, "@semantic-release/git": { @@ -306,38 +213,21 @@ "execa": "1.0.0", "fs-extra": "7.0.1", "globby": "9.0.0", - "lodash": "4.17.10", + "lodash": "4.17.11", "micromatch": "3.1.10", "p-reduce": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "@semantic-release/github": { "version": "5.2.10", - "resolved": "http://registry.npm.taobao.org/@semantic-release/github/download/@semantic-release/github-5.2.10.tgz", - "integrity": "sha1-vzJfEWhdWbhkyJRtfTD8t0nYnjc=", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.2.10.tgz", + "integrity": "sha512-z/UwIxKb+EMiJDIy/57MBzJ80ar5H9GJQRyML/ILQ8dlrPwXs7cTyTvC7AesrF7t1mJZtg3ht9Qf9RdtR/LGzw==", "dev": true, "requires": { - "@octokit/rest": "16.13.3", + "@octokit/rest": "16.15.0", "@semantic-release/error": "2.2.0", "aggregate-error": "2.0.0", - "bottleneck": "2.15.3", + "bottleneck": "2.16.2", "debug": "4.1.1", "dir-glob": "2.2.2", "fs-extra": "7.0.1", @@ -345,7 +235,7 @@ "http-proxy-agent": "2.1.0", "https-proxy-agent": "2.2.1", "issue-parser": "3.0.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "mime": "2.4.0", "p-filter": "1.0.0", "p-retry": "3.0.1", @@ -353,72 +243,10 @@ "url-join": "4.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globby": { - "version": "9.0.0", - "resolved": "http://registry.npm.taobao.org/globby/download/globby-9.0.0.tgz", - "integrity": "sha1-OADfc23HESZt85tM4z/g1IH5TCM=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.2.2", - "fast-glob": "2.2.6", - "glob": "7.1.3", - "ignore": "4.0.6", - "pify": "4.0.1", - "slash": "2.0.0" - } - }, "mime": { "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/mime/download/mime-2.4.0.tgz", - "integrity": "sha1-4FH9iBNYWF8yed8zP+aU2gvP/dY=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", - "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", - "dev": true - }, - "url-join": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/url-join/download/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true } } @@ -433,7 +261,7 @@ "aggregate-error": "2.0.0", "execa": "1.0.0", "fs-extra": "7.0.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "nerf-dart": "1.0.0", "normalize-url": "4.1.0", "npm": "6.5.0", @@ -448,7 +276,7 @@ "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", "dev": true, "requires": { - "normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", "parse-json": "4.0.0", "pify": "3.0.0" } @@ -461,32 +289,15 @@ "integrity": "sha512-pWPouZujddgb6t61t9iA9G3yIfp3TeQ7bPbV1ixYSeP6L7gI1+Du82fY/OHfEwyifpymLUQW0XnIKgKct5IMMw==", "dev": true, "requires": { - "conventional-changelog-angular": "5.0.2", - "conventional-changelog-writer": "4.0.2", + "conventional-changelog-angular": "5.0.3", + "conventional-changelog-writer": "4.0.3", "conventional-commits-filter": "2.0.1", "conventional-commits-parser": "3.0.1", "debug": "4.1.1", "get-stream": "4.1.0", "import-from": "2.1.0", "into-stream": "4.0.0", - "lodash": "4.17.10" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } + "lodash": "4.17.11" } }, "@sinonjs/commons": { @@ -504,32 +315,101 @@ "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", "dev": true, "requires": { - "@sinonjs/samsam": "3.0.2" + "@sinonjs/samsam": "3.1.1" } }, "@sinonjs/samsam": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz", - "integrity": "sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.1.1.tgz", + "integrity": "sha512-ILlwvQUwAiaVBzr3qz8oT1moM7AIUHqUc2UmEjQcH9lLe+E+BZPwUMuc9FFojMswRK4r96x5zDTTrowMLw/vuA==", "dev": true, "requires": { "@sinonjs/commons": "1.3.0", "array-from": "2.1.1", - "lodash.get": "4.4.2" + "lodash": "4.17.11" } }, "@types/estree": { "version": "0.0.39", - "resolved": "http://registry.npm.taobao.org/@types/estree/download/@types/estree-0.0.39.tgz", - "integrity": "sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8=", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/jsdom": { + "version": "12.2.2", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-12.2.2.tgz", + "integrity": "sha512-+k4AsH9TXsuvucs6EiMxxPPWiXOGyM48P+jL+IPDYhtJ+L7Cl5xbN3Vig6z8tzvo9Lv7mjLGv54j3D/KExQl7Q==", + "dev": true, + "requires": { + "@types/node": "11.9.4", + "@types/tough-cookie": "2.3.5", + "parse5": "4.0.0" + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/mocha": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", + "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==", "dev": true }, "@types/node": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.3.tgz", - "integrity": "sha512-DMiqG51GwES/c4ScBY0u5bDlH44+oY8AeYHjY1SGCWidD7h08o1dfHue/TGK7REmif2KiJzaUskO+Q0eaeZ2fQ==", + "version": "11.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.4.tgz", + "integrity": "sha512-Zl8dGvAcEmadgs1tmSPcvwzO1YRsz38bVJQvH1RvRqSR9/5n61Q1ktcDL0ht3FXWR+ZpVmXVwN1LuH4Ax23NsA==", "dev": true }, + "@types/tough-cookie": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", + "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.3.0.tgz", + "integrity": "sha512-s+vjO9+PvYS2A6FnQC/imyEDOkrEKIzSpPf2OEGnkKqa5+1d0cuXgCi/oROtuBht2/u/iK22nrYcO/Ei4R8F/g==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "1.3.0", + "requireindex": "1.2.0", + "tsutils": "3.8.0" + } + }, + "@typescript-eslint/parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.3.0.tgz", + "integrity": "sha512-Q5cz9nyEQyRrtItRElvQXdNs0Xja1xvOdphDQR7N6MqUdi4juWVNxHKypdHQCx9OcEBev6pWHOda8lwg/2W9/g==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "1.3.0", + "eslint-scope": "4.0.0", + "eslint-visitor-keys": "1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.3.0.tgz", + "integrity": "sha512-h6UxHSmBUopFcxHg/eryrA+GwHMbh7PxotMbkq9p2f3nX60CKm5Zc0VN8krBD3IS5KqsK0iOz24VpEWrP+JZ2Q==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -548,18 +428,18 @@ }, "accepts": { "version": "1.3.5", - "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "2.1.18", + "mime-types": "2.1.22", "negotiator": "0.6.1" } }, "acorn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", - "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.0.tgz", + "integrity": "sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==", "dev": true }, "acorn-globals": { @@ -568,7 +448,7 @@ "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", "dev": true, "requires": { - "acorn": "6.0.5", + "acorn": "6.1.0", "acorn-walk": "6.1.1" } }, @@ -586,8 +466,8 @@ }, "agent-base": { "version": "4.2.1", - "resolved": "http://registry.npm.taobao.org/agent-base/download/agent-base-4.2.1.tgz", - "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { "es6-promisify": "5.0.0" @@ -595,8 +475,8 @@ }, "aggregate-error": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/aggregate-error/download/aggregate-error-2.0.0.tgz", - "integrity": "sha1-Zb2CvrpACX6ssvEHeltVxZOxirw=", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-2.0.0.tgz", + "integrity": "sha512-xA1VQPApQdDehIIpS3gBFkMGDRb9pDYwZPVUOoX8A0lU3GB0mjiACqsa9ByBurU53erhjamf5I4VNRitCfXhjg==", "dev": true, "requires": { "clean-stack": "2.0.0", @@ -604,32 +484,41 @@ } }, "ajv": { - "version": "5.5.2", - "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", + "fast-deep-equal": "2.0.1", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.1.0.tgz", - "integrity": "sha1-9zIHu4EgfXX9bIPxJa8m7qN4yjA=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "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.3" + } + }, "ansicolors": { "version": "0.3.2", - "resolved": "http://registry.npm.taobao.org/ansicolors/download/ansicolors-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, @@ -641,8 +530,8 @@ }, "argparse": { "version": "1.0.10", - "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "1.0.3" @@ -650,13 +539,13 @@ }, "argv-formatter": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/argv-formatter/download/argv-formatter-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", "dev": true }, "arr-diff": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, @@ -668,43 +557,43 @@ }, "arr-union": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/array-equal/download/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, "array-find-index": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, "array-flatten": { "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, "array-from": { "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/array-from/download/array-from-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, "array-ify": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/array-ify/download/array-ify-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, "array-union": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { @@ -713,31 +602,34 @@ }, "array-uniq": { "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.3.2", - "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "arrify": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "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.2" + } }, "assert-plus": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, @@ -749,7 +641,7 @@ }, "assign-symbols": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, @@ -759,6 +651,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "4.17.11" + } + }, "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", @@ -767,7 +668,7 @@ }, "asynckit": { "version": "0.4.0", - "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, @@ -779,19 +680,19 @@ }, "aws-sign2": { "version": "0.7.0", - "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.7.0.tgz", - "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "balanced-match": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, @@ -852,23 +753,22 @@ }, "bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "0.14.5" } }, "before-after-hook": { "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/before-after-hook/download/before-after-hook-1.3.2.tgz", - "integrity": "sha1-e/v4RK1nCqepa1pOThW9dLCO1ms=", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.2.tgz", + "integrity": "sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w==", "dev": true }, "body-parser": { "version": "1.18.3", - "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.3.tgz", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { @@ -884,6 +784,15 @@ "type-is": "1.6.16" }, "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" + } + }, "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -892,19 +801,25 @@ "requires": { "safer-buffer": "2.1.2" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "bottleneck": { - "version": "2.15.3", - "resolved": "http://registry.npm.taobao.org/bottleneck/download/bottleneck-2.15.3.tgz", - "integrity": "sha1-ZPL8Gl5MUG/VtzhjrD8qsdLWo0k=", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.16.2.tgz", + "integrity": "sha512-671wkIKV9K3yO/nfGw8tB4ihJazmZyd6DYEWxF1fuE7gzobk4w4atepHuYXoUHk78xLknjAGko8dXRcFO7iCoA==", "dev": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "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", @@ -948,13 +863,13 @@ }, "browser-stdout": { "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "btoa-lite": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/btoa-lite/download/btoa-lite-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", "dev": true }, @@ -964,15 +879,9 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "bytes": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, @@ -995,13 +904,13 @@ }, "call-me-maybe": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, "caller-callsite": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { @@ -1010,12 +919,21 @@ "dependencies": { "callsites": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true } } }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "2.0.0" + } + }, "callsites": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", @@ -1024,13 +942,13 @@ }, "camelcase": { "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "camelcase-keys": { "version": "4.2.0", - "resolved": "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { @@ -1041,7 +959,7 @@ }, "cardinal": { "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/cardinal/download/cardinal-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", "dev": true, "requires": { @@ -1051,7 +969,7 @@ }, "caseless": { "version": "0.12.0", - "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, @@ -1071,13 +989,24 @@ }, "chai-as-promised": { "version": "7.1.1", - "resolved": "http://registry.npm.taobao.org/chai-as-promised/download/chai-as-promised-7.1.1.tgz", - "integrity": "sha1-CGRdgl3rhpbuYXJdv1kMAS6wDKA=", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, "requires": { "check-error": "1.0.2" } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -1086,16 +1015,10 @@ }, "check-error": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/check-error/download/check-error-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1121,13 +1044,13 @@ }, "clean-stack": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/clean-stack/download/clean-stack-2.0.0.tgz", - "integrity": "sha1-MBv6no3S09mEwOVC96pnuZb2Pgo=", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.0.0.tgz", + "integrity": "sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==", "dev": true }, "cli-cursor": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { @@ -1136,7 +1059,7 @@ }, "cli-table": { "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/cli-table/download/cli-table-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "dev": true, "requires": { @@ -1145,53 +1068,30 @@ }, "cli-width": { "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "cliui": { "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz", - "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "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.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } } }, - "co": { - "version": "4.6.0", - "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "code-point-at": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "collection-visit": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { @@ -1200,44 +1100,44 @@ } }, "color-convert": { - "version": "1.9.2", - "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.2.tgz", - "integrity": "sha1-SYgbj7pn3xKpa98/VsCqueeRMUc=", + "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.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "colors": { "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/colors/download/colors-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "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.15.1", - "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.15.1.tgz", - "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, "compare-func": { "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/compare-func/download/compare-func-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", "dev": true, "requires": { @@ -1247,25 +1147,25 @@ }, "component-emitter": { "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz", + "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": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "contains-path": { "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, "content-disposition": { "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", "dev": true }, @@ -1276,9 +1176,9 @@ "dev": true }, "conventional-changelog-angular": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz", - "integrity": "sha512-yx7m7lVrXmt4nKWQgWZqxSALEiAKZhOAcbxdUaU9575mB0CzXVbgrgpfSnSP7OqWDUTYGD0YVJ0MSRdyOPgAwA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz", + "integrity": "sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==", "dev": true, "requires": { "compare-func": "1.3.2", @@ -1286,19 +1186,19 @@ } }, "conventional-changelog-writer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz", - "integrity": "sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.3.tgz", + "integrity": "sha512-bIlpSiQtQZ1+nDVHEEh798Erj2jhN/wEjyw9sfxY9es6h7pREE5BNJjfv0hXGH/FTrAsEpHUq4xzK99eePpwuA==", "dev": true, "requires": { "compare-func": "1.3.2", "conventional-commits-filter": "2.0.1", "dateformat": "3.0.3", - "handlebars": "4.0.12", + "handlebars": "4.1.0", "json-stringify-safe": "5.0.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "meow": "4.0.1", - "semver": "5.5.0", + "semver": "5.6.0", "split": "1.0.1", "through2": "2.0.5" } @@ -1321,7 +1221,7 @@ "requires": { "JSONStream": "1.3.5", "is-text-path": "1.0.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "meow": "4.0.1", "split2": "2.2.0", "through2": "2.0.5", @@ -1330,13 +1230,13 @@ }, "cookie": { "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, "cookie-signature": { "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, @@ -1348,66 +1248,58 @@ }, "copy-descriptor": { "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "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": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cosmiconfig": { "version": "5.0.7", - "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.0.7.tgz", - "integrity": "sha1-OYJrKS7g147aE336MXO9HCGkOwQ=", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", "dev": true, "requires": { "import-fresh": "2.0.0", "is-directory": "0.3.1", - "js-yaml": "3.12.0", + "js-yaml": "3.12.1", "parse-json": "4.0.0" }, "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "caller-path": "2.0.0", + "resolve-from": "3.0.0" } } } }, "coveralls": { "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/coveralls/download/coveralls-3.0.2.tgz", - "integrity": "sha1-9aC82Qyk5k4Ii3EPqN2mQK6kiE8=", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", + "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", "dev": true, "requires": { "growl": "1.10.5", - "js-yaml": "3.12.0", + "js-yaml": "3.12.1", "lcov-parse": "0.0.10", "log-driver": "1.2.7", "minimist": "1.2.0", - "request": "2.87.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "request": "2.88.0" } }, "cross-env": { "version": "5.2.0", - "resolved": "http://registry.npm.taobao.org/cross-env/download/cross-env-5.2.0.tgz", - "integrity": "sha1-bs1MAV1Xc+YUA57lKQdmabnRJvI=", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", + "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", "dev": true, "requires": { "cross-spawn": "6.0.5", @@ -1416,35 +1308,35 @@ }, "cross-spawn": { "version": "6.0.5", - "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "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", + "nice-try": "1.0.5", "path-key": "2.0.1", - "semver": "5.5.0", + "semver": "5.6.0", "shebang-command": "1.2.0", "which": "1.3.1" } }, "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", "dev": true }, "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", + "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", "dev": true, "requires": { - "cssom": "0.3.4" + "cssom": "0.3.6" } }, "currently-unhandled": { "version": "0.4.1", - "resolved": "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { @@ -1453,7 +1345,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { @@ -1478,23 +1370,23 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "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.0.0" + "ms": "2.1.1" } }, "decamelize": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decamelize-keys": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/decamelize-keys/download/decamelize-keys-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, "requires": { @@ -1504,7 +1396,7 @@ "dependencies": { "map-obj": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true } @@ -1512,7 +1404,7 @@ }, "decode-uri-component": { "version": "0.2.0", - "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, @@ -1533,14 +1425,14 @@ }, "deep-is": { "version": "0.1.3", - "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "deepmerge": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/deepmerge/download/deepmerge-3.0.0.tgz", - "integrity": "sha1-ynkDs0v6H4wuq2d5KAd1pBG/xro=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", + "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", "dev": true }, "define-property": { @@ -1586,58 +1478,41 @@ }, "delayed-stream": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "depd": { "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "destroy": { "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, "diff": { "version": "3.5.0", - "resolved": "http://registry.npm.taobao.org/diff/download/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "dir-glob": { "version": "2.2.2", - "resolved": "http://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", - "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { "path-type": "3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "2.0.2" @@ -1654,7 +1529,7 @@ }, "dot-prop": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "dev": true, "requires": { @@ -1663,7 +1538,7 @@ }, "duplexer2": { "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { @@ -1671,31 +1546,37 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "ee-first": { "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "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 + }, "encodeurl": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, "end-of-stream": { "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "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" @@ -1703,8 +1584,8 @@ }, "env-ci": { "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/env-ci/download/env-ci-3.2.0.tgz", - "integrity": "sha1-mC8CoFAcqMQ78HZcW9PYP/sosjo=", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.2.0.tgz", + "integrity": "sha512-TFjNiDlXrL8/pfHswdvJGEZzJcq3aBPb8Eka83hlGLwuNw9F9BC9S9ETlkfkItLRT9k5JgpGgeP+rL6/3cEbcw==", "dev": true, "requires": { "execa": "1.0.0", @@ -1713,37 +1594,37 @@ }, "error-ex": { "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "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" } }, "es6-promise": { - "version": "4.2.5", - "resolved": "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.5.tgz", - "integrity": "sha1-2m0NVpLvtGHggsFIF/4kJ9j10FQ=", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/es6-promisify/download/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "es6-promise": "4.2.5" + "es6-promise": "4.2.6" } }, "escape-html": { "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, @@ -1776,155 +1657,47 @@ } }, "eslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.1.tgz", - "integrity": "sha512-54NV+JkTpTu0d8+UYSA8mMKAG4XAsaOrozA9rCW7tgneg1mevcL7wIotPC+fZ0SkWwdhNqoXoxnQCTBp7UvTsg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.0.tgz", + "integrity": "sha512-jrOhiYyENRrRnWlMYANlGZTqb89r2FuRT+615AabBoajhNjeh9ywDNlh2LU9vTqf0WYN+L3xdXuIi7xuj/tK9w==", "dev": true, "requires": { "@babel/code-frame": "7.0.0", - "ajv": "6.7.0", + "ajv": "6.9.1", "chalk": "2.4.2", "cross-spawn": "6.0.5", "debug": "4.1.1", - "doctrine": "2.1.0", + "doctrine": "3.0.0", "eslint-scope": "4.0.0", "eslint-utils": "1.3.1", "eslint-visitor-keys": "1.0.0", - "espree": "5.0.0", + "espree": "5.0.1", "esquery": "1.0.1", "esutils": "2.0.2", - "file-entry-cache": "2.0.0", + "file-entry-cache": "5.0.1", "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.10.0", + "glob": "7.1.3", + "globals": "11.11.0", "ignore": "4.0.6", "import-fresh": "3.0.0", "imurmurhash": "0.1.4", - "inquirer": "6.2.1", - "js-yaml": "3.12.0", + "inquirer": "6.2.2", + "js-yaml": "3.12.1", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", - "lodash": "4.17.10", + "lodash": "4.17.11", "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", - "pluralize": "7.0.0", "progress": "2.0.3", "regexpp": "2.0.1", "semver": "5.6.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "5.2.2", + "table": "5.2.3", "text-table": "0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", - "dev": true, - "requires": { - "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-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "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.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "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" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", - "dev": true - }, - "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", - "dev": true, - "requires": { - "parent-module": "1.0.0", - "resolve-from": "4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "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 - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "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" - } - }, - "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" - } - } } }, "eslint-config-standard": { @@ -1941,6 +1714,23 @@ "requires": { "debug": "2.6.9", "resolve": "1.10.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-module-utils": { @@ -1951,6 +1741,23 @@ "requires": { "debug": "2.6.9", "pkg-dir": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-plugin-es": { @@ -1964,9 +1771,9 @@ } }, "eslint-plugin-import": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.15.0.tgz", - "integrity": "sha512-LEHqgR+RcnpGqYW7h9WMkPb/tP+ekKxWdQDztfTtZeV43IHF+X8lXU+1HOCcR4oXD24qRgEwNSxIweD5uNKGVg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "dev": true, "requires": { "contains-path": "0.1.0", @@ -1981,6 +1788,15 @@ "resolve": "1.10.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -1991,31 +1807,22 @@ "isarray": "1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", + "graceful-fs": "4.1.15", "parse-json": "2.2.0", "pify": "2.3.0", "strip-bom": "3.0.0" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "parse-json": { @@ -2049,7 +1856,7 @@ "dev": true, "requires": { "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", "path-type": "2.0.0" } }, @@ -2066,9 +1873,9 @@ } }, "eslint-plugin-mocha": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.2.1.tgz", - "integrity": "sha512-v95cxwpPiyt2Gb/Moog8KQtaT+KlGGMbqpOkcP/eIkvaovPEcTprOYywAOo1On+KDsfEbJ4mByfcfUEwrxH9Gw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.3.0.tgz", + "integrity": "sha512-3uwlJVLijjEmBeNyH60nzqgA1gacUWLUmcKV8PIGNvj1kwP/CTgAWQHn2ayyJVwziX+KETkr9opNwT1qD/RZ5A==", "dev": true, "requires": { "ramda": "0.26.1" @@ -2085,7 +1892,7 @@ "ignore": "5.0.5", "minimatch": "3.0.4", "resolve": "1.10.0", - "semver": "5.5.0" + "semver": "5.6.0" }, "dependencies": { "ignore": { @@ -2131,20 +1938,20 @@ "dev": true }, "espree": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", - "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { - "acorn": "6.0.5", + "acorn": "6.1.0", "acorn-jsx": "5.0.1", "eslint-visitor-keys": "1.0.0" } }, "esprima": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "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 }, "esquery": { @@ -2167,26 +1974,32 @@ }, "estraverse": { "version": "4.2.0", - "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + }, "esutils": { "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "etag": { "version": "1.8.1", - "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, "execa": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "6.0.5", @@ -2200,7 +2013,7 @@ }, "expand-brackets": { "version": "2.1.4", - "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { @@ -2213,9 +2026,18 @@ "to-regex": "3.0.2" }, "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": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -2224,12 +2046,18 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "0.1.1" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -2320,17 +2148,34 @@ "type-is": "1.6.16", "utils-merge": "1.0.1", "vary": "1.1.2" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "extend": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "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": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { @@ -2427,20 +2272,20 @@ }, "extsprintf": { "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "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": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-glob": { "version": "2.2.6", - "resolved": "http://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.6.tgz", - "integrity": "sha1-pdW2l+yN7aRo2Fp0A1KQoCWpUpU=", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", "dev": true, "requires": { "@mrmlnc/readdir-enhanced": "2.2.1", @@ -2453,19 +2298,19 @@ }, "fast-json-stable-stringify": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "fast-levenshtein": { "version": "2.0.6", - "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "figures": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { @@ -2473,13 +2318,12 @@ } }, "file-entry-cache": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { - "flat-cache": "1.3.4", - "object-assign": "4.1.1" + "flat-cache": "2.0.1" } }, "filename-regex": { @@ -2490,7 +2334,7 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { @@ -2502,7 +2346,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -2524,12 +2368,38 @@ "parseurl": "1.3.2", "statuses": "1.4.0", "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" } }, "find-versions": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/find-versions/download/find-versions-3.0.0.tgz", - "integrity": "sha1-LAWoboOcJJEBkQEAs1QZZ4WiwGU=", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", + "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", "dev": true, "requires": { "array-uniq": "2.0.0", @@ -2538,27 +2408,32 @@ "dependencies": { "array-uniq": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/array-uniq/download/array-uniq-2.0.0.tgz", - "integrity": "sha1-AAnjAwbjem3S4uJIDbUxb9reFYM=", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", + "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", "dev": true } } }, "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { - "circular-json": "0.3.3", - "graceful-fs": "4.1.11", + "flatted": "2.0.0", "rimraf": "2.6.3", - "write": "0.2.1" + "write": "1.0.3" } }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, "for-in": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, @@ -2573,19 +2448,19 @@ }, "forever-agent": { "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "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.18" + "combined-stream": "1.0.7", + "mime-types": "2.1.22" } }, "formidable": { @@ -2596,13 +2471,13 @@ }, "forwarded": { "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, "fragment-cache": { "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { @@ -2611,13 +2486,13 @@ }, "fresh": { "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, "from2": { "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { @@ -2627,18 +2502,18 @@ }, "fs-extra": { "version": "7.0.1", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz", - "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { - "graceful-fs": "4.1.11", + "graceful-fs": "4.1.15", "jsonfile": "4.0.0", "universalify": "0.1.2" } }, "fs.realpath": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, @@ -2650,26 +2525,26 @@ }, "functional-red-black-tree": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "get-caller-file": { "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", - "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-func-name": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/get-func-name/download/get-func-name-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-stream": { "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "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" @@ -2677,13 +2552,13 @@ }, "get-value": { "version": "2.0.6", - "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { "version": "0.1.7", - "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { @@ -2692,7 +2567,7 @@ }, "git-log-parser": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/git-log-parser/download/git-log-parser-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", "dev": true, "requires": { @@ -2706,7 +2581,7 @@ "dependencies": { "split2": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/split2/download/split2-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", "dev": true, "requires": { @@ -2716,9 +2591,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "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", @@ -2767,7 +2642,7 @@ }, "glob-parent": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { @@ -2777,7 +2652,7 @@ "dependencies": { "is-glob": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { @@ -2788,10 +2663,16 @@ }, "glob-to-regexp": { "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, "globby": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-9.0.0.tgz", @@ -2807,67 +2688,38 @@ "slash": "2.0.0" }, "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true } } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "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": "http://registry.npm.taobao.org/growl/download/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", "dev": true, "requires": { - "async": "2.6.1", + "async": "2.6.2", "optimist": "0.6.1", "source-map": "0.6.1", "uglify-js": "3.4.9" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2878,17 +2730,17 @@ }, "har-schema": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "5.5.2", + "ajv": "6.9.1", "har-schema": "2.0.0" } }, @@ -2903,13 +2755,13 @@ }, "has-flag": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-value": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { @@ -2920,7 +2772,7 @@ }, "has-values": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { @@ -2930,7 +2782,7 @@ "dependencies": { "kind-of": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { @@ -2941,20 +2793,20 @@ }, "he": { "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, "hook-std": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/hook-std/download/hook-std-1.2.0.tgz", - "integrity": "sha1-s31TPqX0AGj+Noy00CLuGZJYjCc=", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.2.0.tgz", + "integrity": "sha512-yntre2dbOAjgQ5yoRykyON0D9T96BfshR8IuiL/r3celeHD8I/76w4qo8m3z99houR4Z678jakV3uXrQdSvW/w==", "dev": true }, "hosted-git-info": { - "version": "2.6.1", - "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.6.1.tgz", - "integrity": "sha1-bkzueLAbuEnc+TUncIxp/b7kEN8=", + "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 }, "html-encoding-sniffer": { @@ -2968,7 +2820,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -2980,8 +2832,8 @@ }, "http-proxy-agent": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/http-proxy-agent/download/http-proxy-agent-2.1.0.tgz", - "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { "agent-base": "4.2.1", @@ -2990,30 +2842,36 @@ "dependencies": { "debug": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "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 } } }, "http-signature": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", + "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.4.1", - "sshpk": "1.14.2" + "sshpk": "1.16.1" } }, "https-proxy-agent": { "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-2.2.1.tgz", - "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { "agent-base": "4.2.1", @@ -3022,18 +2880,12 @@ "dependencies": { "debug": { "version": "3.2.6", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true } } }, @@ -3048,69 +2900,52 @@ }, "ignore": { "version": "4.0.6", - "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "import-fresh": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", "dev": true, "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" + "parent-module": "1.0.0", + "resolve-from": "4.0.0" }, "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "2.0.0" - } - }, "resolve-from": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "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 } } }, "import-from": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { "resolve-from": "3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } } }, "imurmurhash": { "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indent-string": { "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/indent-string/download/indent-string-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, "inflight": { "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { @@ -3120,7 +2955,7 @@ }, "inherits": { "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, @@ -3131,21 +2966,21 @@ "dev": true }, "inquirer": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", - "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", + "ansi-escapes": "3.2.0", "chalk": "2.4.2", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "3.0.3", "figures": "2.0.0", - "lodash": "4.17.10", + "lodash": "4.17.11", "mute-stream": "0.0.7", "run-async": "2.3.0", - "rxjs": "6.3.3", + "rxjs": "6.4.0", "string-width": "2.1.1", "strip-ansi": "5.0.0", "through": "2.3.8" @@ -3157,26 +2992,6 @@ "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", "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.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, "strip-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", @@ -3185,15 +3000,6 @@ "requires": { "ansi-regex": "4.0.0" } - }, - "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" - } } } }, @@ -3209,19 +3015,19 @@ }, "invert-kv": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz", - "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "ipaddr.js": { "version": "1.8.0", - "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.8.0.tgz", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -3230,7 +3036,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -3241,7 +3047,7 @@ }, "is-arrayish": { "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, @@ -3251,18 +3057,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -3271,7 +3068,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -3301,7 +3098,7 @@ }, "is-directory": { "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, @@ -3322,25 +3119,25 @@ }, "is-extendable": { "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "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": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "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": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { @@ -3349,7 +3146,7 @@ }, "is-number": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { @@ -3358,7 +3155,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -3369,13 +3166,13 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, "is-plain-obj": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, @@ -3402,25 +3199,25 @@ }, "is-promise": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-stream": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-subset": { "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/is-subset/download/is-subset-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", "dev": true }, "is-text-path": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-text-path/download/is-text-path-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { @@ -3429,44 +3226,44 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "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": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "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": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "isstream": { "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "issue-parser": { "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/issue-parser/download/issue-parser-3.0.1.tgz", - "integrity": "sha1-7o3Wd/21vmRUH4H6XnJnuqJxp+4=", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.1.tgz", + "integrity": "sha512-5wdT3EE8Kq38x/hJD8QZCJ9scGoOZ5QnzwXyClkviSWTS+xOCE6hJ0qco3H5n5jCsFqpbofZCcMWqlXJzF72VQ==", "dev": true, "requires": { "lodash.capitalize": "4.2.1", @@ -3477,36 +3274,36 @@ } }, "istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, "istanbul-lib-instrument": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", - "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", "dev": true, "requires": { - "@babel/generator": "7.3.0", - "@babel/parser": "7.3.1", + "@babel/generator": "7.3.3", + "@babel/parser": "7.3.3", "@babel/template": "7.2.2", "@babel/traverse": "7.2.3", - "@babel/types": "7.3.0", - "istanbul-lib-coverage": "2.0.1", - "semver": "5.5.0" + "@babel/types": "7.3.3", + "istanbul-lib-coverage": "2.0.3", + "semver": "5.6.0" } }, "java-properties": { "version": "0.2.10", - "resolved": "http://registry.npm.taobao.org/java-properties/download/java-properties-0.2.10.tgz", - "integrity": "sha1-JVFWDCX6GtlNmYIYF48jOtmxj2A=", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", + "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", "dev": true }, "jest-worker": { "version": "24.0.0", - "resolved": "http://registry.npm.taobao.org/jest-worker/download/jest-worker-24.0.0.tgz", - "integrity": "sha1-PTSDsHe/BPQS9HZUonu6fpR/i20=", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.0.0.tgz", + "integrity": "sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==", "dev": true, "requires": { "merge-stream": "1.0.1", @@ -3515,8 +3312,8 @@ "dependencies": { "supports-color": { "version": "6.1.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "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" @@ -3524,22 +3321,27 @@ } } }, + "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 + }, "js-yaml": { - "version": "3.12.0", - "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.0.tgz", - "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { "argparse": "1.0.10", - "esprima": "4.0.0" + "esprima": "4.0.1" } }, "jsbn": { "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsdom": { "version": "13.2.0", @@ -3548,20 +3350,20 @@ "dev": true, "requires": { "abab": "2.0.0", - "acorn": "6.0.5", + "acorn": "6.1.0", "acorn-globals": "4.3.0", "array-equal": "1.0.0", - "cssom": "0.3.4", - "cssstyle": "1.1.1", + "cssom": "0.3.6", + "cssstyle": "1.2.1", "data-urls": "1.1.0", "domexception": "1.0.1", "escodegen": "1.11.0", "html-encoding-sniffer": "1.0.2", - "nwsapi": "2.0.9", + "nwsapi": "2.1.0", "parse5": "5.1.0", "pn": "1.1.0", "request": "2.88.0", - "request-promise-native": "1.0.5", + "request-promise-native": "1.0.7", "saxes": "3.1.6", "symbol-tree": "3.2.2", "tough-cookie": "2.5.0", @@ -3571,117 +3373,16 @@ "whatwg-encoding": "1.0.5", "whatwg-mimetype": "2.3.0", "whatwg-url": "7.0.0", - "ws": "6.1.3", + "ws": "6.1.4", "xml-name-validator": "3.0.0" }, "dependencies": { - "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "6.7.0", - "har-schema": "2.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "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" - } - }, - "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 - }, - "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.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.21", - "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" - }, - "dependencies": { - "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.31", - "punycode": "1.4.1" - } - } - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -3690,66 +3391,73 @@ "requires": { "psl": "1.1.31", "punycode": "2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } } } } }, + "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": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "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": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", + "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": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, "jsonfile": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "4.1.15" } }, "jsonparse": { "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, "jsprim": { "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { @@ -3773,8 +3481,8 @@ }, "lcid": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz", - "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "2.0.0" @@ -3782,13 +3490,13 @@ }, "lcov-parse": { "version": "0.0.10", - "resolved": "http://registry.npm.taobao.org/lcov-parse/download/lcov-parse-0.0.10.tgz", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, "levn": { "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { @@ -3798,11 +3506,11 @@ }, "load-json-file": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz", + "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.11", + "graceful-fs": "4.1.15", "parse-json": "4.0.0", "pify": "3.0.0", "strip-bom": "3.0.0" @@ -3810,103 +3518,101 @@ }, "locate-path": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { - "version": "4.17.10", - "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.10.tgz", - "integrity": "sha1-G3eTz3JZ6jj7NmHU04syYK+K5Oc=", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash.capitalize": { "version": "4.2.1", - "resolved": "http://registry.npm.taobao.org/lodash.capitalize/download/lodash.capitalize-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, "lodash.escaperegexp": { "version": "4.1.2", - "resolved": "http://registry.npm.taobao.org/lodash.escaperegexp/download/lodash.escaperegexp-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", "dev": true }, "lodash.get": { "version": "4.4.2", - "resolved": "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "lodash.isplainobject": { "version": "4.0.6", - "resolved": "http://registry.npm.taobao.org/lodash.isplainobject/download/lodash.isplainobject-4.0.6.tgz", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, "lodash.isstring": { "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/lodash.isstring/download/lodash.isstring-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", "dev": true }, "lodash.set": { "version": "4.3.2", - "resolved": "http://registry.npm.taobao.org/lodash.set/download/lodash.set-4.3.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", "dev": true }, "lodash.sortby": { "version": "4.7.0", - "resolved": "http://registry.npm.taobao.org/lodash.sortby/download/lodash.sortby-4.7.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, "lodash.toarray": { "version": "4.4.0", - "resolved": "http://registry.npm.taobao.org/lodash.toarray/download/lodash.toarray-4.4.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", "dev": true }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", - "resolved": "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, "lodash.uniqby": { "version": "4.7.0", - "resolved": "http://registry.npm.taobao.org/lodash.uniqby/download/lodash.uniqby-4.7.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", "dev": true }, "log-driver": { "version": "1.2.7", - "resolved": "http://registry.npm.taobao.org/log-driver/download/log-driver-1.2.7.tgz", - "integrity": "sha1-Y7lQIfBwL+36LJuwok53l9cYcdg=", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, "lolex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", - "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", + "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", "dev": true }, "loud-rejection": { "version": "1.6.0", - "resolved": "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { @@ -3916,8 +3622,8 @@ }, "macos-release": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/macos-release/download/macos-release-2.0.0.tgz", - "integrity": "sha1-fd30yveQAahR60+6f7YDTyUSdqs=", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", + "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", "dev": true }, "make-error": { @@ -3928,8 +3634,8 @@ }, "map-age-cleaner": { "version": "0.1.3", - "resolved": "http://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz", - "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "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" @@ -3937,19 +3643,19 @@ }, "map-cache": { "version": "0.2.2", - "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-obj": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/map-obj/download/map-obj-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, "map-visit": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { @@ -3958,53 +3664,22 @@ }, "marked": { "version": "0.6.0", - "resolved": "http://registry.npm.taobao.org/marked/download/marked-0.6.0.tgz", - "integrity": "sha1-oY0Bz9z40Vw8RVtxyDKeXg8B+qE=", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.0.tgz", + "integrity": "sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g==", "dev": true }, "marked-terminal": { "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/marked-terminal/download/marked-terminal-3.2.0.tgz", - "integrity": "sha1-P8kdVFaTMrzwlikq8XjYIhkABHQ=", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.2.0.tgz", + "integrity": "sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", + "ansi-escapes": "3.2.0", "cardinal": "2.1.1", "chalk": "2.4.2", "cli-table": "0.3.1", - "node-emoji": "1.8.1", + "node-emoji": "1.10.0", "supports-hyperlinks": "1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } } }, "math-random": { @@ -4015,27 +3690,19 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "mem": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/mem/download/mem-4.0.0.tgz", - "integrity": "sha1-ZDdpDZRxZ49syDZZwAy6/Nawza8=", + "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.3", "mimic-fn": "1.2.0", - "p-is-promise": "1.1.0" - }, - "dependencies": { - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/p-is-promise/download/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - } + "p-is-promise": "2.0.0" } }, "meow": { @@ -4049,48 +3716,21 @@ "loud-rejection": "1.6.0", "minimist": "1.2.0", "minimist-options": "3.0.2", - "normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", "read-pkg-up": "3.0.0", "redent": "2.0.0", "trim-newlines": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - } } }, "merge-descriptors": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, "merge-stream": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/merge-stream/download/merge-stream-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { @@ -4099,13 +3739,13 @@ }, "merge2": { "version": "1.2.3", - "resolved": "http://registry.npm.taobao.org/merge2/download/merge2-1.2.3.tgz", - "integrity": "sha1-fumdvWm7ZIFoklPwGEiKG5ArDtU=", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", "dev": true }, "methods": { "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, @@ -4137,39 +3777,39 @@ "dev": true }, "mime-db": { - "version": "1.33.0", - "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.33.0.tgz", - "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.18.tgz", - "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "1.38.0" } }, "mimic-fn": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "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": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.11" } }, "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "minimist-options": { @@ -4205,17 +3845,25 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "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": "5.2.0", - "resolved": "http://registry.npm.taobao.org/mocha/download/mocha-5.2.0.tgz", - "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { "browser-stdout": "1.3.1", @@ -4231,19 +3879,45 @@ "supports-color": "5.4.0" }, "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, "debug": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "supports-color": { "version": "5.4.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -4252,9 +3926,9 @@ } }, "mock-fs": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz", - "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz", + "integrity": "sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw==", "dev": true }, "modify-values": { @@ -4264,14 +3938,14 @@ "dev": true }, "ms": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 }, "mute-stream": { "version": "0.0.7", - "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, @@ -4296,26 +3970,26 @@ }, "natural-compare": { "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "negotiator": { "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, "nerf-dart": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/nerf-dart/download/nerf-dart-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", "dev": true }, "nice-try": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.4.tgz", - "integrity": "sha1-2Tli9sUvLBVYwPvabVEoGfHv4cQ=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "nise": { @@ -4355,9 +4029,9 @@ } }, "node-emoji": { - "version": "1.8.1", - "resolved": "http://registry.npm.taobao.org/node-emoji/download/node-emoji-1.8.1.tgz", - "integrity": "sha1-buxr+wdCHiFIx1xrunJCH4UwqCY=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", "dev": true, "requires": { "lodash.toarray": "4.4.0" @@ -4365,20 +4039,20 @@ }, "node-fetch": { "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/node-fetch/download/node-fetch-2.3.0.tgz", - "integrity": "sha1-Gh2UC7+5FqHT4CGfA36J5x+MX6U=", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", "dev": true }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "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.6.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "2.7.1", + "resolve": "1.10.0", + "semver": "5.6.0", + "validate-npm-package-license": "3.0.4" } }, "normalize-path": { @@ -7498,7 +7172,7 @@ }, "npm-run-path": { "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { @@ -7507,64 +7181,48 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "nwsapi": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.0.tgz", + "integrity": "sha512-ZG3bLAvdHmhIjaQ/Db1qvBxsGvFMLIRpQszyqbg31VJ53UP++uZX1/gf3Ut96pdwN9AuDwlMqIYLm0UPCdUeHg==", "dev": true }, "nyc": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz", - "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", + "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", "dev": true, "requires": { "archy": "1.0.0", "arrify": "1.0.1", - "caching-transform": "2.0.0", + "caching-transform": "3.0.1", "convert-source-map": "1.6.0", - "debug-log": "1.0.1", "find-cache-dir": "2.0.0", "find-up": "3.0.0", "foreground-child": "1.5.6", "glob": "7.1.3", - "istanbul-lib-coverage": "2.0.1", - "istanbul-lib-hook": "2.0.1", - "istanbul-lib-instrument": "3.0.0", - "istanbul-lib-report": "2.0.2", - "istanbul-lib-source-maps": "2.0.1", - "istanbul-reports": "2.0.1", + "istanbul-lib-coverage": "2.0.3", + "istanbul-lib-hook": "2.0.3", + "istanbul-lib-instrument": "3.1.0", + "istanbul-lib-report": "2.0.4", + "istanbul-lib-source-maps": "3.0.2", + "istanbul-reports": "2.1.1", "make-dir": "1.3.0", "merge-source-map": "1.1.0", "resolve-from": "4.0.0", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "signal-exit": "3.0.2", "spawn-wrap": "1.4.2", - "test-exclude": "5.0.0", + "test-exclude": "5.1.0", "uuid": "3.3.2", - "yargs": "11.1.0", - "yargs-parser": "9.0.2" + "yargs": "12.0.5", + "yargs-parser": "11.1.1" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, "ansi-regex": { "version": "3.0.0", "bundled": true, @@ -7589,9 +7247,12 @@ "dev": true }, "async": { - "version": "1.5.2", + "version": "2.6.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "lodash": "4.17.11" + } }, "balanced-match": { "version": "1.0.0", @@ -7607,55 +7268,30 @@ "concat-map": "0.0.1" } }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, "caching-transform": { - "version": "2.0.0", + "version": "3.0.1", "bundled": true, "dev": true, "requires": { + "hasha": "3.0.0", "make-dir": "1.3.0", - "md5-hex": "2.0.0", - "package-hash": "2.0.0", - "write-file-atomic": "2.3.0" + "package-hash": "3.0.0", + "write-file-atomic": "2.4.2" } }, "camelcase": { - "version": "1.2.1", + "version": "5.0.0", "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } + "dev": true }, "cliui": { - "version": "2.1.0", + "version": "4.1.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "code-point-at": { @@ -7663,6 +7299,12 @@ "bundled": true, "dev": true }, + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true + }, "commondir": { "version": "1.0.1", "bundled": true, @@ -7686,23 +7328,18 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "4.1.3", + "lru-cache": "4.1.5", "which": "1.3.1" } }, "debug": { - "version": "3.1.0", + "version": "4.1.1", "bundled": true, "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.1" } }, - "debug-log": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, "decamelize": { "version": "1.2.0", "bundled": true, @@ -7716,6 +7353,14 @@ "strip-bom": "3.0.0" } }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0" + } + }, "error-ex": { "version": "1.3.2", "bundled": true, @@ -7730,12 +7375,12 @@ "dev": true }, "execa": { - "version": "0.7.0", + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", + "cross-spawn": "6.0.5", + "get-stream": "4.1.0", "is-stream": "1.1.0", "npm-run-path": "2.0.2", "p-finally": "1.0.0", @@ -7744,11 +7389,13 @@ }, "dependencies": { "cross-spawn": { - "version": "5.1.0", + "version": "6.0.5", "bundled": true, "dev": true, "requires": { - "lru-cache": "4.1.3", + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.6.0", "shebang-command": "1.2.0", "which": "1.3.1" } @@ -7793,9 +7440,12 @@ "dev": true }, "get-stream": { - "version": "3.0.0", + "version": "4.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "pump": "3.0.0" + } }, "glob": { "version": "7.1.3", @@ -7811,28 +7461,25 @@ } }, "graceful-fs": { - "version": "4.1.11", + "version": "4.1.15", "bundled": true, "dev": true }, "handlebars": { - "version": "4.0.11", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { - "async": "1.5.2", + "async": "2.6.2", "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "source-map": "0.6.1", + "uglify-js": "3.4.9" }, "dependencies": { "source-map": { - "version": "0.4.4", + "version": "0.6.1", "bundled": true, - "dev": true, - "requires": { - "amdefine": "1.0.1" - } + "dev": true } } }, @@ -7841,6 +7488,14 @@ "bundled": true, "dev": true }, + "hasha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-stream": "1.1.0" + } + }, "hosted-git-info": { "version": "2.7.1", "bundled": true, @@ -7866,7 +7521,7 @@ "dev": true }, "invert-kv": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true, "dev": true }, @@ -7875,19 +7530,6 @@ "bundled": true, "dev": true }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, @@ -7904,12 +7546,12 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.1", + "version": "2.0.3", "bundled": true, "dev": true }, "istanbul-lib-hook": { - "version": "2.0.1", + "version": "2.0.3", "bundled": true, "dev": true, "requires": { @@ -7917,24 +7559,34 @@ } }, "istanbul-lib-report": { - "version": "2.0.2", + "version": "2.0.4", "bundled": true, "dev": true, "requires": { - "istanbul-lib-coverage": "2.0.1", + "istanbul-lib-coverage": "2.0.3", "make-dir": "1.3.0", - "supports-color": "5.4.0" + "supports-color": "6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } } }, "istanbul-lib-source-maps": { - "version": "2.0.1", + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "2.0.1", + "debug": "4.1.1", + "istanbul-lib-coverage": "2.0.3", "make-dir": "1.3.0", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "source-map": "0.6.1" }, "dependencies": { @@ -7946,11 +7598,11 @@ } }, "istanbul-reports": { - "version": "2.0.1", + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "4.1.0" } }, "json-parse-better-errors": { @@ -7958,26 +7610,12 @@ "bundled": true, "dev": true }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, "lcid": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "2.0.0" } }, "load-json-file": { @@ -7985,7 +7623,7 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", + "graceful-fs": "4.1.15", "parse-json": "4.0.0", "pify": "3.0.0", "strip-bom": "3.0.0" @@ -8000,18 +7638,18 @@ "path-exists": "3.0.0" } }, + "lodash": { + "version": "4.17.11", + "bundled": true, + "dev": true + }, "lodash.flattendeep": { "version": "4.4.0", "bundled": true, "dev": true }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, "lru-cache": { - "version": "4.1.3", + "version": "4.1.5", "bundled": true, "dev": true, "requires": { @@ -8027,25 +7665,22 @@ "pify": "3.0.0" } }, - "md5-hex": { - "version": "2.0.0", + "map-age-cleaner": { + "version": "0.1.3", "bundled": true, "dev": true, "requires": { - "md5-o-matic": "0.1.1" + "p-defer": "1.0.0" } }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, "mem": { - "version": "1.1.0", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { - "mimic-fn": "1.2.0" + "map-age-cleaner": "0.1.3", + "mimic-fn": "1.2.0", + "p-is-promise": "2.0.0" } }, "merge-source-map": { @@ -8097,19 +7732,24 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", "bundled": true, "dev": true }, "normalize-package-data": { - "version": "2.4.0", + "version": "2.5.0", "bundled": true, "dev": true, "requires": { "hosted-git-info": "2.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "resolve": "1.10.0", + "semver": "5.6.0", + "validate-npm-package-license": "3.0.4" } }, "npm-run-path": { @@ -8148,23 +7788,33 @@ "dev": true }, "os-locale": { - "version": "2.1.0", + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "1.0.0", + "lcid": "2.0.0", + "mem": "4.1.0" } }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "p-finally": { "version": "1.0.0", "bundled": true, "dev": true }, - "p-limit": { + "p-is-promise": { "version": "2.0.0", "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, "dev": true, "requires": { "p-try": "2.0.0" @@ -8175,7 +7825,7 @@ "bundled": true, "dev": true, "requires": { - "p-limit": "2.0.0" + "p-limit": "2.1.0" } }, "p-try": { @@ -8184,13 +7834,13 @@ "dev": true }, "package-hash": { - "version": "2.0.0", + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", + "graceful-fs": "4.1.15", + "hasha": "3.0.0", "lodash.flattendeep": "4.4.0", - "md5-hex": "2.0.0", "release-zalgo": "1.0.0" } }, @@ -8218,6 +7868,11 @@ "bundled": true, "dev": true }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, "path-type": { "version": "3.0.0", "bundled": true, @@ -8244,13 +7899,22 @@ "bundled": true, "dev": true }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, "read-pkg": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", "path-type": "3.0.0" } }, @@ -8271,11 +7935,6 @@ "es6-error": "4.1.1" } }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, "require-directory": { "version": "2.1.1", "bundled": true, @@ -8286,22 +7945,21 @@ "bundled": true, "dev": true }, + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "1.0.6" + } + }, "resolve-from": { "version": "4.0.0", "bundled": true, "dev": true }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "requires": { @@ -8314,7 +7972,7 @@ "dev": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true }, @@ -8341,12 +7999,6 @@ "bundled": true, "dev": true }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true, - "optional": true - }, "spawn-wrap": { "version": "1.4.2", "bundled": true, @@ -8355,22 +8007,22 @@ "foreground-child": "1.5.6", "mkdirp": "0.5.1", "os-homedir": "1.0.2", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "signal-exit": "3.0.2", "which": "1.3.1" } }, "spdx-correct": { - "version": "3.0.0", + "version": "3.1.0", "bundled": true, "dev": true, "requires": { "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-license-ids": "3.0.3" } }, "spdx-exceptions": { - "version": "2.1.0", + "version": "2.2.0", "bundled": true, "dev": true }, @@ -8379,12 +8031,12 @@ "bundled": true, "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.3" } }, "spdx-license-ids": { - "version": "3.0.0", + "version": "3.0.3", "bundled": true, "dev": true }, @@ -8415,16 +8067,8 @@ "bundled": true, "dev": true }, - "supports-color": { - "version": "5.4.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, "test-exclude": { - "version": "5.0.0", + "version": "5.1.0", "bundled": true, "dev": true, "requires": { @@ -8435,47 +8079,34 @@ } }, "uglify-js": { - "version": "2.8.29", + "version": "3.4.9", "bundled": true, "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "commander": "2.17.1", + "source-map": "0.6.1" }, "dependencies": { - "yargs": { - "version": "3.10.0", + "source-map": { + "version": "0.6.1", "bundled": true, "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } + "optional": true } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, "uuid": { "version": "3.3.2", "bundled": true, "dev": true }, "validate-npm-package-license": { - "version": "3.0.3", + "version": "3.0.4", "bundled": true, "dev": true, "requires": { - "spdx-correct": "3.0.0", + "spdx-correct": "3.1.0", "spdx-expression-parse": "3.0.0" } }, @@ -8492,12 +8123,6 @@ "bundled": true, "dev": true }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, "wordwrap": { "version": "0.0.3", "bundled": true, @@ -8551,17 +8176,17 @@ "dev": true }, "write-file-atomic": { - "version": "2.3.0", + "version": "2.4.2", "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", + "graceful-fs": "4.1.15", "imurmurhash": "0.1.4", "signal-exit": "3.0.2" } }, "y18n": { - "version": "3.2.1", + "version": "4.0.0", "bundled": true, "dev": true }, @@ -8571,106 +8196,44 @@ "dev": true }, "yargs": { - "version": "11.1.0", + "version": "12.0.5", "bundled": true, "dev": true, "requires": { "cliui": "4.1.0", "decamelize": "1.2.0", - "find-up": "2.1.0", + "find-up": "3.0.0", "get-caller-file": "1.0.3", - "os-locale": "2.1.0", + "os-locale": "3.1.0", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", "string-width": "2.1.1", "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" - }, - "dependencies": { - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - } + "y18n": "4.0.0", + "yargs-parser": "11.1.1" } }, "yargs-parser": { - "version": "9.0.2", + "version": "11.1.1", "bundled": true, "dev": true, "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - } + "camelcase": "5.0.0", + "decamelize": "1.2.0" } } } }, "oauth-sign": { - "version": "0.8.2", - "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "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": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { @@ -8681,7 +8244,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -8690,7 +8253,7 @@ }, "kind-of": { "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -8701,7 +8264,7 @@ }, "object-visit": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { @@ -8720,7 +8283,7 @@ }, "object.pick": { "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { @@ -8729,13 +8292,13 @@ }, "octokit-pagination-methods": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/octokit-pagination-methods/download/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha1-z0cu3J1VEFX573P25CtNu0yAvqQ=", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", "dev": true }, "on-finished": { "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { @@ -8744,7 +8307,7 @@ }, "once": { "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { @@ -8753,7 +8316,7 @@ }, "onetime": { "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { @@ -8762,25 +8325,25 @@ }, "optimist": { "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", + "minimist": "0.0.10", "wordwrap": "0.0.3" }, "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true } } }, "optionator": { "version": "0.8.2", - "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { @@ -8790,23 +8353,31 @@ "prelude-ls": "1.1.2", "type-check": "0.3.2", "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } } }, "os-locale": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz", - "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "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" + "mem": "4.1.0" } }, "os-name": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/os-name/download/os-name-3.0.0.tgz", - "integrity": "sha1-4UNNv92450tEyYtWeX2VG3ZIpdk=", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", + "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", "dev": true, "requires": { "macos-release": "2.0.0", @@ -8815,19 +8386,19 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "p-defer": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-filter": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-filter/download/p-filter-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", "dev": true, "requires": { @@ -8836,7 +8407,7 @@ }, "p-finally": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, @@ -8848,8 +8419,8 @@ }, "p-limit": { "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", - "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "1.0.0" @@ -8857,7 +8428,7 @@ }, "p-locate": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { @@ -8866,20 +8437,20 @@ }, "p-map": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-reduce": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-reduce/download/p-reduce-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", "dev": true }, "p-retry": { "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/p-retry/download/p-retry-3.0.1.tgz", - "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, "requires": { "retry": "0.12.0" @@ -8887,7 +8458,7 @@ }, "p-try": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, @@ -8902,8 +8473,8 @@ }, "parse-github-url": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/parse-github-url/download/parse-github-url-1.0.2.tgz", - "integrity": "sha1-JC07ZcvN2hS7UEOeMkKs9pcds5U=", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", "dev": true }, "parse-glob": { @@ -8946,44 +8517,50 @@ } }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, "parseurl": { "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, "pascalcase": { "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-dirname": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "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": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-is-inside": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "path-key": { "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, @@ -8995,7 +8572,7 @@ }, "path-to-regexp": { "version": "0.1.7", - "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, @@ -9010,13 +8587,13 @@ }, "pathval": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/pathval/download/pathval-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "performance-now": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, @@ -9028,79 +8605,23 @@ }, "pkg-conf": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/pkg-conf/download/pkg-conf-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { "find-up": "2.1.0", "load-json-file": "4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "pkg-dir": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { "find-up": "2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - } } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -9109,13 +8630,13 @@ }, "posix-character-classes": { "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, "prelude-ls": { "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, @@ -9127,8 +8648,8 @@ }, "process-nextick-args": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "progress": { @@ -9155,8 +8676,8 @@ }, "pump": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "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.4.1", @@ -9164,26 +8685,26 @@ } }, "punycode": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "q": { "version": "1.5.1", - "resolved": "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qs": { "version": "6.5.2", - "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "quick-lru": { "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, @@ -9214,7 +8735,7 @@ }, "range-parser": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", "dev": true }, @@ -9251,31 +8772,33 @@ "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "read-pkg": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz", + "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.4.0", + "normalize-package-data": "2.5.0", "path-type": "3.0.0" } }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "1.0.2", @@ -9285,22 +8808,11 @@ "safe-buffer": "5.1.2", "string_decoder": "1.1.1", "util-deprecate": "1.0.2" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - } } }, "redent": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/redent/download/redent-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { @@ -9310,17 +8822,17 @@ }, "redeyed": { "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/redeyed/download/redeyed-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", "dev": true, "requires": { - "esprima": "4.0.0" + "esprima": "4.0.1" } }, "regenerator-runtime": { "version": "0.12.1", - "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.12.1.tgz", - "integrity": "sha1-+hpxVEdkwDb4xJsToIsllMn4oN4=", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", "dev": true }, "regex-cache": { @@ -9372,70 +8884,76 @@ }, "repeat-string": { "version": "1.6.1", - "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "request": { - "version": "2.87.0", - "resolved": "http://registry.npm.taobao.org/request/download/request-2.87.0.tgz", - "integrity": "sha1-MvACNc0I1IK00NaNuTqCnA7VdW4=", + "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.7.0", + "aws4": "1.8.0", "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", + "combined-stream": "1.0.7", + "extend": "3.0.2", "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", + "form-data": "2.3.3", + "har-validator": "5.1.3", "http-signature": "1.2.0", "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", + "mime-types": "2.1.22", + "oauth-sign": "0.9.0", "performance-now": "2.1.0", "qs": "6.5.2", "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", + "tough-cookie": "2.4.3", "tunnel-agent": "0.6.0", "uuid": "3.3.2" } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/request-promise-native/download/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "request-promise-core": "1.1.1", + "request-promise-core": "1.1.2", "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "tough-cookie": "2.4.3" } }, "require-directory": { "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "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": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true + }, "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", @@ -9446,20 +8964,20 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "resolve-url": { "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "restore-cursor": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { @@ -9475,7 +8993,7 @@ }, "retry": { "version": "0.12.0", - "resolved": "http://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, @@ -9486,50 +9004,17 @@ "dev": true, "requires": { "glob": "7.1.3" - }, - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } } }, "rollup": { "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/rollup/download/rollup-1.1.2.tgz", - "integrity": "sha1-jQlLhWg7gQ0MBaFr12GM9w1I66c=", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.1.2.tgz", + "integrity": "sha512-OkdMxqMl8pWoQc5D8y1cIinYQPPLV8ZkfLgCzL6SytXeNA2P7UHynEQXI9tYxuAjAMsSyvRaWnyJDLHMxq0XAg==", "dev": true, "requires": { "@types/estree": "0.0.39", - "@types/node": "11.9.3", - "acorn": "6.0.5" - } - }, - "rollup-plugin-alias": { - "version": "1.5.1", - "resolved": "http://registry.npm.taobao.org/rollup-plugin-alias/download/rollup-plugin-alias-1.5.1.tgz", - "integrity": "sha1-gMzjqWe+/aWwnIarwUoEOngDW0Y=", - "dev": true, - "requires": { - "slash": "2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", - "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", - "dev": true - } + "@types/node": "11.9.4", + "acorn": "6.1.0" } }, "rollup-plugin-shim": { @@ -9549,6 +9034,39 @@ "rollup-pluginutils": "2.3.3", "tslib": "1.9.3" }, + "dependencies": { + "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.6" + } + } + } + }, + "rollup-plugin-uglify": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.2.tgz", + "integrity": "sha512-qwz2Tryspn5QGtPUowq5oumKSxANKdrnfz7C0jm4lKxvRDsNe/hSGsB9FntUul7UeC4TsZEWKErVgE1qWSO0gw==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0", + "jest-worker": "24.0.0", + "serialize-javascript": "1.6.1", + "uglify-js": "3.4.9" + } + }, + "rollup-pluginutils": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", + "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", + "dev": true, + "requires": { + "estree-walker": "0.5.2", + "micromatch": "2.3.11" + }, "dependencies": { "arr-diff": { "version": "2.0.0", @@ -9576,12 +9094,6 @@ "repeat-element": "1.1.3" } }, - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", - "dev": true - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -9644,43 +9156,12 @@ "parse-glob": "3.0.4", "regex-cache": "0.4.4" } - }, - "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.6" - } - }, - "rollup-pluginutils": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", - "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", - "dev": true, - "requires": { - "estree-walker": "0.5.2", - "micromatch": "2.3.11" - } } } }, - "rollup-plugin-uglify": { - "version": "6.0.2", - "resolved": "http://registry.npm.taobao.org/rollup-plugin-uglify/download/rollup-plugin-uglify-6.0.2.tgz", - "integrity": "sha1-aBBCz99+pOUUlxlGNE4albwncv4=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "jest-worker": "24.0.0", - "serialize-javascript": "1.6.1", - "uglify-js": "3.4.9" - } - }, "run-async": { "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { @@ -9688,9 +9169,9 @@ } }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "1.9.3" @@ -9698,13 +9179,13 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "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": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -9713,8 +9194,8 @@ }, "safer-buffer": { "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "saxes": { @@ -9728,8 +9209,8 @@ }, "semantic-release": { "version": "15.13.3", - "resolved": "http://registry.npm.taobao.org/semantic-release/download/semantic-release-15.13.3.tgz", - "integrity": "sha1-QScgucCfOfBN9nR4+kCakUEH4Fs=", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.13.3.tgz", + "integrity": "sha512-cax0xPPTtsxHlrty2HxhPql2TTvS74Ni2O8BzwFHxNY/mviVKEhI4OxHzBYJkpVxx1fMVj36+oH7IlP+SJtPNA==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "6.1.0", @@ -9748,74 +9229,41 @@ "git-log-parser": "1.2.0", "hook-std": "1.2.0", "hosted-git-info": "2.7.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "marked": "0.6.0", "marked-terminal": "3.2.0", "p-locate": "3.0.0", "p-reduce": "1.0.0", "read-pkg-up": "4.0.0", "resolve-from": "4.0.0", - "semver": "5.5.0", + "semver": "5.6.0", "signale": "1.3.0", "yargs": "12.0.5" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "2.1.1" - } - }, "find-up": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "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" } }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz", - "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, "locate-path": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "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" } }, - "ms": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, "p-limit": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.1.0.tgz", - "integrity": "sha1-HVoNIPsScHx1imVfa7xDhrWTDWg=", + "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" @@ -9823,8 +9271,8 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "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.1.0" @@ -9832,56 +9280,14 @@ }, "p-try": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-2.0.0.tgz", - "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, "read-pkg-up": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-4.0.0.tgz", - "integrity": "sha1-GyIcYIi6d5lgHICPkRYcZuWPiXg=", + "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", @@ -9890,22 +9296,22 @@ }, "resolve-from": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } }, "semver": { - "version": "5.5.0", - "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.5.0.tgz", - "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "semver-regex": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/semver-regex/download/semver-regex-2.0.0.tgz", - "integrity": "sha1-qTwsWERTmncCMzeRB7OMe0rJ0zg=", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true }, "send": { @@ -9927,12 +9333,29 @@ "on-finished": "2.3.0", "range-parser": "1.2.0", "statuses": "1.4.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "serialize-javascript": { "version": "1.6.1", - "resolved": "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.6.1.tgz", - "integrity": "sha1-TR9pfsSUKahHym9EKip1USbE2Hk=", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "serve-static": { @@ -9949,7 +9372,7 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, @@ -9984,7 +9407,7 @@ }, "shebang-command": { "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { @@ -9993,56 +9416,25 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", + "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": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "signale": { "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/signale/download/signale-1.3.0.tgz", - "integrity": "sha1-G0kXwseoaRVQrcoK0dp1CmYrRJc=", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", + "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", "dev": true, "requires": { "chalk": "2.4.2", "figures": "2.0.0", "pkg-conf": "2.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } } }, "sinon": { @@ -10053,22 +9445,11 @@ "requires": { "@sinonjs/commons": "1.3.0", "@sinonjs/formatio": "3.1.0", - "@sinonjs/samsam": "3.0.2", + "@sinonjs/samsam": "3.1.1", "diff": "3.5.0", - "lolex": "3.0.0", + "lolex": "3.1.0", "nise": "1.4.8", "supports-color": "5.5.0" - }, - "dependencies": { - "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" - } - } } }, "sinon-chai": { @@ -10077,6 +9458,12 @@ "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", "dev": true }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -10086,17 +9473,6 @@ "ansi-styles": "3.2.1", "astral-regex": "1.0.0", "is-fullwidth-code-point": "2.0.0" - }, - "dependencies": { - "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.2" - } - } } }, "snapdragon": { @@ -10115,6 +9491,15 @@ "use": "3.1.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", @@ -10132,6 +9517,12 @@ "requires": { "is-extendable": "0.1.1" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -10208,7 +9599,7 @@ }, "source-map": { "version": "0.5.7", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, @@ -10245,46 +9636,46 @@ }, "source-map-url": { "version": "0.4.0", - "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "spawn-error-forwarder": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/spawn-error-forwarder/download/spawn-error-forwarder-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.0.tgz", - "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "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-license-ids": "3.0.3" } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.1.0.tgz", - "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "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": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "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-exceptions": "2.2.0", + "spdx-license-ids": "3.0.3" } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.0.tgz", - "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split": { @@ -10316,21 +9707,21 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { - "asn1": "0.2.3", + "asn1": "0.2.4", "assert-plus": "1.0.0", "bcrypt-pbkdf": "1.0.2", "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", + "ecc-jsbn": "0.1.2", "getpass": "0.1.7", "jsbn": "0.1.1", "safer-buffer": "2.1.2", @@ -10339,7 +9730,7 @@ }, "static-extend": { "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { @@ -10349,7 +9740,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { @@ -10366,13 +9757,13 @@ }, "stealthy-require": { "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, "stream-combiner2": { "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/stream-combiner2/download/stream-combiner2-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { @@ -10382,61 +9773,53 @@ }, "string-width": { "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "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": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": "2.1.1" + "ansi-regex": "3.0.0" } }, "strip-bom": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", + "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": "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-indent": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, "strip-json-comments": { "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, @@ -10449,8 +9832,8 @@ "component-emitter": "1.2.1", "cookiejar": "2.1.2", "debug": "3.2.6", - "extend": "3.0.1", - "form-data": "2.3.2", + "extend": "3.0.2", + "form-data": "2.3.3", "formidable": "1.2.1", "methods": "1.1.2", "mime": "1.4.1", @@ -10466,12 +9849,6 @@ "requires": { "ms": "2.1.1" } - }, - "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 } } }, @@ -10485,10 +9862,19 @@ "superagent": "3.8.3" } }, + "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" + } + }, "supports-hyperlinks": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/supports-hyperlinks/download/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha1-cdrt82zBBgrFEAw1G7PaSMKcDvc=", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", "dev": true, "requires": { "has-flag": "2.0.0", @@ -10497,82 +9883,61 @@ "dependencies": { "has-flag": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - } - } } } }, "symbol-tree": { "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, "table": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", - "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", + "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", "dev": true, "requires": { - "ajv": "6.7.0", + "ajv": "6.9.1", "lodash": "4.17.11", "slice-ansi": "2.1.0", - "string-width": "2.1.1" + "string-width": "3.0.0" }, "dependencies": { - "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "emoji-regex": "7.0.3", + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "5.0.0" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "4.0.0" + } } } }, "text-encoding": { "version": "0.6.4", - "resolved": "http://registry.npm.taobao.org/text-encoding/download/text-encoding-0.6.4.tgz", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", "dev": true }, @@ -10584,20 +9949,20 @@ }, "text-table": { "version": "0.2.0", - "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", - "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "2.3.6", @@ -10613,9 +9978,15 @@ "os-tmpdir": "1.0.2" } }, + "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": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { @@ -10624,7 +9995,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { @@ -10647,7 +10018,7 @@ }, "to-regex-range": { "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { @@ -10656,52 +10027,53 @@ } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.4.tgz", - "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "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.31", "punycode": "1.4.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/tr46/download/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "2.1.1" }, "dependencies": { "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true } } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, "traverse": { "version": "0.6.6", - "resolved": "http://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, "trim-newlines": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true }, "trim-off-newlines": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/trim-off-newlines/download/trim-off-newlines-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, "trim-right": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, @@ -10718,15 +10090,45 @@ "yn": "3.0.0" } }, + "tsconfig-paths": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.8.0.tgz", + "integrity": "sha512-zZEYFo4sjORK8W58ENkRn9s+HmQFkkwydDG7My5s/fnfr2YYCaiyXe/HBUcIgU8epEKOXwiahOO+KZYjiXlWyQ==", + "dev": true, + "requires": { + "@types/json5": "0.0.29", + "deepmerge": "2.2.1", + "json5": "1.0.1", + "minimist": "1.2.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true + } + } + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, + "tsutils": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.8.0.tgz", + "integrity": "sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + }, "tunnel-agent": { "version": "0.6.0", - "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { @@ -10735,14 +10137,13 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", - "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { @@ -10762,7 +10163,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "2.1.22" } }, "typescript": { @@ -10781,12 +10182,6 @@ "source-map": "0.6.1" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10797,7 +10192,7 @@ }, "union-value": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { @@ -10809,7 +10204,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -10818,7 +10213,7 @@ }, "set-value": { "version": "0.4.3", - "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { @@ -10832,8 +10227,8 @@ }, "universal-user-agent": { "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/universal-user-agent/download/universal-user-agent-2.0.3.tgz", - "integrity": "sha1-n28J+cwz3oZ7tyDYTAgGmxSTfGw=", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.3.tgz", + "integrity": "sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g==", "dev": true, "requires": { "os-name": "3.0.0" @@ -10841,19 +10236,19 @@ }, "universalify": { "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unpipe": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, "unset-value": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { @@ -10863,7 +10258,7 @@ "dependencies": { "has-value": { "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { @@ -10874,7 +10269,7 @@ "dependencies": { "isobject": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { @@ -10885,7 +10280,7 @@ }, "has-values": { "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true } @@ -10898,25 +10293,23 @@ "dev": true, "requires": { "punycode": "2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } } }, "urix": { "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, "url-template": { "version": "2.0.8", - "resolved": "http://registry.npm.taobao.org/url-template/download/url-template-2.0.8.tgz", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", "dev": true }, @@ -10928,41 +10321,41 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "utils-merge": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, "uuid": { "version": "3.3.2", - "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", - "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", + "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.3", - "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", + "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-correct": "3.1.0", "spdx-expression-parse": "3.0.0" } }, "vary": { "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, "verror": { "version": "1.10.0", - "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { @@ -10973,7 +10366,7 @@ }, "w3c-hr-time": { "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/w3c-hr-time/download/w3c-hr-time-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { @@ -11025,8 +10418,8 @@ }, "which": { "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "2.0.0" @@ -11034,14 +10427,14 @@ }, "which-module": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "windows-release": { "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/windows-release/download/windows-release-3.1.0.tgz", - "integrity": "sha1-jUp+Jmy/WiM/bHF9rBnOAK824S4=", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", + "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", "dev": true, "requires": { "execa": "0.10.0" @@ -11049,8 +10442,8 @@ "dependencies": { "execa": { "version": "0.10.0", - "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.10.0.tgz", - "integrity": "sha1-/0Vqj1P5D47MxxqW0Rvfx/CCy1A=", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "requires": { "cross-spawn": "6.0.5", @@ -11064,21 +10457,21 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true } } }, "wordwrap": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "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": "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -11086,9 +10479,15 @@ "strip-ansi": "3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { @@ -11097,7 +10496,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { @@ -11105,28 +10504,37 @@ "is-fullwidth-code-point": "1.0.0", "strip-ansi": "3.0.1" } + }, + "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.1.1" + } } } }, "wrappy": { "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "0.5.1" } }, "ws": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", - "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", "dev": true, "requires": { "async-limiter": "1.0.0" @@ -11146,20 +10554,20 @@ }, "xtend": { "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, "y18n": { "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { "version": "12.0.5", - "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-12.0.5.tgz", - "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "4.1.0", @@ -11178,8 +10586,8 @@ "dependencies": { "find-up": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "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" @@ -11187,8 +10595,8 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "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", @@ -11197,8 +10605,8 @@ }, "p-limit": { "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.1.0.tgz", - "integrity": "sha1-HVoNIPsScHx1imVfa7xDhrWTDWg=", + "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" @@ -11206,8 +10614,8 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "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.1.0" @@ -11215,22 +10623,16 @@ }, "p-try": { "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-2.0.0.tgz", - "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true } } }, "yargs-parser": { "version": "11.1.1", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-11.1.1.tgz", - "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", + "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", @@ -11239,8 +10641,8 @@ "dependencies": { "camelcase": { "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-5.0.0.tgz", - "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I=", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true } } diff --git a/package.json b/package.json index b57e90d3e..90bd42071 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,11 @@ "version": "7.0.0", "description": "Liquid template engine by pure JavaScript: compatible to shopify, easy to extend.", "main": "dist/liquid.common.js", - "module": "src/index.js", "browser": "dist/liquid.js", - "types": "src/index.d.ts", "scripts": { "lint": "eslint src/ test/ *.js", - "unit": "mocha test/unit", - "e2e": "mocha test/e2e", + "unit": "mocha -r ts-node/register -r tsconfig-paths/register test/unit/**.ts", + "e2e": "npm run build && mocha -r ts-node/register -r tsconfig-paths/register test/e2e/**/*.ts", "test": "npm run unit && npm run e2e", "coverage": "nyc --reporter=html npm run unit", "coveralls": "nyc report --reporter=text-lcov | coveralls", @@ -42,6 +40,9 @@ "@semantic-release/git": "^7.0.8", "@semantic-release/npm": "^5.1.4", "@semantic-release/release-notes-generator": "^7.1.4", + "@types/jsdom": "^12.2.2", + "@types/mocha": "^5.2.6", + "@typescript-eslint/eslint-plugin": "^1.3.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "coveralls": "^3.0.2", @@ -60,7 +61,6 @@ "nyc": "^13.1.0", "regenerator-runtime": "^0.12.1", "rollup": "^1.1.2", - "rollup-plugin-alias": "^1.5.1", "rollup-plugin-shim": "^1.0.0", "rollup-plugin-typescript2": "^0.19.2", "rollup-plugin-uglify": "^6.0.2", @@ -69,6 +69,7 @@ "sinon-chai": "^3.3.0", "supertest": "^3.4.2", "ts-node": "^8.0.2", + "tsconfig-paths": "^3.8.0", "typescript": "^3.3.3" }, "release": { diff --git a/rollup.config.js b/rollup.config.js index 8debbc147..fb998a5cd 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,4 @@ import shim from 'rollup-plugin-shim' -import alias from 'rollup-plugin-alias' import { uglify } from 'rollup-plugin-uglify' import pkg from './package.json' import typescript from 'rollup-plugin-typescript2' @@ -15,11 +14,7 @@ const banner = `/* const treeshake = { propertyReadSideEffects: false } -const input = 'src/index.ts' -const tsOptions = { - include: [ '*.ts', '**/*.ts', '*.js', '**/*.js' ], - tsconfigOverride: { compilerOptions: { module: 'ES2015' } } -} +const input = 'src/liquid.ts' export default [{ output: [{ @@ -30,7 +25,17 @@ export default [{ banner }], external: ['path', 'fs'], - plugins: [typescript(tsOptions)], + plugins: [typescript({ + include: [ '*.ts', '**/*.ts', '*.js', '**/*.js' ], + tsconfigOverride: { compilerOptions: { + module: 'ES2015', + baseUrl: '.', + paths: { + 'template': ['src/parser/template'], + 'src/*': ['src/*'] + } + } } + })], treeshake, input }, { @@ -43,8 +48,17 @@ export default [{ }], plugins: [ shim(fake), - alias({ './template': './template-browser' }), - typescript(tsOptions) + typescript({ + include: [ '*.ts', '**/*.ts', '*.js', '**/*.js' ], + tsconfigOverride: { compilerOptions: { + module: 'ES2015', + baseUrl: '.', + paths: { + 'template': ['src/parser/template-browser'], + 'src/*': ['src/*'] + } + } } + }) ], treeshake, input @@ -57,8 +71,17 @@ export default [{ }], plugins: [ shim(fake), - alias({ './template': './template-browser' }), - typescript(tsOptions), + typescript({ + include: [ '*.ts', '**/*.ts', '*.js', '**/*.js' ], + tsconfigOverride: { compilerOptions: { + module: 'ES2015', + baseUrl: '.', + paths: { + 'template': ['src/parser/template-browser'], + 'src/*': ['src/*'] + } + } } + }), uglify() ], treeshake, diff --git a/src/builtin/filters/array.js b/src/builtin/filters/array.js new file mode 100644 index 000000000..f6f63ba25 --- /dev/null +++ b/src/builtin/filters/array.js @@ -0,0 +1,25 @@ +import { last } from 'src/util/underscore' + +export default { + 'join': (v, arg) => v.join(arg === undefined ? ' ' : arg), + 'last': v => last(v), + 'first': v => v[0], + 'map': (arr, arg) => arr.map(v => v[arg]), + 'reverse': v => v.reverse(), + 'sort': (v, arg) => v.sort(arg), + 'size': v => v.length, + 'slice': (v, begin, length) => { + if (length === undefined) length = 1 + return v.slice(begin, begin + length) + }, + 'uniq': function (arr) { + const u = {} + return (arr || []).filter(val => { + if (u.hasOwnProperty(val)) { + return false + } + u[val] = true + return true + }) + } +} diff --git a/src/builtin/filters/date.ts b/src/builtin/filters/date.ts new file mode 100644 index 000000000..06f807c28 --- /dev/null +++ b/src/builtin/filters/date.ts @@ -0,0 +1,18 @@ +import strftime from 'src/util/strftime' +import { isString } from 'src/util/underscore' + +export default { + 'date': (v, arg) => { + let date = v + if (v === 'now') { + date = new Date() + } else if (isString(v)) { + date = new Date(v) + } + return isValidDate(date) ? strftime(date, arg) : v + } +} + +function isValidDate (date) { + return date instanceof Date && !isNaN(date.getTime()) +} diff --git a/src/builtin/filters/html.ts b/src/builtin/filters/html.ts new file mode 100644 index 000000000..d2a95988e --- /dev/null +++ b/src/builtin/filters/html.ts @@ -0,0 +1,29 @@ +const escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +} +const unescapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" +} + +function escape (str) { + return String(str).replace(/&|<|>|"|'/g, m => escapeMap[m]) +} + +function unescape (str) { + return String(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]) +} + +export default { + 'escape': escape, + 'escape_once': str => escape(unescape(str)), + 'newline_to_br': v => v.replace(/\n/g, '
'), + 'strip_html': v => String(v).replace(/|||<.*?>/g, ''), +} diff --git a/src/builtin/filters/index.ts b/src/builtin/filters/index.ts new file mode 100644 index 000000000..e47aa10d8 --- /dev/null +++ b/src/builtin/filters/index.ts @@ -0,0 +1,12 @@ +import { assign } from 'src/util/underscore' +import html from './html' +import str from './string' +import math from './math' +import url from './url' +import array from './array' +import date from './date' +import obj from './object' + +const filters = assign({}, html, str, math, url, date, obj, array) + +export default filters diff --git a/src/builtin/filters/math.ts b/src/builtin/filters/math.ts new file mode 100644 index 000000000..dac56af03 --- /dev/null +++ b/src/builtin/filters/math.ts @@ -0,0 +1,26 @@ +export default { + 'abs': v => Math.abs(v), + 'ceil': v => Math.ceil(v), + 'divided_by': (v, arg) => v / arg, + 'floor': v => Math.floor(v), + 'minus': bindFixed((v, arg) => v - arg), + 'modulo': bindFixed((v, arg) => v % arg), + 'round': (v, arg) => { + const amp = Math.pow(10, arg || 0) + return Math.round(v * amp) / amp + }, + 'plus': bindFixed((v, arg) => Number(v) + Number(arg)), + 'times': (v, arg) => v * arg, +} + +function getFixed (v) { + const p = String(v).split('.') + return (p.length > 1) ? p[1].length : 0 +} + +function bindFixed (cb) { + return (l, r) => { + const f = Math.max(getFixed(l), getFixed(r)) + return cb(l, r).toFixed(f) + } +} diff --git a/src/builtin/filters/object.ts b/src/builtin/filters/object.ts new file mode 100644 index 000000000..8cc0dcccc --- /dev/null +++ b/src/builtin/filters/object.ts @@ -0,0 +1,5 @@ +import { isTruthy } from 'src/render/syntax' + +export default { + 'default': (v, arg) => isTruthy(v) ? v : arg +} diff --git a/src/builtin/filters/string.ts b/src/builtin/filters/string.ts new file mode 100644 index 000000000..76af9a59a --- /dev/null +++ b/src/builtin/filters/string.ts @@ -0,0 +1,32 @@ +export default { + 'append': (v, arg) => v + arg, + 'prepend': (v, arg) => arg + v, + 'capitalize': str => String(str).charAt(0).toUpperCase() + str.slice(1), + 'concat': (v, arg) => Array.prototype.concat.call(v, arg), + 'lstrip': v => String(v).replace(/^\s+/, ''), + 'downcase': v => v.toLowerCase(), + 'upcase': str => String(str).toUpperCase(), + 'remove': (v, arg) => v.split(arg).join(''), + 'remove_first': (v, l) => v.replace(l, ''), + 'replace': (v, pattern, replacement) => + String(v).split(pattern).join(replacement), + 'replace_first': (v, arg1, arg2) => String(v).replace(arg1, arg2), + 'rstrip': str => String(str).replace(/\s+$/, ''), + 'split': (v, arg) => String(v).split(arg), + 'strip': (v) => String(v).trim(), + 'strip_newlines': v => String(v).replace(/\n/g, ''), + 'truncate': (v, l, o) => { + v = String(v) + o = (o === undefined) ? '...' : o + l = l || 16 + if (v.length <= l) return v + return v.substr(0, l - o.length) + o + }, + 'truncatewords': (v, l, o) => { + if (o === undefined) o = '...' + const arr = v.split(' ') + let ret = arr.slice(0, l).join(' ') + if (arr.length > l) ret += o + return ret + }, +} diff --git a/src/builtin/filters/url.ts b/src/builtin/filters/url.ts new file mode 100644 index 000000000..9cedeb3d2 --- /dev/null +++ b/src/builtin/filters/url.ts @@ -0,0 +1,4 @@ +export default { + 'url_decode': x => x.split('+').map(decodeURIComponent).join(' '), + 'url_encode': x => x.split(' ').map(encodeURIComponent).join('+') +} diff --git a/src/builtin/tags/assign.ts b/src/builtin/tags/assign.ts new file mode 100644 index 000000000..0ee516490 --- /dev/null +++ b/src/builtin/tags/assign.ts @@ -0,0 +1,20 @@ +import assert from 'src/util/assert' +import { identifier } from 'src/parser/lexical' +import { AssignScope } from 'src/scope/scopes' + +const re = new RegExp(`(${identifier.source})\\s*=([^]*)`) + +export default { + parse: function (token) { + const match = token.args.match(re) + assert(match, `illegal token ${token.raw}`) + this.key = match[1] + this.value = match[2] + }, + render: function (scope) { + const ctx = new AssignScope() + ctx[this.key] = this.liquid.evalValue(this.value, scope) + scope.push(ctx) + return Promise.resolve('') + } +} diff --git a/src/builtin/tags/block.ts b/src/builtin/tags/block.ts new file mode 100644 index 000000000..38926e5ef --- /dev/null +++ b/src/builtin/tags/block.ts @@ -0,0 +1,29 @@ +import BlockMode from 'src/scope/block-mode' + +export default { + parse: function (token, remainTokens) { + const match = /\w+/.exec(token.args) + this.block = match ? match[0] : '' + + this.tpls = [] + const stream = this.liquid.parser.parseStream(remainTokens) + .on('tag:endblock', () => stream.stop()) + .on('template', tpl => this.tpls.push(tpl)) + .on('end', () => { + throw new Error(`tag ${token.raw} not closed`) + }) + stream.start() + }, + render: async function (scope) { + const childDefined = scope.blocks[this.block] + const html = childDefined !== undefined + ? childDefined + : await this.liquid.renderer.renderTemplates(this.tpls, scope) + + if (scope.blockMode === BlockMode.STORE) { + scope.blocks[this.block] = html + return '' + } + return html + } +} diff --git a/src/builtin/tags/break.ts b/src/builtin/tags/break.ts new file mode 100644 index 000000000..9501e5ae6 --- /dev/null +++ b/src/builtin/tags/break.ts @@ -0,0 +1,7 @@ +import { RenderBreakError } from 'src/util/error' + +export default { + render: async function (scope) { + throw new RenderBreakError('break') + } +} diff --git a/src/builtin/tags/capture.ts b/src/builtin/tags/capture.ts new file mode 100644 index 000000000..5ae40f551 --- /dev/null +++ b/src/builtin/tags/capture.ts @@ -0,0 +1,29 @@ +import assert from 'src/util/assert' +import { identifier } from 'src/parser/lexical' +import { CaptureScope } from 'src/scope/scopes' + +const re = new RegExp(`(${identifier.source})`) + +export default { + parse: function (tagToken, remainTokens) { + const match = tagToken.args.match(re) + assert(match, `${tagToken.args} not valid identifier`) + + this.variable = match[1] + this.templates = [] + + const stream = this.liquid.parser.parseStream(remainTokens) + stream.on('tag:endcapture', token => stream.stop()) + .on('template', tpl => this.templates.push(tpl)) + .on('end', x => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + stream.start() + }, + render: async function (scope, hash) { + const html = await this.liquid.renderer.renderTemplates(this.templates, scope) + const ctx = new CaptureScope() + ctx[this.variable] = html + scope.push(ctx) + } +} diff --git a/src/builtin/tags/case.ts b/src/builtin/tags/case.ts new file mode 100644 index 000000000..751ffe083 --- /dev/null +++ b/src/builtin/tags/case.ts @@ -0,0 +1,38 @@ +import { evalExp } from 'src/render/syntax' + +export default { + parse: function (tagToken, remainTokens) { + this.cond = tagToken.args + this.cases = [] + this.elseTemplates = [] + + let p = [] + const stream = this.liquid.parser.parseStream(remainTokens) + .on('tag:when', token => { + this.cases.push({ + val: token.args, + templates: p = [] + }) + }) + .on('tag:else', () => (p = this.elseTemplates)) + .on('tag:endcase', token => stream.stop()) + .on('template', tpl => p.push(tpl)) + .on('end', x => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + + stream.start() + }, + + render: function (scope, hash) { + for (let i = 0; i < this.cases.length; i++) { + const branch = this.cases[i] + const val = evalExp(branch.val, scope) + const cond = evalExp(this.cond, scope) + if (val === cond) { + return this.liquid.renderer.renderTemplates(branch.templates, scope) + } + } + return this.liquid.renderer.renderTemplates(this.elseTemplates, scope) + } +} diff --git a/src/builtin/tags/comment.ts b/src/builtin/tags/comment.ts new file mode 100644 index 000000000..7b03844d5 --- /dev/null +++ b/src/builtin/tags/comment.ts @@ -0,0 +1,13 @@ +export default { + parse: function (tagToken, remainTokens) { + const stream = this.liquid.parser.parseStream(remainTokens) + stream + .on('token', token => { + if (token.name === 'endcomment') stream.stop() + }) + .on('end', x => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + stream.start() + } +} diff --git a/src/builtin/tags/continue.ts b/src/builtin/tags/continue.ts new file mode 100644 index 000000000..93319c563 --- /dev/null +++ b/src/builtin/tags/continue.ts @@ -0,0 +1,7 @@ +import { RenderBreakError } from 'src/util/error' + +export default { + render: async function (scope) { + throw new RenderBreakError('continue') + } +} diff --git a/src/builtin/tags/cycle.ts b/src/builtin/tags/cycle.ts new file mode 100644 index 000000000..951da0d07 --- /dev/null +++ b/src/builtin/tags/cycle.ts @@ -0,0 +1,41 @@ +import assert from 'src/util/assert' +import { value as rValue } from 'src/parser/lexical' +import { evalValue } from 'src/render/syntax' + +const groupRE = new RegExp(`^(?:(${rValue.source})\\s*:\\s*)?(.*)$`) +const candidatesRE = new RegExp(rValue.source, 'g') + +export default { + parse: function (tagToken, remainTokens) { + let match = groupRE.exec(tagToken.args) + assert(match, `illegal tag: ${tagToken.raw}`) + + this.group = match[1] || '' + const candidates = match[2] + + this.candidates = [] + + while ((match = candidatesRE.exec(candidates))) { + this.candidates.push(match[0]) + } + assert(this.candidates.length, `empty candidates: ${tagToken.raw}`) + }, + + render: function (scope, hash) { + const group = evalValue(this.group, scope) + const fingerprint = `cycle:${group}:` + this.candidates.join(',') + + const groups = scope.opts.groups = scope.opts.groups || {} + let idx = groups[fingerprint] + + if (idx === undefined) { + idx = groups[fingerprint] = 0 + } + + const candidate = this.candidates[idx] + idx = (idx + 1) % this.candidates.length + groups[fingerprint] = idx + + return evalValue(candidate, scope) + } +} diff --git a/src/builtin/tags/decrement.ts b/src/builtin/tags/decrement.ts new file mode 100644 index 000000000..87bebfbb2 --- /dev/null +++ b/src/builtin/tags/decrement.ts @@ -0,0 +1,27 @@ +import assert from 'src/util/assert' +import { identifier } from 'src/parser/lexical' +import { CaptureScope, AssignScope, DecrementScope } from 'src/scope/scopes' + +export default { + parse: function (token) { + const match = token.args.match(identifier) + assert(match, `illegal identifier ${token.args}`) + this.variable = match[0] + }, + render: function (scope, hash) { + let context = scope.findContextFor( + this.variable, + ctx => { + return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope) + } + ) + if (!context) { + context = new DecrementScope() + scope.unshift(context) + } + if (typeof context[this.variable] !== 'number') { + context[this.variable] = 0 + } + return --context[this.variable] + } +} diff --git a/src/builtin/tags/for.ts b/src/builtin/tags/for.ts new file mode 100644 index 000000000..0d511a3b8 --- /dev/null +++ b/src/builtin/tags/for.ts @@ -0,0 +1,93 @@ +import { mapSeries } from 'src/util/promise' +import { isString, isObject, isArray } from 'src/util/underscore' +import { evalExp } from 'src/render/syntax' +import assert from 'src/util/assert' +import { identifier, value, hash } from 'src/parser/lexical' +import { RenderBreakError } from 'src/util/error' + +const re = new RegExp(`^(${identifier.source})\\s+in\\s+` + + `(${value.source})` + + `(?:\\s+${hash.source})*` + + `(?:\\s+(reversed))?` + + `(?:\\s+${hash.source})*$`) + +function parse (tagToken, remainTokens) { + const match = re.exec(tagToken.args) + assert(match, `illegal tag: ${tagToken.raw}`) + this.variable = match[1] + this.collection = match[2] + this.reversed = !!match[3] + + this.templates = [] + this.elseTemplates = [] + + let p + const stream = this.liquid.parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:else', () => (p = this.elseTemplates)) + .on('tag:endfor', () => stream.stop()) + .on('template', tpl => p.push(tpl)) + .on('end', () => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + + stream.start() +} + +async function render (scope, hash) { + let collection = evalExp(this.collection, scope) + + if (!isArray(collection)) { + if (isString(collection) && collection.length > 0) { + collection = [collection] + } else if (isObject(collection)) { + collection = Object.keys(collection).map((key) => [key, collection[key]]) + } + } + if (!isArray(collection) || !collection.length) { + return this.liquid.renderer.renderTemplates(this.elseTemplates, scope) + } + + const offset = hash.offset || 0 + const limit = (hash.limit === undefined) ? collection.length : hash.limit + + collection = collection.slice(offset, offset + limit) + if (this.reversed) collection.reverse() + + const contexts = collection.map((item, i) => { + const ctx = {} + ctx[this.variable] = item + ctx['forloop'] = { + first: i === 0, + index: i + 1, + index0: i, + last: i === collection.length - 1, + length: collection.length, + rindex: collection.length - i, + rindex0: collection.length - i - 1 + } + return ctx + }) + + let html = '' + let finished = false + await mapSeries(contexts, async context => { + if (finished) return + + scope.push(context) + try { + html += await this.liquid.renderer.renderTemplates(this.templates, scope) + } catch (e) { + if (e instanceof RenderBreakError) { + html += e.resolvedHTML + if (e.message === 'break') { + finished = true + } + } else throw e + } + scope.pop(context) + }) + return html +} + +export default { parse, render } diff --git a/src/builtin/tags/if.ts b/src/builtin/tags/if.ts new file mode 100644 index 000000000..4ce0779e4 --- /dev/null +++ b/src/builtin/tags/if.ts @@ -0,0 +1,39 @@ +import { evalExp, isTruthy } from 'src/render/syntax' + +export default { + parse: function (tagToken, remainTokens) { + this.branches = [] + this.elseTemplates = [] + + let p + const stream = this.liquid.parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + cond: tagToken.args, + templates: (p = []) + })) + .on('tag:elsif', token => { + this.branches.push({ + cond: token.args, + templates: p = [] + }) + }) + .on('tag:else', () => (p = this.elseTemplates)) + .on('tag:endif', token => stream.stop()) + .on('template', tpl => p.push(tpl)) + .on('end', x => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + + stream.start() + }, + + render: function (scope, hash) { + for (const branch of this.branches) { + const cond = evalExp(branch.cond, scope) + if (isTruthy(cond)) { + return this.liquid.renderer.renderTemplates(branch.templates, scope) + } + } + return this.liquid.renderer.renderTemplates(this.elseTemplates, scope) + } +} diff --git a/src/builtin/tags/include.ts b/src/builtin/tags/include.ts new file mode 100644 index 000000000..45d4f6298 --- /dev/null +++ b/src/builtin/tags/include.ts @@ -0,0 +1,56 @@ +import assert from 'src/util/assert' +import { value, quotedLine } from 'src/parser/lexical' +import { evalValue } from 'src/render/syntax' +import BlockMode from 'src/scope/block-mode' + +const staticFileRE = /[^\s,]+/ +const withRE = new RegExp(`with\\s+(${value.source})`) + +export default { + parse: function (token) { + let match = staticFileRE.exec(token.args) + if (match) { + this.staticValue = match[0] + } + + match = value.exec(token.args) + if (match) { + this.value = match[0] + } + + match = withRE.exec(token.args) + if (match) { + this.with = match[1] + } + }, + render: async function (scope, hash) { + let filepath + if (scope.opts.dynamicPartials) { + if (quotedLine.exec(this.value)) { + const template = this.value.slice(1, -1) + filepath = await this.liquid.parseAndRender(template, scope.getAll(), scope.opts) + } else { + filepath = evalValue(this.value, scope) + } + } else { + filepath = this.staticValue + } + assert(filepath, `cannot include with empty filename`) + + const originBlocks = scope.blocks + const originBlockMode = scope.blockMode + + scope.blocks = {} + scope.blockMode = BlockMode.OUTPUT + if (this.with) { + hash[filepath] = evalValue(this.with, scope) + } + const templates = await this.liquid.getTemplate(filepath, scope.opts.root) + scope.push(hash) + const html = await this.liquid.renderer.renderTemplates(templates, scope) + scope.pop(hash) + scope.blocks = originBlocks + scope.blockMode = originBlockMode + return html + } +} diff --git a/src/builtin/tags/increment.ts b/src/builtin/tags/increment.ts new file mode 100644 index 000000000..f0e850225 --- /dev/null +++ b/src/builtin/tags/increment.ts @@ -0,0 +1,29 @@ +import assert from 'src/util/assert' +import { identifier } from 'src/parser/lexical' +import { CaptureScope, AssignScope, IncrementScope } from 'src/scope/scopes' + +export default { + parse: function (token) { + const match = token.args.match(identifier) + assert(match, `illegal identifier ${token.args}`) + this.variable = match[0] + }, + render: function (scope, hash) { + let context = scope.findContextFor( + this.variable, + ctx => { + return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope) + } + ) + if (!context) { + context = new IncrementScope() + scope.unshift(context) + } + if (typeof context[this.variable] !== 'number') { + context[this.variable] = 0 + } + const val = context[this.variable] + context[this.variable]++ + return val + } +} diff --git a/src/builtin/tags/index.ts b/src/builtin/tags/index.ts new file mode 100644 index 000000000..87e7e08b8 --- /dev/null +++ b/src/builtin/tags/index.ts @@ -0,0 +1,21 @@ +import assign from './assign' +import For from './for' +import capture from './capture' +import Case from './case' +import comment from './comment' +import include from './include' +import decrement from './decrement' +import cycle from './cycle' +import If from './if' +import increment from './increment' +import layout from './layout' +import block from './block' +import raw from './raw' +import tablerow from './tablerow' +import unless from './unless' +import Break from './break' +import Continue from './continue' + +export default { + assign, 'for': For, capture, 'case': Case, comment, include, decrement, increment, cycle, 'if': If, layout, block, raw, tablerow, unless, 'break': Break, 'continue': Continue +} diff --git a/src/builtin/tags/layout.ts b/src/builtin/tags/layout.ts new file mode 100644 index 000000000..8fb229acf --- /dev/null +++ b/src/builtin/tags/layout.ts @@ -0,0 +1,41 @@ +import assert from 'src/util/assert' +import { value as rValue } from 'src/parser/lexical' +import { evalValue } from 'src/render/syntax' +import BlockMode from 'src/scope/block-mode' + +const staticFileRE = /\S+/ + +export default { + parse: function (token, remainTokens) { + let match = staticFileRE.exec(token.args) + if (match) { + this.staticLayout = match[0] + } + + match = rValue.exec(token.args) + if (match) { + this.layout = match[0] + } + + this.tpls = this.liquid.parser.parse(remainTokens) + }, + render: async function (scope, hash) { + const layout = scope.opts.dynamicPartials + ? evalValue(this.layout, scope) + : this.staticLayout + assert(layout, `cannot apply layout with empty filename`) + + // render the remaining tokens immediately + scope.blockMode = BlockMode.STORE + const html = await this.liquid.renderer.renderTemplates(this.tpls, scope) + if (scope.blocks[''] === undefined) { + scope.blocks[''] = html + } + const templates = await this.liquid.getTemplate(layout, scope.opts.root) + scope.push(hash) + scope.blockMode = BlockMode.OUTPUT + const partial = await this.liquid.renderer.renderTemplates(templates, scope) + scope.pop(hash) + return partial + } +} diff --git a/src/builtin/tags/raw.ts b/src/builtin/tags/raw.ts new file mode 100644 index 000000000..57f741aa7 --- /dev/null +++ b/src/builtin/tags/raw.ts @@ -0,0 +1,19 @@ +export default { + parse: function (tagToken, remainTokens) { + this.tokens = [] + + const stream = this.liquid.parser.parseStream(remainTokens) + stream + .on('token', token => { + if (token.name === 'endraw') stream.stop() + else this.tokens.push(token) + }) + .on('end', () => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + stream.start() + }, + render: function (scope, hash) { + return this.tokens.map(token => token.raw).join('') + } +} diff --git a/src/builtin/tags/tablerow.ts b/src/builtin/tags/tablerow.ts new file mode 100644 index 000000000..fcc46a9c8 --- /dev/null +++ b/src/builtin/tags/tablerow.ts @@ -0,0 +1,68 @@ +import { mapSeries } from 'src/util/promise' +import assert from 'src/util/assert' +import { evalExp } from 'src/render/syntax' +import { identifier, value, hash } from 'src/parser/lexical' + +const re = new RegExp(`^(${identifier.source})\\s+in\\s+` + + `(${value.source})` + + `(?:\\s+${hash.source})*$`) + +export default { + parse: function (tagToken, remainTokens) { + const match = re.exec(tagToken.args) + assert(match, `illegal tag: ${tagToken.raw}`) + + this.variable = match[1] + this.collection = match[2] + this.templates = [] + + let p + const stream = this.liquid.parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:endtablerow', token => stream.stop()) + .on('template', tpl => p.push(tpl)) + .on('end', () => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + + stream.start() + }, + + render: async function (scope, hash) { + let collection = evalExp(this.collection, scope) || [] + const offset = hash.offset || 0 + const limit = (hash.limit === undefined) ? collection.length : hash.limit + + collection = collection.slice(offset, offset + limit) + const cols = hash.cols || collection.length + const contexts = collection.map((item, i) => { + const ctx = {} + ctx[this.variable] = item + return ctx + }) + + let row + let html = '' + await mapSeries(contexts, async (context, idx) => { + row = Math.floor(idx / cols) + 1 + const col = (idx % cols) + 1 + if (col === 1) { + if (row !== 1) { + html += '' + } + html += `` + } + + html += `` + scope.push(context) + html += await this.liquid.renderer.renderTemplates(this.templates, scope) + html += '' + scope.pop(context) + return html + }) + if (row > 0) { + html += '' + } + return html + } +} diff --git a/src/builtin/tags/unless.ts b/src/builtin/tags/unless.ts new file mode 100644 index 000000000..a95345d9c --- /dev/null +++ b/src/builtin/tags/unless.ts @@ -0,0 +1,29 @@ +import { evalExp, isFalsy } from 'src/render/syntax' + +export default { + parse: function (tagToken, remainTokens) { + this.templates = [] + this.elseTemplates = [] + let p + const stream = this.liquid.parser.parseStream(remainTokens) + .on('start', x => { + p = this.templates + this.cond = tagToken.args + }) + .on('tag:else', () => (p = this.elseTemplates)) + .on('tag:endunless', token => stream.stop()) + .on('template', tpl => p.push(tpl)) + .on('end', x => { + throw new Error(`tag ${tagToken.raw} not closed`) + }) + + stream.start() + }, + + render: function (scope, hash) { + const cond = evalExp(this.cond, scope) + return isFalsy(cond) + ? this.liquid.renderer.renderTemplates(this.templates, scope) + : this.liquid.renderer.renderTemplates(this.elseTemplates, scope) + } +} diff --git a/src/filter.js b/src/filter.js deleted file mode 100644 index fbb2a0e67..000000000 --- a/src/filter.js +++ /dev/null @@ -1,68 +0,0 @@ -import * as lexical from './lexical' -import { evalValue } from './syntax' -import assert from './util/assert' -import { assign, create } from './util/underscore' - -const valueRE = new RegExp(`${lexical.value.source}`, 'g') - -export default function (options) { - options = assign({}, options) - let filters = {} - - const _filterInstance = { - render: function (output, scope) { - const args = this.args.map(arg => evalValue(arg, scope)) - args.unshift(output) - return this.filter.apply(null, args) - }, - parse: function (str) { - let match = lexical.filterLine.exec(str) - assert(match, 'illegal filter: ' + str) - - const name = match[1] - const argList = match[2] || '' - const filter = filters[name] - if (typeof filter !== 'function') { - if (options.strict_filters) { - throw new TypeError(`undefined filter: ${name}`) - } - this.name = name - this.filter = x => x - this.args = [] - return this - } - - const args = [] - while ((match = valueRE.exec(argList.trim()))) { - const v = match[0] - const re = new RegExp(`${v}\\s*:`, 'g') - const keyMatch = re.exec(match.input) - const currentMatchIsKey = keyMatch && keyMatch.index === match.index - currentMatchIsKey ? args.push(`'${v}'`) : args.push(v) - } - - this.name = name - this.filter = filter - this.args = args - - return this - } - } - - function construct (str) { - const instance = create(_filterInstance) - return instance.parse(str) - } - - function register (name, filter) { - filters[name] = filter - } - - function clear () { - filters = {} - } - - return { - construct, register, clear - } -} diff --git a/src/filters.js b/src/filters.js deleted file mode 100644 index 7eae2d484..000000000 --- a/src/filters.js +++ /dev/null @@ -1,139 +0,0 @@ -import strftime from './util/strftime' -import * as _ from './util/underscore' -import { isTruthy } from './syntax' - -const escapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' -} -const unescapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - ''': "'" -} - -const filters = { - 'abs': v => Math.abs(v), - 'append': (v, arg) => v + arg, - 'capitalize': str => stringify(str).charAt(0).toUpperCase() + str.slice(1), - 'ceil': v => Math.ceil(v), - 'concat': (v, arg) => Array.prototype.concat.call(v, arg), - 'date': (v, arg) => { - let date = v - if (v === 'now') { - date = new Date() - } else if (_.isString(v)) { - date = new Date(v) - } - return isValidDate(date) ? strftime(date, arg) : v - }, - 'default': (v, arg) => isTruthy(v) ? v : arg, - 'divided_by': (v, arg) => v / arg, - 'downcase': v => v.toLowerCase(), - 'escape': escape, - - 'escape_once': str => escape(unescape(str)), - 'first': v => v[0], - 'floor': v => Math.floor(v), - 'join': (v, arg) => v.join(arg === undefined ? ' ' : arg), - 'last': v => _.last(v), - 'lstrip': v => stringify(v).replace(/^\s+/, ''), - 'map': (arr, arg) => arr.map(v => v[arg]), - 'minus': bindFixed((v, arg) => v - arg), - 'modulo': bindFixed((v, arg) => v % arg), - 'newline_to_br': v => v.replace(/\n/g, '
'), - 'plus': bindFixed((v, arg) => Number(v) + Number(arg)), - 'prepend': (v, arg) => arg + v, - 'remove': (v, arg) => v.split(arg).join(''), - 'remove_first': (v, l) => v.replace(l, ''), - 'replace': (v, pattern, replacement) => - stringify(v).split(pattern).join(replacement), - 'replace_first': (v, arg1, arg2) => stringify(v).replace(arg1, arg2), - 'reverse': v => v.reverse(), - 'round': (v, arg) => { - const amp = Math.pow(10, arg || 0) - return Math.round(v * amp, arg) / amp - }, - 'rstrip': str => stringify(str).replace(/\s+$/, ''), - 'size': v => v.length, - 'slice': (v, begin, length) => { - if (length === undefined) length = 1 - return v.slice(begin, begin + length) - }, - 'sort': (v, arg) => v.sort(arg), - 'split': (v, arg) => stringify(v).split(arg), - 'strip': (v) => stringify(v).trim(), - 'strip_html': v => stringify(v).replace(/|||<.*?>/g, ''), - 'strip_newlines': v => stringify(v).replace(/\n/g, ''), - 'times': (v, arg) => v * arg, - 'truncate': (v, l, o) => { - v = stringify(v) - o = (o === undefined) ? '...' : o - l = l || 16 - if (v.length <= l) return v - return v.substr(0, l - o.length) + o - }, - 'truncatewords': (v, l, o) => { - if (o === undefined) o = '...' - const arr = v.split(' ') - let ret = arr.slice(0, l).join(' ') - if (arr.length > l) ret += o - return ret - }, - 'uniq': function (arr) { - const u = {} - return (arr || []).filter(val => { - if (u.hasOwnProperty(val)) { - return false - } - u[val] = true - return true - }) - }, - 'upcase': str => stringify(str).toUpperCase(), - 'url_decode': x => x.split('+').map(decodeURIComponent).join(' '), - 'url_encode': x => x.split(' ').map(encodeURIComponent).join('+') -} - -function escape (str) { - return stringify(str).replace(/&|<|>|"|'/g, m => escapeMap[m]) -} - -function unescape (str) { - return stringify(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]) -} - -function getFixed (v) { - const p = (v + '').split('.') - return (p.length > 1) ? p[1].length : 0 -} - -function getMaxFixed (l, r) { - return Math.max(getFixed(l), getFixed(r)) -} - -function stringify (obj) { - return obj + '' -} - -function bindFixed (cb) { - return (l, r) => { - const f = getMaxFixed(l, r) - return cb(l, r).toFixed(f) - } -} - -function isValidDate (date) { - return date instanceof Date && !isNaN(date.getTime()) -} - -export default function registerAll (liquid, Liquid) { - return _.forOwn(filters, (func, name) => liquid.registerFilter(name, func)) -} - -registerAll.filters = filters diff --git a/src/liquid-options.ts b/src/liquid-options.ts new file mode 100644 index 000000000..f4e4b9c13 --- /dev/null +++ b/src/liquid-options.ts @@ -0,0 +1,38 @@ +export interface LiquidOptions { + /** `root` is a directory or an array of directories to resolve layouts and includes, as well as the filename passed in when calling `.renderFile()`. If an array, the files are looked up in the order they occur in the array. Defaults to `["."]`*/ + root?: string | string[] + /** `extname` is used to lookup the template file when filepath doesn't include an extension name. Eg: setting to `".html"` will allow including file by basename. Defaults to `""`. */ + extname?: string + /** `cache` indicates whether or not to cache resolved templates. Defaults to `false`. */ + cache?: boolean + /** `dynamicPartials`: if set, treat `` parameter in `{%include filepath %}`, `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */ + dynamicPartials?: boolean + /** `strict_filters` is used to enable strict filter existence. If set to `false`, undefined filters will be rendered as empty string. Otherwise, undefined filters will cause an exception. Defaults to `false`. */ + strict_filters?: boolean + /** `strict_variables` is used to enable strict variable derivation. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */ + strict_variables?: boolean + /** `trim_tag_right` is used to strip blank characters (including ` `, `\t`, and `\r`) from the right of tags (`{% %}`) until `\n` (inclusive). Defaults to `false`. */ + trim_tag_right?: boolean + /** `trim_tag_left` is similar to `trim_tag_right`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ + trim_tag_left?: boolean + /** ``trim_value_right` is used to strip blank characters (including ` `, `\t`, and `\r`) from the right of values (`{{ }}`) until `\n` (inclusive). Defaults to `false`. */ + trim_value_right?: boolean + /** `trim_value_left` is similar to `trim_value_right`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ + trim_value_left?: boolean + /** `greedy` is used to specify whether `trim_left`/`trim_right` is greedy. When set to `true`, all consecutive blank characters including `\n` will be trimed regardless of line breaks. Defaults to `true`. */ + greedy?: boolean +} + +export const defaultOptions: LiquidOptions = { + root: ['.'], + cache: false, + extname: '', + dynamicPartials: true, + trim_tag_right: false, + trim_tag_left: false, + trim_value_right: false, + trim_value_left: false, + greedy: true, + strict_filters: false, + strict_variables: false +} diff --git a/src/index.ts b/src/liquid.ts similarity index 51% rename from src/index.ts rename to src/liquid.ts index 423f90798..f812a78ce 100644 --- a/src/index.ts +++ b/src/liquid.ts @@ -1,63 +1,49 @@ -import Scope from './scope' -import * as template from './template' +import Scope from './scope/scope' +import * as Types from './types' +import * as template from 'template' import * as _ from './util/underscore' -import assert from './util/assert' -import * as tokenizer from './tokenizer' -import Render from './render' -import Tag from './tag' -import Filter from './filter' -import Parser from './parser' -import { isTruthy, isFalsy, evalExp, evalValue } from './syntax' -import { ParseError, TokenizationError, RenderBreakError, AssertionError } from './util/error' -import tags from './tags/index' -import filters from './filters' +import ITemplate from './template/itemplate' +import * as tokenizer from './parser/tokenizer' +import Render from './render/render' +import Tag from './template/tag/tag' +import Filter from './template/filter' +import Parser from './parser/parser' +import Value from './template/value' +import { isTruthy, isFalsy, evalExp, evalValue } from './render/syntax' +import builtinTags from './builtin/tags' +import builtinFilters from './builtin/filters' +import { LiquidOptions, defaultOptions } from './liquid-options' export default class Liquid { + public options: LiquidOptions private cache: object - private options: any - private tags: any - private filters: any - private parser: any - private renderer: any + private parser: Parser + private renderer: Render - constructor (options) { - options = _.assign({ - root: ['.'], - cache: false, - extname: '', - dynamicPartials: true, - trim_tag_right: false, - trim_tag_left: false, - trim_value_right: false, - trim_value_left: false, - greedy: true, - strict_filters: false, - strict_variables: false - }, options) + constructor (options: LiquidOptions = {}) { + options = _.assign({}, defaultOptions, options) options.root = normalizeStringArray(options.root) if (options.cache) { this.cache = {} } this.options = options - this.tags = Tag() - this.filters = Filter(options) - this.parser = Parser(this.tags, this.filters) - this.renderer = Render() + this.parser = new Parser(this) + this.renderer = new Render() - tags(this, Liquid) - filters(this, Liquid) + _.forOwn(builtinTags, (conf, name) => this.registerTag(name, conf)) + _.forOwn(builtinFilters, (handler, name) => this.registerFilter(name, handler)) } parse(html: string, filepath?: string) { const tokens = tokenizer.parse(html, filepath, this.options) return this.parser.parse(tokens) } - render(tpl: string, ctx: any, opts: any) { + render(tpl: Array, ctx?: object, opts?: LiquidOptions) { opts = _.assign({}, this.options, opts) const scope = new Scope(ctx, opts) return this.renderer.renderTemplates(tpl, scope) } - async parseAndRender(html, ctx, opts) { + async parseAndRender(html: string, ctx?: object, opts?: LiquidOptions) { const tpl = await this.parse(html) return this.render(tpl, ctx, opts) } @@ -68,7 +54,7 @@ export default class Liquid { return this.parse(str, filepath) }) } - async renderFile(file, ctx, opts) { + async renderFile(file, ctx?: object, opts?: LiquidOptions) { opts = _.assign({}, opts) const templates = await this.getTemplate(file, opts.root) return this.render(templates, ctx, opts) @@ -84,25 +70,21 @@ export default class Liquid { } return value } - evalValue (str, scope) { - const tpl = this.parser.parseValue(str.trim()) - return this.renderer.evalValue(tpl, scope) + evalValue (str: string, scope: Scope) { + return new Value(str, this.options.strict_filters).value(scope) } registerFilter (name, filter) { - return this.filters.register(name, filter) + return Filter.register(name, filter) } registerTag (name, tag) { - return this.tags.register(name, tag) + return Tag.register(name, tag) } plugin (plugin) { return plugin.call(this, Liquid) } - express (opts) { - opts = opts || {} + express (opts: LiquidOptions = {}) { const self = this return function (filePath, ctx, cb) { - assert(_.isArray(this.root) || _.isString(this.root), - 'illegal views root, are you using express.js?') opts.root = this.root self.renderFile(filePath, ctx, opts).then(html => cb(null, html), cb) } @@ -112,16 +94,7 @@ export default class Liquid { static isFalsy = isFalsy static evalExp = evalExp static evalValue = evalValue - static Types = { - ParseError, - TokenizationError, - RenderBreakError, - AssertionError, - AssignScope: {}, - CaptureScope: {}, - IncrementScope: {}, - DecrementScope: {} - } + static Types = Types } function normalizeStringArray (value) { diff --git a/src/operators.js b/src/operators.js deleted file mode 100644 index cff09fe43..000000000 --- a/src/operators.js +++ /dev/null @@ -1,17 +0,0 @@ -export default function (isTruthy) { - return { - '==': (l, r) => l === r, - '!=': (l, r) => l !== r, - '>': (l, r) => l !== null && r !== null && l > r, - '<': (l, r) => l !== null && r !== null && l < r, - '>=': (l, r) => l !== null && r !== null && l >= r, - '<=': (l, r) => l !== null && r !== null && l <= r, - 'contains': (l, r) => { - if (!l) return false - if (typeof l.indexOf !== 'function') return false - return l.indexOf(r) > -1 - }, - 'and': (l, r) => isTruthy(l) && isTruthy(r), - 'or': (l, r) => isTruthy(l) || isTruthy(r) - } -} diff --git a/src/parser.ts b/src/parser.ts deleted file mode 100644 index 7d7862bf8..000000000 --- a/src/parser.ts +++ /dev/null @@ -1,106 +0,0 @@ -import * as lexical from './lexical' -import { ParseError } from './util/error' -import assert from './util/assert' - -export default function (Tag, Filter) { - class ParseStream { - tokens: Array - handlers: object - stopRequested: boolean - constructor (tokens) { - this.tokens = tokens - this.handlers = {} - } - on (name, cb) { - this.handlers[name] = cb - return this - } - trigger (event: string, arg?: any) { - const h = this.handlers[event] - if (typeof h === 'function') { - h(arg) - return true - } - } - start () { - this.trigger('start') - let token - while (!this.stopRequested && (token = this.tokens.shift())) { - if (this.trigger('token', token)) continue - if (token.type === 'tag' && - this.trigger(`tag:${token.name}`, token)) { - continue - } - const template = parseToken(token, this.tokens) - this.trigger('template', template) - } - if (!this.stopRequested) this.trigger('end') - return this - } - stop () { - this.stopRequested = true - return this - } - } - - function parse (tokens) { - let token - const templates = [] - while ((token = tokens.shift())) { - templates.push(parseToken(token, tokens)) - } - return templates - } - - function parseToken (token, tokens) { - try { - let tpl = null - if (token.type === 'tag') { - tpl = parseTag(token, tokens) - } else if (token.type === 'value') { - tpl = parseValue(token.value) - } else { // token.type === 'html' - tpl = token - } - tpl.token = token - return tpl - } catch (e) { - throw new ParseError(e, token) - } - } - - function parseTag (token, tokens) { - if (token.name === 'continue' || token.name === 'break') return token - return Tag.construct(token, tokens) - } - - function parseValue (str) { - let match = lexical.matchValue(str) - assert(match, `illegal value string: ${str}`) - - const initial = match[0] - str = str.substr(match.index + match[0].length) - - const filters = [] - while ((match = lexical.filter.exec(str))) { - filters.push([match[0].trim()]) - } - - return { - type: 'value', - initial: initial, - filters: filters.map(str => Filter.construct(str)) - } - } - - function parseStream (tokens) { - return new ParseStream(tokens) - } - - return { - parse, - parseTag, - parseStream, - parseValue - } -} diff --git a/src/parser/delimited-token.ts b/src/parser/delimited-token.ts new file mode 100644 index 000000000..0655a8d16 --- /dev/null +++ b/src/parser/delimited-token.ts @@ -0,0 +1,12 @@ +import Token from './token' + +export default class DelimitedToken extends Token { + trim_left: boolean + trim_right: boolean + constructor(raw, pos, input, file, line) { + super(raw, pos, input, file, line) + this.trim_left = raw[2] === '-' + this.trim_right = raw[raw.length - 3] === '-' + this.value = raw.slice(this.trim_left ? 3 : 2, this.trim_right ? -3 : -2).trim() + } +} diff --git a/src/parser/html-token.ts b/src/parser/html-token.ts new file mode 100644 index 000000000..6bfc73829 --- /dev/null +++ b/src/parser/html-token.ts @@ -0,0 +1,9 @@ +import Token from './token' + +export default class HTMLToken extends Token { + constructor(str, begin, input, file, line) { + super(str, begin, input, file, line) + this.type = 'html' + this.value = str + } +} diff --git a/src/lexical.js b/src/parser/lexical.ts similarity index 99% rename from src/lexical.js rename to src/parser/lexical.ts index 59f67ee01..dbc5af844 100644 --- a/src/lexical.js +++ b/src/parser/lexical.ts @@ -27,7 +27,7 @@ export const hash = new RegExp(`(?:${identifier.source})\\s*:\\s*(?:${value.sour export const hashCapture = new RegExp(`(${identifier.source})\\s*:\\s*(${value.source})`, 'g') // full match -export const tagLine = new RegExp(`^\\s*(${identifier.source})\\s*([\\s\\S]*)\\s*$`) +export const tagLine = new RegExp(`^\\s*(${identifier.source})\\s*([\\s\\S]*?)\\s*$`) export const literalLine = new RegExp(`^${literal.source}$`, 'i') export const variableLine = new RegExp(`^${variable.source}$`) export const numberLine = new RegExp(`^${number.source}$`) diff --git a/src/parser/output-token.ts b/src/parser/output-token.ts new file mode 100644 index 000000000..81c72c35f --- /dev/null +++ b/src/parser/output-token.ts @@ -0,0 +1,8 @@ +import DelimitedToken from './delimited-token' + +export default class OutputToken extends DelimitedToken { + constructor(raw, pos, input, file, line) { + super(raw, pos, input, file, line) + this.type = 'output' + } +} diff --git a/src/parser/parse-stream.ts b/src/parser/parse-stream.ts new file mode 100644 index 000000000..a86e97d07 --- /dev/null +++ b/src/parser/parse-stream.ts @@ -0,0 +1,47 @@ +import Token from 'src/parser/token' +import ITemplate from 'src/template/itemplate' + +type parseToken = (token: Token, remainTokens: Array) => ITemplate +type eventHandler = ((arg?: Token | ITemplate) => void) + +export default class ParseStream { + private tokens: Array + private handlers: {[key: string]: eventHandler} = {} + private stopRequested: boolean + private parseToken: parseToken + + constructor (tokens: Array, parseToken: parseToken) { + this.tokens = tokens + this.parseToken = parseToken + } + on (name: string, cb: eventHandler) { + this.handlers[name] = cb + return this + } + trigger (event: string, arg?: Token | ITemplate) { + const h = this.handlers[event] + if (typeof h === 'function') { + h(arg) + return true + } + } + start () { + this.trigger('start') + let token + while (!this.stopRequested && (token = this.tokens.shift())) { + if (this.trigger('token', token)) continue + if (token.type === 'tag' && + this.trigger(`tag:${token.name}`, token)) { + continue + } + const template = this.parseToken(token, this.tokens) + this.trigger('template', template) + } + if (!this.stopRequested) this.trigger('end') + return this + } + stop () { + this.stopRequested = true + return this + } +} diff --git a/src/parser/parser.ts b/src/parser/parser.ts new file mode 100644 index 000000000..bdc529fbe --- /dev/null +++ b/src/parser/parser.ts @@ -0,0 +1,43 @@ +import { ParseError } from '../util/error' +import Liquid from 'src/liquid' +import ParseStream from './parse-stream' +import Token from './token' +import Tag from 'src/template/tag/tag' +import HTMLToken from './html-token' +import TagToken from './tag-token' +import OutputToken from './output-token' +import Output from 'src/template/output' +import HTML from 'src/template/html' +import Value from 'src/template/value' + +export default class Parser { + liquid: Liquid + + constructor(liquid: Liquid) { + this.liquid = liquid + } + parse (tokens: Array) { + let token + const templates = [] + while ((token = tokens.shift())) { + templates.push(this.parseToken(token, tokens)) + } + return templates + } + parseToken (token: Token, remainTokens: Array) { + try { + if (token.type === 'tag') { + return new Tag(token, remainTokens, this.liquid) + } + if (token.type === 'output') { + return new Output(token, this.liquid.options.strict_filters) + } + return new HTML(token) + } catch (e) { + throw new ParseError(e, token) + } + } + parseStream (tokens: Array) { + return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens)) + } +} diff --git a/src/parser/tag-token.ts b/src/parser/tag-token.ts new file mode 100644 index 000000000..ab5dbe4c4 --- /dev/null +++ b/src/parser/tag-token.ts @@ -0,0 +1,18 @@ +import DelimitedToken from './delimited-token' +import { TokenizationError } from 'src/util/error' +import * as lexical from './lexical' + +export default class TagToken extends DelimitedToken { + name: string + args: string + constructor(raw, pos, input, file, line) { + super(raw, pos, input, file, line) + this.type = 'tag' + const match = this.value.match(lexical.tagLine) + if (!match) { + throw new TokenizationError(`illegal tag syntax`, this) + } + this.name = match[1] + this.args = match[2] + } +} diff --git a/src/template-browser.js b/src/parser/template-browser.ts similarity index 88% rename from src/template-browser.js rename to src/parser/template-browser.ts index 771943473..37aa91eb8 100644 --- a/src/template-browser.js +++ b/src/parser/template-browser.ts @@ -1,4 +1,4 @@ -import { last, isArray } from './util/underscore' +import { last, isArray } from '../util/underscore' function domResolve (root, path) { const base = document.createElement('base') @@ -33,12 +33,12 @@ export function resolve (filepath, root, options) { }) } -export async function read (url) { +export async function read (url: string): Promise { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.onload = () => { if (xhr.status >= 200 && xhr.status < 300) { - resolve(xhr.responseText) + resolve(xhr.responseText as string) } else { reject(new Error(xhr.statusText)) } diff --git a/src/template.ts b/src/parser/template.ts similarity index 90% rename from src/template.ts rename to src/parser/template.ts index fea89e271..360aec844 100644 --- a/src/template.ts +++ b/src/parser/template.ts @@ -1,6 +1,6 @@ -import * as _ from './util/underscore' +import * as _ from '../util/underscore' import * as path from 'path' -import { anySeries } from './util/promise' +import { anySeries } from '../util/promise' import * as fs from 'fs' const statFileAsync = <(filepath: string) => Promise>_.promisify(fs.stat) diff --git a/src/parser/token.ts b/src/parser/token.ts new file mode 100644 index 000000000..c8e83a846 --- /dev/null +++ b/src/parser/token.ts @@ -0,0 +1,14 @@ +export default class Token { + type: string + line: number + raw: string + input: string + file: string + value: string + constructor(raw, pos, input, file, line) { + this.line = line + this.raw = raw + this.input = input + this.file = file + } +} diff --git a/src/parser/tokenizer.ts b/src/parser/tokenizer.ts new file mode 100644 index 000000000..073a445c1 --- /dev/null +++ b/src/parser/tokenizer.ts @@ -0,0 +1,53 @@ +import whiteSpaceCtrl from './whitespace-ctrl' +import HTMLToken from './html-token' +import TagToken from './tag-token' +import OutputToken from './output-token' + +enum ParseState { HTML, OUTPUT, TAG } + +export function parse (input: string, file?: string, options?) { + const tokens = [] + let p = 0 + let line = 1 + let state = ParseState.HTML + let buffer = '' + let bufferBegin = 0 + + while(p < input.length) { + if (input[p] === '\n') line++ + const bin = input.substr(p, 2) + if (state === ParseState.HTML) { + if (bin === '{{' || bin === '{%') { + if (buffer) tokens.push(new HTMLToken(buffer, bufferBegin, input, file, line)) + buffer = bin + bufferBegin = p + p += 2 + state = bin === '{{' ? ParseState.OUTPUT : ParseState.TAG + continue + } + } + else if (state === ParseState.OUTPUT && bin === '}}') { + buffer += '}}' + tokens.push(new OutputToken(buffer, bufferBegin, input, file, line)) + p += 2 + buffer = '' + bufferBegin = p + state = ParseState.HTML + continue + } + else if (bin === '%}') { + buffer += '%}' + tokens.push(new TagToken(buffer, bufferBegin, input, file, line)) + p += 2 + buffer = '' + bufferBegin = p + state = ParseState.HTML + continue + } + buffer += input[p++] + } + if (buffer) tokens.push(new HTMLToken(buffer, bufferBegin, input, file, line)) + + whiteSpaceCtrl(tokens, options) + return tokens +} diff --git a/src/whitespace-ctrl.js b/src/parser/whitespace-ctrl.ts similarity index 78% rename from src/whitespace-ctrl.js rename to src/parser/whitespace-ctrl.ts index 26cc00a3e..39b0c33e0 100644 --- a/src/whitespace-ctrl.js +++ b/src/parser/whitespace-ctrl.ts @@ -1,4 +1,7 @@ -import { assign } from './util/underscore' +import { assign } from 'src/util/underscore' +import TagToken from './tag-token' +import OutputToken from './output-token' +import HTMLToken from './html-token' export default function whiteSpaceCtrl (tokens, options) { options = assign({ greedy: true }, options) @@ -21,13 +24,13 @@ export default function whiteSpaceCtrl (tokens, options) { function shouldTrimLeft (token, inRaw, options) { if (inRaw) return false if (token.type === 'tag') return token.trim_left || options.trim_tag_left - if (token.type === 'value') return token.trim_left || options.trim_value_left + if (token.type === 'output') return token.trim_left || options.trim_value_left } function shouldTrimRight (token, inRaw, options) { if (inRaw) return false if (token.type === 'tag') return token.trim_right || options.trim_tag_right - if (token.type === 'value') return token.trim_right || options.trim_value_right + if (token.type === 'output') return token.trim_right || options.trim_value_right } function trimLeft (token, greedy) { diff --git a/src/render.js b/src/render.js deleted file mode 100644 index 16b90e1c9..000000000 --- a/src/render.js +++ /dev/null @@ -1,62 +0,0 @@ -import { evalExp } from './syntax' -import { RenderBreakError, RenderError } from './util/error' -import { stringify, create } from './util/underscore' -import assert from './util/assert' - -const render = { - renderTemplates: async function (templates, scope) { - assert(scope, 'unable to evalTemplates: scope undefined') - - let html = '' - for (const tpl of templates) { - try { - html += await renderTemplate.call(this, tpl) - } catch (e) { - if (e instanceof RenderBreakError) { - e.resolvedHTML = html - throw e - } - throw e instanceof RenderError ? e : new RenderError(e, tpl) - } - } - return html - - async function renderTemplate (template) { - if (template.type === 'tag') { - const partial = await this.renderTag(template, scope) - return partial === undefined ? '' : partial - } - if (template.type === 'value') { - return this.renderValue(template, scope) - } - return template.value - } - }, - - renderTag: async function (template, scope) { - if (template.name === 'continue') { - throw new RenderBreakError('continue') - } - if (template.name === 'break') { - throw new RenderBreakError('break') - } - return template.render(scope) - }, - - renderValue: async function (template, scope) { - const partial = this.evalValue(template, scope) - return partial === undefined ? '' : stringify(partial) - }, - - evalValue: function (template, scope) { - assert(scope, 'unable to evalValue: scope undefined') - return template.filters.reduce( - (prev, filter) => filter.render(prev, scope), - evalExp(template.initial, scope)) - } -} - -export default function () { - const instance = create(render) - return instance -} diff --git a/src/render/render.ts b/src/render/render.ts new file mode 100644 index 000000000..052b9f855 --- /dev/null +++ b/src/render/render.ts @@ -0,0 +1,24 @@ +import { stringify, create } from 'src/util/underscore' +import { RenderBreakError, RenderError } from 'src/util/error' +import assert from 'src/util/assert' +import Scope from 'src/scope/scope' + +export default class Render { + async renderTemplates (templates, scope) { + assert(scope, 'unable to evalTemplates: scope undefined') + + let html = '' + for (const tpl of templates) { + try { + html += await tpl.render(scope) + } catch (e) { + if (e instanceof RenderBreakError) { + e.resolvedHTML = html + throw e + } + throw e instanceof RenderError ? e : new RenderError(e, tpl) + } + } + return html + } +} diff --git a/src/syntax.js b/src/render/syntax.ts similarity index 68% rename from src/syntax.js rename to src/render/syntax.ts index 65cd95826..f4742ec44 100644 --- a/src/syntax.js +++ b/src/render/syntax.ts @@ -1,8 +1,21 @@ -import Operators from './operators' -import * as lexical from './lexical' -import assert from './util/assert' +import * as lexical from '../parser/lexical' +import assert from '../util/assert' -const operators = Operators(isTruthy) +const operators = { + '==': (l, r) => l === r, + '!=': (l, r) => l !== r, + '>': (l, r) => l !== null && r !== null && l > r, + '<': (l, r) => l !== null && r !== null && l < r, + '>=': (l, r) => l !== null && r !== null && l >= r, + '<=': (l, r) => l !== null && r !== null && l <= r, + 'contains': (l, r) => { + if (!l) return false + if (typeof l.indexOf !== 'function') return false + return l.indexOf(r) > -1 + }, + 'and': (l, r) => isTruthy(l) && isTruthy(r), + 'or': (l, r) => isTruthy(l) || isTruthy(r) +} export function evalExp (exp, scope) { assert(scope, 'unable to evalExp: scope undefined') diff --git a/src/scope/block-mode.ts b/src/scope/block-mode.ts new file mode 100644 index 000000000..78fd32144 --- /dev/null +++ b/src/scope/block-mode.ts @@ -0,0 +1,8 @@ +enum BlockMode { + /* store rendered html into blocks */ + OUTPUT, + /* output rendered html directly */ + STORE +} + +export default BlockMode diff --git a/src/scope.ts b/src/scope/scope.ts similarity index 86% rename from src/scope.ts rename to src/scope/scope.ts index 7757e9331..8a44eecac 100644 --- a/src/scope.ts +++ b/src/scope/scope.ts @@ -1,38 +1,32 @@ -import * as _ from './util/underscore' -import * as lexical from './lexical' -import assert from './util/assert' - -interface ScopeOptions { - dynamicPartials: boolean - strict_variables: boolean - strict_filters: boolean - blocks: object - root: Array -} +import * as _ from '../util/underscore' +import * as lexical from '../parser/lexical' +import assert from '../util/assert' +import { LiquidOptions, defaultOptions } from '../liquid-options' +import BlockMode from './block-mode' export default class Scope { - opts: ScopeOptions + opts: LiquidOptions contexts: Array - constructor (ctx = {}, opts?: any) { - const defaultOptions: ScopeOptions = { + blocks: object = {} + blockMode: BlockMode = BlockMode.OUTPUT + constructor (ctx: object = {}, opts: LiquidOptions = defaultOptions) { + this.opts = _.assign({ dynamicPartials: true, strict_variables: false, strict_filters: false, - blocks: {}, root: [] - } - this.opts = _.assign(defaultOptions, opts) + } , opts) this.contexts = [ctx || {}] } getAll () { return this.contexts.reduce((ctx, val) => _.assign(ctx, val), _.create(null)) } - get (path) { + get (path: string): any { const paths = this.propertyAccessSeq(path) const scope = this.findContextFor(paths[0]) || _.last(this.contexts) return paths.reduce((value, key) => this.readProperty(value, key), scope) } - set (path, v) { + set (path: string, v: any): void { const paths = this.propertyAccessSeq(path) let scope = this.findContextFor(paths[0]) || _.last(this.contexts) paths.some((key, i) => { @@ -49,13 +43,13 @@ export default class Scope { scope = scope[key] }) } - unshift (ctx) { + unshift (ctx: object): any { return this.contexts.unshift(ctx) } - push (ctx) { + push (ctx: object): any { return this.contexts.push(ctx) } - pop (ctx) { + pop (ctx?: object): object { if (!arguments.length) { return this.contexts.pop() } @@ -65,7 +59,7 @@ export default class Scope { } return this.contexts.splice(i, 1)[0] } - findContextFor (key, filter = (arg => true)) { + findContextFor (key: string, filter = (arg => true)) { for (let i = this.contexts.length - 1; i >= 0; i--) { const candidate = this.contexts[i] if (!filter(candidate)) continue diff --git a/src/scope/scopes.ts b/src/scope/scopes.ts new file mode 100644 index 000000000..18ee43ff0 --- /dev/null +++ b/src/scope/scopes.ts @@ -0,0 +1,4 @@ +export class CaptureScope {} +export class AssignScope {} +export class IncrementScope {} +export class DecrementScope {} diff --git a/src/tag.js b/src/tag.js deleted file mode 100644 index 08e60c695..000000000 --- a/src/tag.js +++ /dev/null @@ -1,63 +0,0 @@ -import { hashCapture } from './lexical' -import { create } from './util/underscore' -import { evalValue } from './syntax' -import assert from './util/assert' - -function hash (markup, scope) { - const obj = {} - let match - hashCapture.lastIndex = 0 - while ((match = hashCapture.exec(markup))) { - const k = match[1] - const v = match[2] - obj[k] = evalValue(v, scope) - } - return obj -} - -export default function () { - let tagImpls = {} - - const _tagInstance = { - render: async function (scope) { - const obj = hash(this.token.args, scope) - const impl = this.tagImpl - if (typeof impl.render !== 'function') { - return '' - } - return impl.render(scope, obj) - }, - parse: function (token, tokens) { - this.type = 'tag' - this.token = token - this.name = token.name - - const tagImpl = tagImpls[this.name] - assert(tagImpl, `tag ${this.name} not found`) - this.tagImpl = create(tagImpl) - if (this.tagImpl.parse) { - this.tagImpl.parse(token, tokens) - } - } - } - - function register (name, tag) { - tagImpls[name] = tag - } - - function construct (token, tokens) { - const instance = create(_tagInstance) - instance.parse(token, tokens) - return instance - } - - function clear () { - tagImpls = {} - } - - return { - construct, - register, - clear - } -} diff --git a/src/tags/assign.js b/src/tags/assign.js deleted file mode 100644 index a8e3298f8..000000000 --- a/src/tags/assign.js +++ /dev/null @@ -1,23 +0,0 @@ -import assert from '../util/assert' -import { identifier } from '../lexical' -import { create } from '../util/underscore' - -export default function (liquid, Liquid) { - const re = new RegExp(`(${identifier.source})\\s*=([^]*)`) - const { AssignScope } = Liquid.Types - - liquid.registerTag('assign', { - parse: function (token) { - const match = token.args.match(re) - assert(match, `illegal token ${token.raw}`) - this.key = match[1] - this.value = match[2] - }, - render: function (scope) { - const ctx = create(AssignScope) - ctx[this.key] = liquid.evalValue(this.value, scope) - scope.push(ctx) - return Promise.resolve('') - } - }) -} diff --git a/src/tags/capture.js b/src/tags/capture.js deleted file mode 100644 index 2fba98958..000000000 --- a/src/tags/capture.js +++ /dev/null @@ -1,32 +0,0 @@ -import assert from '../util/assert' -import { create } from '../util/underscore' -import { identifier } from '../lexical' - -export default function (liquid, Liquid) { - const re = new RegExp(`(${identifier.source})`) - const { CaptureScope } = Liquid.Types - - liquid.registerTag('capture', { - parse: function (tagToken, remainTokens) { - const match = tagToken.args.match(re) - assert(match, `${tagToken.args} not valid identifier`) - - this.variable = match[1] - this.templates = [] - - const stream = liquid.parser.parseStream(remainTokens) - stream.on('tag:endcapture', token => stream.stop()) - .on('template', tpl => this.templates.push(tpl)) - .on('end', x => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - stream.start() - }, - render: async function (scope, hash) { - const html = await liquid.renderer.renderTemplates(this.templates, scope) - const ctx = create(CaptureScope) - ctx[this.variable] = html - scope.push(ctx) - } - }) -} diff --git a/src/tags/case.js b/src/tags/case.js deleted file mode 100644 index 259d56ba9..000000000 --- a/src/tags/case.js +++ /dev/null @@ -1,39 +0,0 @@ -export default function (liquid, Liquid) { - liquid.registerTag('case', { - - parse: function (tagToken, remainTokens) { - this.cond = tagToken.args - this.cases = [] - this.elseTemplates = [] - - let p = [] - const stream = liquid.parser.parseStream(remainTokens) - .on('tag:when', token => { - this.cases.push({ - val: token.args, - templates: p = [] - }) - }) - .on('tag:else', () => (p = this.elseTemplates)) - .on('tag:endcase', token => stream.stop()) - .on('template', tpl => p.push(tpl)) - .on('end', x => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - - stream.start() - }, - - render: function (scope, hash) { - for (let i = 0; i < this.cases.length; i++) { - const branch = this.cases[i] - const val = Liquid.evalExp(branch.val, scope) - const cond = Liquid.evalExp(this.cond, scope) - if (val === cond) { - return liquid.renderer.renderTemplates(branch.templates, scope) - } - } - return liquid.renderer.renderTemplates(this.elseTemplates, scope) - } - }) -} diff --git a/src/tags/comment.js b/src/tags/comment.js deleted file mode 100644 index 795202831..000000000 --- a/src/tags/comment.js +++ /dev/null @@ -1,15 +0,0 @@ -export default function (liquid) { - liquid.registerTag('comment', { - parse: function (tagToken, remainTokens) { - const stream = liquid.parser.parseStream(remainTokens) - stream - .on('token', token => { - if (token.name === 'endcomment') stream.stop() - }) - .on('end', x => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - stream.start() - } - }) -} diff --git a/src/tags/cycle.js b/src/tags/cycle.js deleted file mode 100644 index 17c377688..000000000 --- a/src/tags/cycle.js +++ /dev/null @@ -1,43 +0,0 @@ -import assert from '../util/assert' -import { value as rValue } from '../lexical' - -export default function (liquid, Liquid) { - const groupRE = new RegExp(`^(?:(${rValue.source})\\s*:\\s*)?(.*)$`) - const candidatesRE = new RegExp(rValue.source, 'g') - - liquid.registerTag('cycle', { - - parse: function (tagToken, remainTokens) { - let match = groupRE.exec(tagToken.args) - assert(match, `illegal tag: ${tagToken.raw}`) - - this.group = match[1] || '' - const candidates = match[2] - - this.candidates = [] - - while ((match = candidatesRE.exec(candidates))) { - this.candidates.push(match[0]) - } - assert(this.candidates.length, `empty candidates: ${tagToken.raw}`) - }, - - render: function (scope, hash) { - const group = Liquid.evalValue(this.group, scope) - const fingerprint = `cycle:${group}:` + this.candidates.join(',') - - const groups = scope.opts.groups = scope.opts.groups || {} - let idx = groups[fingerprint] - - if (idx === undefined) { - idx = groups[fingerprint] = 0 - } - - const candidate = this.candidates[idx] - idx = (idx + 1) % this.candidates.length - groups[fingerprint] = idx - - return Liquid.evalValue(candidate, scope) - } - }) -} diff --git a/src/tags/decrement.js b/src/tags/decrement.js deleted file mode 100644 index f696f53a5..000000000 --- a/src/tags/decrement.js +++ /dev/null @@ -1,32 +0,0 @@ -import { create } from '../util/underscore' -import assert from '../util/assert' -import { identifier } from '../lexical' - -export default function (liquid, Liquid) { - const { CaptureScope, AssignScope, DecrementScope } = Liquid.Types - - liquid.registerTag('decrement', { - parse: function (token) { - const match = token.args.match(identifier) - assert(match, `illegal identifier ${token.args}`) - this.variable = match[0] - }, - render: function (scope, hash) { - let context = scope.findContextFor( - this.variable, - ctx => { - const proto = Object.getPrototypeOf(ctx) - return proto !== CaptureScope && proto !== AssignScope - } - ) - if (!context) { - context = create(DecrementScope) - scope.unshift(context) - } - if (typeof context[this.variable] !== 'number') { - context[this.variable] = 0 - } - return --context[this.variable] - } - }) -} diff --git a/src/tags/for.js b/src/tags/for.js deleted file mode 100644 index d14c436f9..000000000 --- a/src/tags/for.js +++ /dev/null @@ -1,93 +0,0 @@ -import { mapSeries } from '../util/promise' -import { isString, isObject, isArray } from '../util/underscore' -import assert from '../util/assert' -import { identifier, value, hash } from '../lexical' - -export default function (liquid, Liquid) { - const RenderBreakError = Liquid.Types.RenderBreakError - const re = new RegExp(`^(${identifier.source})\\s+in\\s+` + - `(${value.source})` + - `(?:\\s+${hash.source})*` + - `(?:\\s+(reversed))?` + - `(?:\\s+${hash.source})*$`) - - liquid.registerTag('for', { parse, render }) - - function parse (tagToken, remainTokens) { - const match = re.exec(tagToken.args) - assert(match, `illegal tag: ${tagToken.raw}`) - this.variable = match[1] - this.collection = match[2] - this.reversed = !!match[3] - - this.templates = [] - this.elseTemplates = [] - - let p - const stream = liquid.parser.parseStream(remainTokens) - .on('start', () => (p = this.templates)) - .on('tag:else', () => (p = this.elseTemplates)) - .on('tag:endfor', () => stream.stop()) - .on('template', tpl => p.push(tpl)) - .on('end', () => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - - stream.start() - } - async function render (scope, hash) { - let collection = Liquid.evalExp(this.collection, scope) - - if (!isArray(collection)) { - if (isString(collection) && collection.length > 0) { - collection = [collection] - } else if (isObject(collection)) { - collection = Object.keys(collection).map((key) => [key, collection[key]]) - } - } - if (!isArray(collection) || !collection.length) { - return liquid.renderer.renderTemplates(this.elseTemplates, scope) - } - - const offset = hash.offset || 0 - const limit = (hash.limit === undefined) ? collection.length : hash.limit - - collection = collection.slice(offset, offset + limit) - if (this.reversed) collection.reverse() - - const contexts = collection.map((item, i) => { - const ctx = {} - ctx[this.variable] = item - ctx.forloop = { - first: i === 0, - index: i + 1, - index0: i, - last: i === collection.length - 1, - length: collection.length, - rindex: collection.length - i, - rindex0: collection.length - i - 1 - } - return ctx - }) - - let html = '' - let finished = false - await mapSeries(contexts, async context => { - if (finished) return - - scope.push(context) - try { - html += await liquid.renderer.renderTemplates(this.templates, scope) - } catch (e) { - if (e instanceof RenderBreakError) { - html += e.resolvedHTML - if (e.message === 'break') { - finished = true - } - } else throw e - } - scope.pop(context) - }) - return html - } -} diff --git a/src/tags/if.js b/src/tags/if.js deleted file mode 100644 index 716007a87..000000000 --- a/src/tags/if.js +++ /dev/null @@ -1,40 +0,0 @@ -export default function (liquid, Liquid) { - liquid.registerTag('if', { - - parse: function (tagToken, remainTokens) { - this.branches = [] - this.elseTemplates = [] - - let p - const stream = liquid.parser.parseStream(remainTokens) - .on('start', () => this.branches.push({ - cond: tagToken.args, - templates: (p = []) - })) - .on('tag:elsif', token => { - this.branches.push({ - cond: token.args, - templates: p = [] - }) - }) - .on('tag:else', () => (p = this.elseTemplates)) - .on('tag:endif', token => stream.stop()) - .on('template', tpl => p.push(tpl)) - .on('end', x => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - - stream.start() - }, - - render: function (scope, hash) { - for (const branch of this.branches) { - const cond = Liquid.evalExp(branch.cond, scope) - if (Liquid.isTruthy(cond)) { - return liquid.renderer.renderTemplates(branch.templates, scope) - } - } - return liquid.renderer.renderTemplates(this.elseTemplates, scope) - } - }) -} diff --git a/src/tags/include.js b/src/tags/include.js deleted file mode 100644 index af57801f5..000000000 --- a/src/tags/include.js +++ /dev/null @@ -1,57 +0,0 @@ -import assert from '../util/assert' -import { value, quotedLine } from '../lexical' - -const staticFileRE = /[^\s,]+/ - -export default function (liquid, Liquid) { - const withRE = new RegExp(`with\\s+(${value.source})`) - - liquid.registerTag('include', { - parse: function (token) { - let match = staticFileRE.exec(token.args) - if (match) { - this.staticValue = match[0] - } - - match = value.exec(token.args) - if (match) { - this.value = match[0] - } - - match = withRE.exec(token.args) - if (match) { - this.with = match[1] - } - }, - render: async function (scope, hash) { - let filepath - if (scope.opts.dynamicPartials) { - if (quotedLine.exec(this.value)) { - const template = this.value.slice(1, -1) - filepath = await liquid.parseAndRender(template, scope.getAll(), scope.opts) - } else { - filepath = Liquid.evalValue(this.value, scope) - } - } else { - filepath = this.staticValue - } - assert(filepath, `cannot include with empty filename`) - - const originBlocks = scope.opts.blocks - const originBlockMode = scope.opts.blockMode - - scope.opts.blocks = {} - scope.opts.blockMode = 'output' - if (this.with) { - hash[filepath] = Liquid.evalValue(this.with, scope) - } - const templates = await liquid.getTemplate(filepath, scope.opts.root) - scope.push(hash) - const html = await liquid.renderer.renderTemplates(templates, scope) - scope.pop(hash) - scope.opts.blocks = originBlocks - scope.opts.blockMode = originBlockMode - return html - } - }) -} diff --git a/src/tags/increment.js b/src/tags/increment.js deleted file mode 100644 index b8781865f..000000000 --- a/src/tags/increment.js +++ /dev/null @@ -1,34 +0,0 @@ -import assert from '../util/assert' -import { create } from '../util/underscore' -import { identifier } from '../lexical' - -export default function (liquid, Liquid) { - const { CaptureScope, AssignScope, IncrementScope } = Liquid.Types - - liquid.registerTag('increment', { - parse: function (token) { - const match = token.args.match(identifier) - assert(match, `illegal identifier ${token.args}`) - this.variable = match[0] - }, - render: function (scope, hash) { - let context = scope.findContextFor( - this.variable, - ctx => { - const proto = Object.getPrototypeOf(ctx) - return proto !== CaptureScope && proto !== AssignScope - } - ) - if (!context) { - context = create(IncrementScope) - scope.unshift(context) - } - if (typeof context[this.variable] !== 'number') { - context[this.variable] = 0 - } - const val = context[this.variable] - context[this.variable]++ - return val - } - }) -} diff --git a/src/tags/index.js b/src/tags/index.js deleted file mode 100644 index f07a6415e..000000000 --- a/src/tags/index.js +++ /dev/null @@ -1,31 +0,0 @@ -import For from './for' -import Assign from './assign' -import Capture from './capture' -import Case from './case' -import Comment from './comment' -import Include from './include' -import Decrement from './decrement' -import Cycle from './cycle' -import If from './if' -import Increment from './increment' -import Layout from './layout' -import Raw from './raw' -import Tablerow from './tablerow' -import Unless from './unless' - -export default function (engine, Liquid) { - Assign(engine, Liquid) - Capture(engine, Liquid) - Case(engine, Liquid) - Comment(engine, Liquid) - Cycle(engine, Liquid) - Decrement(engine, Liquid) - For(engine, Liquid) - If(engine, Liquid) - Include(engine, Liquid) - Increment(engine, Liquid) - Layout(engine, Liquid) - Raw(engine, Liquid) - Tablerow(engine, Liquid) - Unless(engine, Liquid) -} diff --git a/src/tags/layout.js b/src/tags/layout.js deleted file mode 100644 index 694300ea7..000000000 --- a/src/tags/layout.js +++ /dev/null @@ -1,75 +0,0 @@ -import assert from '../util/assert' -import { value as rValue } from '../lexical' - -/* - * blockMode: - * * "store": store rendered html into blocks - * * "output": output rendered html - */ - -export default function (liquid, Liquid) { - const staticFileRE = /\S+/ - - liquid.registerTag('layout', { - parse: function (token, remainTokens) { - let match = staticFileRE.exec(token.args) - if (match) { - this.staticLayout = match[0] - } - - match = rValue.exec(token.args) - if (match) { - this.layout = match[0] - } - - this.tpls = liquid.parser.parse(remainTokens) - }, - render: async function (scope, hash) { - const layout = scope.opts.dynamicPartials - ? Liquid.evalValue(this.layout, scope) - : this.staticLayout - assert(layout, `cannot apply layout with empty filename`) - - // render the remaining tokens immediately - scope.opts.blockMode = 'store' - const html = await liquid.renderer.renderTemplates(this.tpls, scope) - if (scope.opts.blocks[''] === undefined) { - scope.opts.blocks[''] = html - } - const templates = await liquid.getTemplate(layout, scope.opts.root) - scope.push(hash) - scope.opts.blockMode = 'output' - const partial = await liquid.renderer.renderTemplates(templates, scope) - scope.pop(hash) - return partial - } - }) - - liquid.registerTag('block', { - parse: function (token, remainTokens) { - const match = /\w+/.exec(token.args) - this.block = match ? match[0] : '' - - this.tpls = [] - const stream = liquid.parser.parseStream(remainTokens) - .on('tag:endblock', () => stream.stop()) - .on('template', tpl => this.tpls.push(tpl)) - .on('end', () => { - throw new Error(`tag ${token.raw} not closed`) - }) - stream.start() - }, - render: async function (scope) { - const childDefined = scope.opts.blocks[this.block] - const html = childDefined !== undefined - ? childDefined - : await liquid.renderer.renderTemplates(this.tpls, scope) - - if (scope.opts.blockMode === 'store') { - scope.opts.blocks[this.block] = html - return '' - } - return html - } - }) -} diff --git a/src/tags/raw.js b/src/tags/raw.js deleted file mode 100644 index 239c9f63c..000000000 --- a/src/tags/raw.js +++ /dev/null @@ -1,21 +0,0 @@ -export default function (liquid) { - liquid.registerTag('raw', { - parse: function (tagToken, remainTokens) { - this.tokens = [] - - const stream = liquid.parser.parseStream(remainTokens) - stream - .on('token', token => { - if (token.name === 'endraw') stream.stop() - else this.tokens.push(token) - }) - .on('end', () => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - stream.start() - }, - render: function (scope, hash) { - return this.tokens.map(token => token.raw).join('') - } - }) -} diff --git a/src/tags/tablerow.js b/src/tags/tablerow.js deleted file mode 100644 index d41234318..000000000 --- a/src/tags/tablerow.js +++ /dev/null @@ -1,70 +0,0 @@ -import { mapSeries } from '../util/promise' -import assert from '../util/assert' -import { identifier, value, hash } from '../lexical' - -export default function (liquid, Liquid) { - const re = new RegExp(`^(${identifier.source})\\s+in\\s+` + - `(${value.source})` + - `(?:\\s+${hash.source})*$`) - - liquid.registerTag('tablerow', { - - parse: function (tagToken, remainTokens) { - const match = re.exec(tagToken.args) - assert(match, `illegal tag: ${tagToken.raw}`) - - this.variable = match[1] - this.collection = match[2] - this.templates = [] - - let p - const stream = liquid.parser.parseStream(remainTokens) - .on('start', () => (p = this.templates)) - .on('tag:endtablerow', token => stream.stop()) - .on('template', tpl => p.push(tpl)) - .on('end', () => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - - stream.start() - }, - - render: async function (scope, hash) { - let collection = Liquid.evalExp(this.collection, scope) || [] - const offset = hash.offset || 0 - const limit = (hash.limit === undefined) ? collection.length : hash.limit - - collection = collection.slice(offset, offset + limit) - const cols = hash.cols || collection.length - const contexts = collection.map((item, i) => { - const ctx = {} - ctx[this.variable] = item - return ctx - }) - - let row - let html = '' - await mapSeries(contexts, async (context, idx) => { - row = Math.floor(idx / cols) + 1 - const col = (idx % cols) + 1 - if (col === 1) { - if (row !== 1) { - html += '' - } - html += `` - } - - html += `` - scope.push(context) - html += await liquid.renderer.renderTemplates(this.templates, scope) - html += '' - scope.pop(context) - return html - }) - if (row > 0) { - html += '' - } - return html - } - }) -} diff --git a/src/tags/unless.js b/src/tags/unless.js deleted file mode 100644 index 11d853651..000000000 --- a/src/tags/unless.js +++ /dev/null @@ -1,29 +0,0 @@ -export default function (liquid, Liquid) { - liquid.registerTag('unless', { - parse: function (tagToken, remainTokens) { - this.templates = [] - this.elseTemplates = [] - let p - const stream = liquid.parser.parseStream(remainTokens) - .on('start', x => { - p = this.templates - this.cond = tagToken.args - }) - .on('tag:else', () => (p = this.elseTemplates)) - .on('tag:endunless', token => stream.stop()) - .on('template', tpl => p.push(tpl)) - .on('end', x => { - throw new Error(`tag ${tagToken.raw} not closed`) - }) - - stream.start() - }, - - render: function (scope, hash) { - const cond = Liquid.evalExp(this.cond, scope) - return Liquid.isFalsy(cond) - ? liquid.renderer.renderTemplates(this.templates, scope) - : liquid.renderer.renderTemplates(this.elseTemplates, scope) - } - }) -} diff --git a/src/template/filter.ts b/src/template/filter.ts new file mode 100644 index 000000000..4ace21dd1 --- /dev/null +++ b/src/template/filter.ts @@ -0,0 +1,51 @@ +import assert from 'src/util/assert' +import * as lexical from 'src/parser/lexical' +import { evalValue } from 'src/render/syntax' +import Scope from 'src/scope/scope' + +type impl = (value: any, ...args: any[]) => any + +const valueRE = new RegExp(`${lexical.value.source}`, 'g') + +export default class Filter { + name: string + impl: impl + args: string[] + private static impls: {[key: string]: impl} = {} + + constructor (str: string, strict_filters: boolean = false) { + let match = lexical.filterLine.exec(str) + assert(match, 'illegal filter: ' + str) + + const name = match[1] + const argList = match[2] || '' + const impl = Filter.impls[name] + if (!impl && strict_filters) throw new TypeError(`undefined filter: ${name}`) + + this.name = name + this.impl = impl || (x => x) + this.args = this.parseArgs(argList) + } + parseArgs (argList: string): string[] { + let match, args = [] + while ((match = valueRE.exec(argList.trim()))) { + const v = match[0] + const re = new RegExp(`${v}\\s*:`, 'g') + const keyMatch = re.exec(match.input) + const currentMatchIsKey = keyMatch && keyMatch.index === match.index + currentMatchIsKey ? args.push(`'${v}'`) : args.push(v) + } + return args + } + render (value: any, scope: Scope): any { + const args = this.args.map(arg => evalValue(arg, scope)) + args.unshift(value) + return this.impl.apply(null, args) + } + static register(name, filter) { + Filter.impls[name] = filter + } + static clear () { + Filter.impls = {} + } +} diff --git a/src/template/html.ts b/src/template/html.ts new file mode 100644 index 000000000..5902a4921 --- /dev/null +++ b/src/template/html.ts @@ -0,0 +1,15 @@ +import Template from 'src/template/template' +import Scope from 'src/scope/scope' +import ITemplate from 'src/template/itemplate' +import Token from 'src/parser/token' + +export default class extends Template implements ITemplate { + str: string + constructor(token: Token) { + super(token) + this.str = token.value + } + async render(scope: Scope): Promise { + return this.str + } +} diff --git a/src/template/itemplate.ts b/src/template/itemplate.ts new file mode 100644 index 000000000..4a214c828 --- /dev/null +++ b/src/template/itemplate.ts @@ -0,0 +1,7 @@ +import Scope from 'src/scope/scope' +import Token from 'src/parser/token' + +export default interface ITemplate { + token: Token; + render(scope: Scope): Promise; +} diff --git a/src/template/output.ts b/src/template/output.ts new file mode 100644 index 000000000..79dae3eb1 --- /dev/null +++ b/src/template/output.ts @@ -0,0 +1,17 @@ +import Value from './value' +import { stringify } from 'src/util/underscore' +import Template from 'src/template/template' +import ITemplate from 'src/template/itemplate' +import Scope from 'src/scope/scope' + +export default class Output extends Template implements ITemplate { + value: Value + constructor(token, strict_filters?) { + super(token) + this.value = new Value(token.value, strict_filters) + } + async render(scope: Scope) { + const html = await this.value.value(scope) + return stringify(html) + } +} diff --git a/src/template/tag/hash.ts b/src/template/tag/hash.ts new file mode 100644 index 000000000..1808c47d7 --- /dev/null +++ b/src/template/tag/hash.ts @@ -0,0 +1,20 @@ +import { hashCapture } from 'src/parser/lexical' +import { evalValue } from 'src/render/syntax' + +/** + * Key-Value Pairs Representing Tag Arguments + * Example: + * For the markup `{% include 'head.html' foo='bar' %}`, + * hash['foo'] === 'bar' + */ +export default class Hash { + constructor(markup, scope) { + let match + hashCapture.lastIndex = 0 + while ((match = hashCapture.exec(markup))) { + const k = match[1] + const v = match[2] + this[k] = evalValue(v, scope) + } + } +} diff --git a/src/template/tag/tag.ts b/src/template/tag/tag.ts new file mode 100644 index 000000000..70a726ab1 --- /dev/null +++ b/src/template/tag/tag.ts @@ -0,0 +1,43 @@ +import { create } from 'src/util/underscore' +import { stringify } from 'src/util/underscore' +import assert from 'src/util/assert' +import TagImpl from './tagimpl' +import Hash from './hash' +import Template from 'src/template/template' +import ITemplate from 'src/template/itemplate' +import TagToken from 'src/parser/tag-token' + +export default class Tag extends Template implements ITemplate { + name: string + token: TagToken + private impl: TagImpl + static impls: object = {} + + constructor (token, tokens, liquid) { + super(token) + this.name = token.name + + const impl = Tag.impls[token.name] + assert(impl, `tag ${token.name} not found`) + this.impl = create(impl) + this.impl.liquid = liquid + if (this.impl.parse) { + this.impl.parse(token, tokens) + } + } + async render (scope) { + const hash = new Hash(this.token.args, scope) + const impl = this.impl + if (typeof impl.render !== 'function') { + return '' + } + const html = await impl.render(scope, hash) + return stringify(html) + } + static register (name, tag) { + Tag.impls[name] = tag + } + static clear () { + Tag.impls = {} + } +} diff --git a/src/template/tag/tagimpl.ts b/src/template/tag/tagimpl.ts new file mode 100644 index 000000000..422cfb208 --- /dev/null +++ b/src/template/tag/tagimpl.ts @@ -0,0 +1,8 @@ +import Liquid from 'src/liquid' +import Scope from 'src/scope/scope' + +export default interface TagImpl { + liquid: Liquid + parse: (token: any, remainingTokens: Array) => void + render: (scope: Scope, hash: any) => Promise +} diff --git a/src/template/template.ts b/src/template/template.ts new file mode 100644 index 000000000..bfe74fbd0 --- /dev/null +++ b/src/template/template.ts @@ -0,0 +1,8 @@ +import Token from 'src/parser/token' + +export default class Template { + token: Token; + constructor(token) { + this.token = token; + } +} diff --git a/src/template/value.ts b/src/template/value.ts new file mode 100644 index 000000000..465b0602d --- /dev/null +++ b/src/template/value.ts @@ -0,0 +1,30 @@ +import { evalExp } from 'src/render/syntax' +import * as lexical from 'src/parser/lexical' +import assert from 'src/util/assert' +import Filter from './filter' +import Scope from 'src/scope/scope' + +export default class { + initial: any + filters: Array + constructor(str: string, strict_filters?: boolean) { + let match = lexical.matchValue(str) + assert(match, `illegal value string: ${str}`) + + const initial = match[0] + str = str.substr(match.index + match[0].length) + + const filters = [] + while ((match = lexical.filter.exec(str))) { + filters.push([match[0].trim()]) + } + + this.initial = initial + this.filters = filters.map(str => new Filter(str, strict_filters)) + } + value(scope: Scope) { + return this.filters.reduce( + (prev, filter) => filter.render(prev, scope), + evalExp(this.initial, scope)) + } +} diff --git a/src/tokenizer.js b/src/tokenizer.js deleted file mode 100644 index f538e07ec..000000000 --- a/src/tokenizer.js +++ /dev/null @@ -1,90 +0,0 @@ -import * as lexical from './lexical' -import { TokenizationError } from './util/error' -import * as _ from './util/underscore' -import assert from './util/assert' -import whiteSpaceCtrl from './whitespace-ctrl' - -export { default as whiteSpaceCtrl } from './whitespace-ctrl' - -export function parse (input, file, options) { - assert(_.isString(input), 'illegal input') - - const rLiquid = /({%-?([\s\S]*?)-?%})|({{-?([\s\S]*?)-?}})/g - let currIndent = 0 - const lineNumber = LineNumber(input) - let lastMatchEnd = 0 - const tokens = [] - - for (let match; (match = rLiquid.exec(input)); lastMatchEnd = rLiquid.lastIndex) { - if (match.index > lastMatchEnd) { - tokens.push(parseHTMLToken(lastMatchEnd, match.index)) - } - tokens.push(match[1] - ? parseTagToken(match[1], match[2].trim(), match.index) - : parseValueToken(match[3], match[4].trim(), match.index)) - } - if (input.length > lastMatchEnd) { - tokens.push(parseHTMLToken(lastMatchEnd, input.length)) - } - whiteSpaceCtrl(tokens, options) - return tokens - - function parseTagToken (raw, value, pos) { - const match = value.match(lexical.tagLine) - const token = { - type: 'tag', - indent: currIndent, - line: lineNumber.get(pos), - trim_left: raw.slice(0, 3) === '{%-', - trim_right: raw.slice(-3) === '-%}', - raw, - value, - input, - file - } - if (!match) { - throw new TokenizationError(`illegal tag syntax`, token) - } - token.name = match[1] - token.args = match[2] - return token - } - - function parseValueToken (raw, value, pos) { - return { - type: 'value', - line: lineNumber.get(pos), - trim_left: raw.slice(0, 3) === '{{-', - trim_right: raw.slice(-3) === '-}}', - raw, - value, - input, - file - } - } - - function parseHTMLToken (begin, end) { - const htmlFragment = input.slice(begin, end) - currIndent = _.last((htmlFragment).split('\n')).length - - return { - type: 'html', - raw: htmlFragment, - value: htmlFragment - } - } -} - -function LineNumber (html) { - let parsedLinesCount = 0 - let lastMatchBegin = -1 - - return { - get: function (pos) { - const lines = html.slice(lastMatchBegin + 1, pos).split('\n') - parsedLinesCount += lines.length - 1 - lastMatchBegin = pos - return parsedLinesCount + 1 - } - } -} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 000000000..2d4c388d7 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,2 @@ +export { AssignScope, CaptureScope, IncrementScope, DecrementScope } from './scope/scopes' +export { ParseError, TokenizationError, RenderBreakError, AssertionError } from './util/error' diff --git a/src/util/assert.ts b/src/util/assert.ts index ed4c9ef19..243ac788f 100644 --- a/src/util/assert.ts +++ b/src/util/assert.ts @@ -1,6 +1,6 @@ import { AssertionError } from './error' -export default function (predicate: any, message: string) { +export default function (predicate: any, message?: string) { if (!predicate) { message = message || `expect ${predicate} to be true` throw new AssertionError(message) diff --git a/src/util/error.ts b/src/util/error.ts index a6ce02910..ab45fe0b7 100644 --- a/src/util/error.ts +++ b/src/util/error.ts @@ -1,4 +1,5 @@ import * as _ from './underscore' +import Token from 'src/parser/token' function captureStack () { if (Error.captureStackTrace) { @@ -13,8 +14,8 @@ abstract class LiquidError { message: string name: string stack: string - token: any - originalError: any + token: Token + originalError: Error constructor(err, token) { this.input = token.input this.line = token.line @@ -66,6 +67,7 @@ RenderError.prototype.constructor = RenderError export class RenderBreakError { message: string + resolvedHTML: string constructor (message) { captureStack.call(this) this.message = message + '' @@ -93,7 +95,7 @@ function mkContext (input, targetLine) { .range(begin, end + 1) .map(lineNumber => { const indicator = (lineNumber === targetLine) ? '>> ' : ' ' - const num = padStart(String(end).length, lineNumber) + const num = _.padStart(String(lineNumber), String(end).length) const text = lines[lineNumber - 1] return `${indicator}${num}| ${text}` }) @@ -112,9 +114,3 @@ function mkMessage (msg, token) { } return msg } - -function padStart (length, str) { - str = String(str) - const blank = Array(length - str.length).join(' ') - return blank + str -} diff --git a/src/util/promise.js b/src/util/promise.ts similarity index 79% rename from src/util/promise.js rename to src/util/promise.ts index 31b043bc2..430159b03 100644 --- a/src/util/promise.js +++ b/src/util/promise.ts @@ -1,11 +1,11 @@ /* * Call functions in serial until someone resolved. - * @param {Array} iterable the array to iterate with. - * @param {Array} iteratee returns a new promise. + * @param iterable the array to iterate with. + * @param iteratee returns a new promise. * The iteratee is invoked with three arguments: (value, index, iterable). */ export function anySeries (iterable, iteratee) { - let ret = Promise.reject(new Error('init')) + let ret: Promise = Promise.reject(new Error('init')) iterable.forEach(function (item, idx) { ret = ret.catch(e => iteratee(item, idx, iterable)) }) @@ -19,7 +19,7 @@ export function anySeries (iterable, iteratee) { * The iteratee is invoked with three arguments: (value, index, iterable). */ export function mapSeries (iterable, iteratee) { - let ret = Promise.resolve('init') + let ret: Promise = Promise.resolve('init') const result = [] iterable.forEach(function (item, idx) { ret = ret diff --git a/src/util/strftime.js b/src/util/strftime.ts similarity index 80% rename from src/util/strftime.js rename to src/util/strftime.ts index 99d6b0a68..7f7e1d377 100644 --- a/src/util/strftime.js +++ b/src/util/strftime.ts @@ -1,3 +1,5 @@ +import { padStart } from './underscore' + const monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' @@ -41,7 +43,7 @@ const _date = { // Find the first startDay of the year const jan1 = new Date(d.getFullYear(), 0, 1) const then = (7 - jan1.getDay() + startDay) - return _number.pad(Math.floor((now - then) / 7) + 1, 2) + return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0') }, isLeapYear: function (d) { @@ -60,20 +62,6 @@ const _date = { } } -const _number = { - pad: function (value, size, ch) { - if (!ch) ch = '0' - let result = value.toString() - let pad = size - result.length - - while (pad-- > 0) { - result = ch + result - } - - return result - } -} - const formatCodes = { a: function (d) { return dayNamesShort[d.getDay()] @@ -94,34 +82,34 @@ const formatCodes = { return _date.century(d) }, d: function (d) { - return _number.pad(d.getDate(), 2) + return padStart(d.getDate(), 2, '0') }, e: function (d) { - return _number.pad(d.getDate(), 2, ' ') + return padStart(d.getDate(), 2) }, H: function (d) { - return _number.pad(d.getHours(), 2) + return padStart(d.getHours(), 2, '0') }, I: function (d) { - return _number.pad(d.getHours() % 12 || 12, 2) + return padStart(String(d.getHours() % 12 || 12), 2, '0') }, j: function (d) { - return _number.pad(_date.getDayOfYear(d), 3) + return padStart(_date.getDayOfYear(d), 3, '0') }, k: function (d) { - return _number.pad(d.getHours(), 2, ' ') + return padStart(d.getHours(), 2) }, l: function (d) { - return _number.pad(d.getHours() % 12 || 12, 2, ' ') + return padStart(String(d.getHours() % 12 || 12), 2) }, L: function (d) { - return _number.pad(d.getMilliseconds(), 3) + return padStart(d.getMilliseconds(), 3, '0') }, m: function (d) { - return _number.pad(d.getMonth() + 1, 2) + return padStart(d.getMonth() + 1, 2, '0') }, M: function (d) { - return _number.pad(d.getMinutes(), 2) + return padStart(d.getMinutes(), 2, '0') }, p: function (d) { return (d.getHours() < 12 ? 'AM' : 'PM') @@ -136,7 +124,7 @@ const formatCodes = { return Math.round(d.valueOf() / 1000) }, S: function (d) { - return _number.pad(d.getSeconds(), 2) + return padStart(d.getSeconds(), 2, '0') }, u: function (d) { return d.getDay() || 7 @@ -164,14 +152,14 @@ const formatCodes = { }, z: function (d) { const tz = d.getTimezoneOffset() / 60 * 100 - return (tz > 0 ? '-' : '+') + _number.pad(Math.abs(tz), 4) + return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0') }, '%': function () { return '%' } -} -formatCodes.h = formatCodes.b -formatCodes.N = formatCodes.L +}; +(formatCodes as any).h = formatCodes.b; +(formatCodes as any).N = formatCodes.L; export default function (d, format) { let output = '' diff --git a/src/util/underscore.ts b/src/util/underscore.ts index c64ddf218..5e49cdaf1 100644 --- a/src/util/underscore.ts +++ b/src/util/underscore.ts @@ -25,7 +25,7 @@ export function promisify (fn) { } export function stringify (value) { - if (isNil(value)) return String(value) + if (isNil(value)) return '' if (isFunction(value.to_liquid)) return stringify(value.to_liquid()) if (isFunction(value.toLiquid)) return stringify(value.toLiquid()) if (isFunction(value.to_s)) return value.to_s() @@ -142,7 +142,7 @@ export function isObject (value) { * Note that ranges that stop before they start are considered to be zero-length instead of * negative — if you'd like a negative range, use a negative step. */ -export function range (start: number, stop: number, step?: number) { +export function range (start: number, stop?: number, step?: number) { if (arguments.length === 1) { stop = start start = 0 @@ -155,3 +155,10 @@ export function range (start: number, stop: number, step?: number) { } return arr } + +export function padStart(str: any, length: number, ch: string = ' ') { + str = String(str) + let n = length - str.length + while(n-- > 0) str = ch + str + return str +} diff --git a/test/.eslintrc.json b/test/.eslintrc.json deleted file mode 100644 index a499cb6fc..000000000 --- a/test/.eslintrc.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "rules": { - "no-unused-expressions": "off" - }, - "env": { - "mocha": true - }, - "plugins": [ - "mocha" - ] -} diff --git a/test/e2e/eval-value.ts b/test/e2e/eval-value.ts new file mode 100644 index 000000000..c379162da --- /dev/null +++ b/test/e2e/eval-value.ts @@ -0,0 +1,14 @@ +var chai = require('chai') +var Liquid = require('../..') +var expect = chai.expect + +chai.use(require('chai-as-promised')) + +describe('.evalValue()', function () { + var engine + beforeEach(() => engine = new Liquid()) + + it('should throw when scope undefined', function () { + expect(() => engine.evalValue('{{"foo"}}')).to.throw(/scope undefined/) + }) +}) diff --git a/test/e2e/express.js b/test/e2e/express.ts similarity index 87% rename from test/e2e/express.js rename to test/e2e/express.ts index d7c27b974..7c4f8ad06 100644 --- a/test/e2e/express.js +++ b/test/e2e/express.ts @@ -1,14 +1,14 @@ -const chai = require('chai') -const request = require('supertest') -const express = require('express') -const mock = require('mock-fs') -const Liquid = require('../../dist/liquid.common.js') -const chaiAsPromised = require('chai-as-promised') +import * as chai from 'chai' +import * as request from 'supertest' +import * as express from 'express' +import * as mock from 'mock-fs' +import Liquid from '../../dist/liquid.common.js' +import * as chaiAsPromised from 'chai-as-promised' const expect = chai.expect chai.use(chaiAsPromised) -describe('engine#express()', function () { +describe('express()', function () { var app, engine beforeEach(function () { @@ -84,7 +84,7 @@ describe('engine#express()', function () { .expect('bar') .expect(200, done) }) - it('should respect express views (Undefined) when lookup', function (done) { + it('should respect express views (undefined) when lookup', function (done) { const files = {} files[process.cwd() + '/views/include.html'] = '{% include file %}' files[process.cwd() + '/views/bar.html'] = 'bar' diff --git a/test/e2e/parse-and-render.js b/test/e2e/parse-and-render.ts similarity index 93% rename from test/e2e/parse-and-render.js rename to test/e2e/parse-and-render.ts index 68b0f8cbc..b3f579b36 100644 --- a/test/e2e/parse-and-render.js +++ b/test/e2e/parse-and-render.ts @@ -12,15 +12,15 @@ describe('.parseAndRender()', function () { strict_filters: true }) }) - it('should value object', function () { + it('should stringify object', function () { var ctx = { obj: { foo: 'bar' } } return expect(engine.parseAndRender('{{obj}}', ctx)).to.eventually.equal('{"foo":"bar"}') }) - it('should value array', function () { + it('should stringify array ', function () { var ctx = { arr: [-2, 'a'] } return expect(engine.parseAndRender('{{arr}}', ctx)).to.eventually.equal('[-2,"a"]') }) - it('should value undefined to empty', function () { + it('should render undefined as empty', function () { return expect(engine.parseAndRender('foo{{zzz}}bar', {})).to.eventually.equal('foobar') }) it('should render as null when filter undefined', function () { diff --git a/test/e2e/render-file.js b/test/e2e/render-file.ts similarity index 100% rename from test/e2e/render-file.js rename to test/e2e/render-file.ts diff --git a/test/e2e/whitespace-ctrl.js b/test/e2e/whitespace-ctrl.ts similarity index 98% rename from test/e2e/whitespace-ctrl.js rename to test/e2e/whitespace-ctrl.ts index 3dec8e3e4..e3778c92d 100644 --- a/test/e2e/whitespace-ctrl.js +++ b/test/e2e/whitespace-ctrl.ts @@ -1,8 +1,10 @@ -const chai = require('chai') -const Liquid = require('../..') +import * as chai from 'chai' +import Liquid from '../..' +import * as chaiAsPromised from 'chai-as-promised' + const liquid = new Liquid() const expect = chai.expect -chai.use(require('chai-as-promised')) +chai.use(chaiAsPromised) const cases = [ { diff --git a/test/e2e/xhr.js b/test/e2e/xhr.ts similarity index 89% rename from test/e2e/xhr.js rename to test/e2e/xhr.ts index 117bb8961..8a4987910 100644 --- a/test/e2e/xhr.js +++ b/test/e2e/xhr.ts @@ -1,28 +1,30 @@ -var Liquid = require('../../dist/liquid.js') -var sinon = require('sinon') -var chai = require('chai') -var expect = chai.expect -chai.use(require('chai-as-promised')) +import Liquid from '../../dist/liquid.js' +import { createFakeServer, useFakeXMLHttpRequest } from 'sinon' +import * as chai from 'chai' +import * as chaiAsPromised from 'chai-as-promised' +import { JSDOM } from 'jsdom' + +const expect = chai.expect +chai.use(chaiAsPromised) describe('xhr', () => { - if (process.version.match(/^v(\d+)/)[1] < 8) { + if (+process.version.match(/^v(\d+)/)[1] < 8) { console.info('jsdom not supported, skipping xhr...') return } - var JSDOM = require('jsdom').JSDOM - var server, engine + let server, engine beforeEach(() => { - server = sinon.createFakeServer() + server = createFakeServer() server.autoRespond = true server.respondWith('GET', 'https://example.com/views/hello.html', [200, { 'Content-Type': 'text/plain' }, 'hello {{name}}']) - var dom = new JSDOM('', { + let dom = new JSDOM('', { url: 'https://example.com/foo/bar.html', contentType: 'text/html', includeNodeLocations: true - }) - global.XMLHttpRequest = sinon.useFakeXMLHttpRequest() - global.document = dom.window.document + }); + (global as any).XMLHttpRequest = useFakeXMLHttpRequest(); + (global as any).document = dom.window.document; engine = new Liquid({ root: 'https://example.com/views/', extname: '.html' @@ -30,8 +32,8 @@ describe('xhr', () => { }) afterEach(() => { server.restore() - delete global.XMLHttpRequest - delete global.document + delete (global as any).XMLHttpRequest + delete (global as any).document }) describe('#renderFile()', () => { it('should support without extname', () => { @@ -70,8 +72,8 @@ describe('xhr', () => { .catch(function (e) { expect(e.message).to.equal('An error occurred whilst receiving the response.') done() - }) - global.XMLHttpRequest.onCreate = function (request) { + }); + (global as any).XMLHttpRequest.onCreate = function (request) { setTimeout(() => request.error()) } }) diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index d88fe5ee2..000000000 --- a/test/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ ---require ts-node/register ---recursive diff --git a/test/unit/filter.ts b/test/unit/filter.ts index 26725c7af..f76498118 100644 --- a/test/unit/filter.ts +++ b/test/unit/filter.ts @@ -1,96 +1,95 @@ import * as chai from 'chai' import * as sinon from 'sinon' import * as sinonChai from 'sinon-chai' -import Filter from '../../src/filter' -import { factory as scopeFactory } from '../../src/scope' +import Filter from 'src/template/filter' +import Scope from 'src/scope/scope' chai.use(sinonChai) const expect = chai.expect -const filter = Filter() describe('filter', function () { let scope beforeEach(function () { - filter.clear() - scope = scopeFactory() + Filter.clear() + scope = new Scope() }) it('should return default filter when not registered', function () { - const result = filter.construct('foo') + const result = new Filter('foo') expect(result.name).to.equal('foo') }) it('should throw when filter name illegal', function () { expect(function () { - filter.construct('/') + new Filter('/') }).to.throw(/illegal filter/) }) it('should parse argument syntax', function () { - filter.register('foo', x => x) - const f = filter.construct('foo: a, "b"') + Filter.register('foo', x => x) + const f = new Filter('foo: a, "b"') expect(f.name).to.equal('foo') expect(f.args).to.deep.equal(['a', '"b"']) }) it('should register a simple filter', function () { - filter.register('upcase', x => x.toUpperCase()) - expect(filter.construct('upcase').render('foo', scope)).to.equal('FOO') + Filter.register('upcase', x => x.toUpperCase()) + expect(new Filter('upcase').render('foo', scope)).to.equal('FOO') }) it('should register a argumented filter', function () { - filter.register('add', (a, b) => a + b) - expect(filter.construct('add: 2').render(3, scope)).to.equal(5) + Filter.register('add', (a, b) => a + b) + expect(new Filter('add: 2').render(3, scope)).to.equal(5) }) it('should register a multi-argumented filter', function () { - filter.register('add', (a, b, c) => a + b + c) - expect(filter.construct('add: 2, "c"').render(3, scope)).to.equal('5c') + Filter.register('add', (a, b, c) => a + b + c) + expect(new Filter('add: 2, "c"').render(3, scope)).to.equal('5c') }) it('should call filter with corrct arguments', function () { const spy = sinon.spy() - filter.register('foo', spy) - filter.construct('foo: 33').render('foo', scope) + Filter.register('foo', spy) + new Filter('foo: 33').render('foo', scope) expect(spy).to.have.been.calledWith('foo', 33) }) it('should support arguments as named key/values', function () { - filter.register('foo', x => x) - const f = filter.construct('foo: key1: "literal1", key2: value2') + Filter.register('foo', x => x) + const f = new Filter('foo: key1: "literal1", key2: value2') expect(f.name).to.equal('foo') expect(f.args).to.deep.equal([ '\'key1\'', '"literal1"', '\'key2\'', 'value2' ]) }) it('should support arguments as named key/values with inline literals', function () { - filter.register('foo', x => x) - const f = filter.construct('foo: "test0", key1: "literal1", key2: value2') + Filter.register('foo', x => x) + const f = new Filter('foo: "test0", key1: "literal1", key2: value2') expect(f.name).to.equal('foo') expect(f.args).to.deep.equal([ '"test0"', '\'key1\'', '"literal1"', '\'key2\'', 'value2' ]) }) it('should support arguments as named key/values with inline values', function () { - filter.register('foo', x => x) - const f = filter.construct('foo: test0, key1: "literal1", key2: value2') + Filter.register('foo', x => x) + const f = new Filter('foo: test0, key1: "literal1", key2: value2') expect(f.name).to.equal('foo') expect(f.args).to.deep.equal([ 'test0', '\'key1\'', '"literal1"', '\'key2\'', 'value2' ]) }) it('should support argument values named same as keys', function () { - filter.register('foo', x => x) - const f = filter.construct('foo: a: a') + Filter.register('foo', x => x) + const f = new Filter('foo: a: a') expect(f.name).to.equal('foo') expect(f.args).to.deep.equal(['\'a\'', 'a']) }) it('should support argument literals named same as keys', function () { - filter.register('foo', x => x) - const f = filter.construct('foo: a: "a"') + Filter.register('foo', x => x) + const f = new Filter('foo: a: "a"') expect(f.name).to.equal('foo') expect(f.args).to.deep.equal(['\'a\'', '"a"']) }) it('should not throw undefined filter by default', function () { - expect(filter.construct('undefined').render('foo', scope)).to.equal('foo') + expect(new Filter('undefined').render('foo', scope)).to.equal('foo') }) }) diff --git a/test/unit/filters.js b/test/unit/filters.ts similarity index 98% rename from test/unit/filters.js rename to test/unit/filters.ts index 6de282b81..74144be54 100644 --- a/test/unit/filters.js +++ b/test/unit/filters.ts @@ -1,9 +1,8 @@ import * as chai from 'chai' import * as chaiAsPromised from 'chai-as-promised' -import Liquid from '../../src/index' +import Liquid from '../../src/liquid' chai.use(chaiAsPromised) -const liquid = new Liquid() const expect = chai.expect const ctx = { @@ -20,12 +19,14 @@ const ctx = { category: 'bar' }] } +let liquid function test (src, dst) { return expect(liquid.parseAndRender(src, ctx)).to.eventually.equal(dst) } describe('filters', function () { + before(() => liquid = new Liquid()) describe('abs', function () { it('should return 3 for -3', () => test('{{ -3 | abs }}', '3')) it('should return 2 for arr[0]', () => test('{{ arr[0] | abs }}', '2')) @@ -416,8 +417,10 @@ describe('filters', function () { }) describe('obj_test', function () { - liquid.registerFilter('obj_test', function () { - return Array.prototype.slice.call(arguments).join(',') + before(() => { + liquid.registerFilter('obj_test', function () { + return Array.prototype.slice.call(arguments).join(',') + }) }) it('should support object', () => test(`{{ "a" | obj_test: k1: "v1", k2: foo }}`, 'a,k1,v1,k2,bar')) it('should support mixed object', () => test(`{{ "a" | obj_test: "something", k1: "v1", k2: foo }}`, 'a,something,k1,v1,k2,bar')) diff --git a/test/unit/lexical.js b/test/unit/lexical.ts similarity index 98% rename from test/unit/lexical.js rename to test/unit/lexical.ts index 0e931cda5..67d7d1736 100644 --- a/test/unit/lexical.js +++ b/test/unit/lexical.ts @@ -1,7 +1,7 @@ -const chai = require('chai') -const expect = chai.expect +import * as chai from 'chai' -const lexical = require('../../src/lexical.js') +const expect = chai.expect +const lexical = require('../../src/parser/lexical') describe('lexical', function () { it('should test filter syntax', function () { diff --git a/test/unit/index.js b/test/unit/liquid.ts similarity index 91% rename from test/unit/index.js rename to test/unit/liquid.ts index 53835e46a..a831078b1 100644 --- a/test/unit/index.js +++ b/test/unit/liquid.ts @@ -1,4 +1,4 @@ -import Liquid from '../../src/index' +import Liquid from '../../src/liquid' import * as mock from 'mock-fs' import * as chai from 'chai' @@ -7,9 +7,7 @@ const expect = chai.expect describe('Liquid', function () { describe('#constructor()', function () { it('should throw on illegal root', function () { - expect(() => { - new Liquid({root: {}}) // eslint-disable-line - }).to.throw(/illegal root/) + expect(() => new (Liquid as any)({root: {}})).to.throw(/illegal root/) }) }) describe('#plugin()', function () { diff --git a/test/unit/options/cache.js b/test/unit/options/cache.ts similarity index 92% rename from test/unit/options/cache.js rename to test/unit/options/cache.ts index 602bcb329..0a2e61c56 100644 --- a/test/unit/options/cache.js +++ b/test/unit/options/cache.ts @@ -1,12 +1,12 @@ import * as chai from 'chai' import * as mock from 'mock-fs' -import Liquid from '../../../src' +import Liquid from '../../../src/liquid' import * as chaiAsPromised from 'chai-as-promised' const expect = chai.expect chai.use(chaiAsPromised) -describe('cache options', function () { +describe('LiquidOptions#cache', function () { let engine beforeEach(function () { engine = new Liquid({ diff --git a/test/unit/options/strict.js b/test/unit/options/strict.ts similarity index 91% rename from test/unit/options/strict.js rename to test/unit/options/strict.ts index 88efb54a4..24ac99f2a 100644 --- a/test/unit/options/strict.js +++ b/test/unit/options/strict.ts @@ -1,10 +1,10 @@ -import Liquid from '../../../src' +import Liquid from '../../../src/liquid' import * as chai from 'chai' const expect = chai.expect chai.use(require('chai-as-promised')) -describe('strict options', function () { +describe('LiquidOptions#strict_*', function () { let engine const ctx = {} beforeEach(function () { diff --git a/test/unit/options/trimming.js b/test/unit/options/trimming.ts similarity index 97% rename from test/unit/options/trimming.js rename to test/unit/options/trimming.ts index 92b3cfeae..f5be96e4d 100644 --- a/test/unit/options/trimming.js +++ b/test/unit/options/trimming.ts @@ -1,11 +1,11 @@ import * as chai from 'chai' -import Liquid from '../../../src' +import Liquid from '../../../src/liquid' import * as chaiAsPromised from 'chai-as-promised' const expect = chai.expect chai.use(chaiAsPromised) -describe('trimming', function () { +describe('LiquidOptions#trimming', function () { const ctx = { name: 'harttle' } describe('tag trimming', function () { diff --git a/test/unit/output.ts b/test/unit/output.ts new file mode 100644 index 000000000..a279e2738 --- /dev/null +++ b/test/unit/output.ts @@ -0,0 +1,56 @@ +import * as chai from 'chai' +import * as chaiAsPromised from 'chai-as-promised' +import * as sinonChai from 'sinon-chai' +import * as sinon from 'sinon' +import Scope from '../../src/scope/scope' +import Output from '../../src/template/output' +import Filter from 'src/template/filter' + +chai.use(sinonChai) +chai.use(chaiAsPromised) + +const expect = chai.expect + +describe('Output', function () { + beforeEach(function () { + Filter.clear() + }) + + it('should respect to .to_liquid() method', function () { + const scope = new Scope({ + bar: { to_liquid: x => 'custom' } + }) + return expect(new Output({value: 'bar'}).render(scope)).to.eventually.equal('custom') + }) + it('should stringify objects', function () { + const scope = new Scope({ + foo: { obj: { arr: ['a', 2] } } + }) + return expect(new Output({value: 'foo'}).render(scope)).to.eventually.equal('{"obj":{"arr":["a",2]}}') + }) + it('should skip circular property', function () { + const ctx = { foo: { num: 2 }, bar: 'bar' } as any + ctx.foo.circular = ctx + const scope = new Scope(ctx) + return expect(new Output({value: 'foo'}).render(scope)).to.eventually.equal('{"num":2,"circular":{"bar":"bar"}}') + }) + it('should skip function property', function () { + const scope = new Scope({ obj: { foo: 'foo', bar: x => x } }) + return expect(new Output({value: 'obj'}).render(scope)).to.eventually.equal('{"foo":"foo"}') + }) + it('should respect to .toString()', async () => { + const scope = new Scope({ obj: { toString: () => 'FOO' } }) + const str = await new Output({value: 'obj'}).render(scope) + return expect(str).to.equal('FOO') + }) + it('should respect to .to_s()', async () => { + const scope = new Scope({ obj: { to_s: () => 'FOO' } }) + const str = await new Output({value: 'obj'}).render(scope) + return expect(str).to.equal('FOO') + }) + it('should respect to .liquid_method_missing()', async () => { + const scope = new Scope({ obj: { liquid_method_missing: x => x.toUpperCase() } }) + const str = await new Output({value: 'obj.foo'}).render(scope) + return expect(str).to.equal('FOO') + }) +}) diff --git a/test/unit/parser.js b/test/unit/parser.js deleted file mode 100644 index f8073e66d..000000000 --- a/test/unit/parser.js +++ /dev/null @@ -1,49 +0,0 @@ -import * as chai from 'chai' -import * as sinonChai from 'sinon-chai' -import Filter from '../../src/filter' -import Tag from '../../src/tag' -import Template from '../../src/parser' - -const expect = chai.expect -const filter = Filter() -const tag = Tag() -chai.use(sinonChai) - -describe('template', function () { - let template - const add = (l, r) => l + r - - beforeEach(function () { - filter.clear() - filter.register('add', add) - - tag.clear() - template = Template(tag, filter) - }) - - it('should throw when value string illegal', function () { - expect(function () { - template.parseValue('/') - }).to.throw(/illegal value string/) - }) - - it('should parse value string', function () { - const tpl = template.parseValue('foo') - expect(tpl.type).to.equal('value') - expect(tpl.initial).to.equal('foo') - expect(tpl.filters).to.deep.equal([]) - }) - - it('should parse value string with a simple filter', function () { - const tpl = template.parseValue('foo | add: 3, "foo"') - expect(tpl.initial).to.equal('foo') - expect(tpl.filters.length).to.equal(1) - expect(tpl.filters[0].filter).to.equal(add) - }) - - it('should parse value string with filters', function () { - const tpl = template.parseValue('foo | add: "|" | add') - expect(tpl.initial).to.equal('foo') - expect(tpl.filters.length).to.equal(2) - }) -}) diff --git a/test/unit/render.js b/test/unit/render.js deleted file mode 100644 index 8f3d03e88..000000000 --- a/test/unit/render.js +++ /dev/null @@ -1,120 +0,0 @@ -import * as chai from 'chai' -import * as chaiAsPromised from 'chai-as-promised' -import * as sinonChai from 'sinon-chai' -import * as sinon from 'sinon' -import Tag from '../../src/tag' -import Scope from '../../src/scope' -import Filter from '../../src/filter' -import Render from '../../src/render' -import parser from '../../src/parser' - -chai.use(sinonChai) -chai.use(chaiAsPromised) - -const expect = chai.expect -const tag = Tag() -const filter = Filter() -const Template = parser(tag, filter) -let render - -describe('render', function () { - beforeEach(function () { - filter.clear() - tag.clear() - render = Render() - }) - - describe('.renderTemplates()', function () { - it('should throw when scope undefined', function () { - expect(render.renderTemplates([])).to.be.rejectedWith(/scope undefined/) - }) - - it('should render html', function () { - const scope = new Scope() - return expect(render.renderTemplates([{ type: 'html', value: '

' }], scope)).to.eventually.equal('

') - }) - }) - - describe('.renderValue()', function () { - it('should respect to .to_liquid() method', function () { - const scope = new Scope({ - bar: { to_liquid: x => 'custom' } - }) - const tpl = Template.parseValue('bar') - return expect(render.renderValue(tpl, scope)).to.eventually.equal('custom') - }) - it('should stringify objects', function () { - const scope = new Scope({ - foo: { obj: { arr: ['a', 2] } } - }) - const tpl = Template.parseValue('foo') - return expect(render.renderValue(tpl, scope)).to.eventually.equal('{"obj":{"arr":["a",2]}}') - }) - it('should skip circular property', function () { - const ctx = { foo: { num: 2 }, bar: 'bar' } - ctx.foo.circular = ctx - - const scope = new Scope(ctx) - const tpl = Template.parseValue('foo') - return expect(render.renderValue(tpl, scope)).to.eventually.equal('{"num":2,"circular":{"bar":"bar"}}') - }) - it('should skip function property', function () { - const scope = new Scope({ obj: { foo: 'foo', bar: x => x } }) - const tpl = Template.parseValue('obj') - return expect(render.renderValue(tpl, scope)).to.eventually.equal('{"foo":"foo"}') - }) - it('should respect to .toString()', async () => { - const scope = new Scope({ obj: { toString: () => 'FOO' } }) - const tpl = Template.parseValue('obj') - const str = await render.renderValue(tpl, scope) - return expect(str).to.equal('FOO') - }) - it('should respect to .to_s()', async () => { - const scope = new Scope({ obj: { to_s: () => 'FOO' } }) - const tpl = Template.parseValue('obj') - const str = await render.renderValue(tpl, scope) - return expect(str).to.equal('FOO') - }) - it('should respect to .liquid_method_missing()', async () => { - const scope = new Scope({ obj: { liquid_method_missing: x => x.toUpperCase() } }) - const tpl = Template.parseValue('obj.foo') - const str = await render.renderValue(tpl, scope) - return expect(str).to.equal('FOO') - }) - }) - - describe('.evalValue()', function () { - it('should throw when scope undefined', function () { - expect(function () { - render.evalValue() - }).to.throw(/scope undefined/) - }) - it('should eval value', function () { - filter.register('date', (l, r) => l + r) - filter.register('time', (l, r) => l + 3 * r) - const tpl = Template.parseValue('foo.bar[0] | date: "b" | time:2') - const scope = new Scope({ - foo: { bar: ['a'] } - }) - expect(render.evalValue(tpl, scope)).to.equal('ab6') - }) - it('should reserve type', function () { - filter.register('arr', () => [1]) - const tpl = Template.parseValue('"x" | arr') - expect(render.evalValue(tpl, new Scope())).to.deep.equal([1]) - }) - it('should eval filter with correct arguments', function () { - const date = sinon.stub().returns('y') - const time = sinon.spy() - filter.register('date', date) - filter.register('time', time) - const tpl = Template.parseValue('foo.bar | date: "b" | time:2') - const scope = new Scope({ - foo: { bar: 'bar' } - }) - render.evalValue(tpl, scope) - expect(date).to.have.been.calledWith('bar', 'b') - expect(time).to.have.been.calledWith('y', 2) - }) - }) -}) diff --git a/test/unit/render.ts b/test/unit/render.ts new file mode 100644 index 000000000..49d0254c1 --- /dev/null +++ b/test/unit/render.ts @@ -0,0 +1,38 @@ +import * as chai from 'chai' +import * as chaiAsPromised from 'chai-as-promised' +import * as sinonChai from 'sinon-chai' +import * as sinon from 'sinon' +import Scope from '../../src/scope/scope' +import Token from 'src/parser/token' +import Tag from 'src/template/tag/tag' +import Filter from 'src/template/filter' +import Render from '../../src/render/render' +import Parser from '../../src/parser/parser' +import HTML from 'src/template/html' + +chai.use(sinonChai) +chai.use(chaiAsPromised) + +const expect = chai.expect +const parser = new Parser(null) +let render + +describe('render', function () { + beforeEach(function () { + Filter.clear() + Tag.clear() + render = new Render() + }) + + describe('.renderTemplates()', function () { + it('should throw when scope undefined', function () { + expect(render.renderTemplates([])).to.be.rejectedWith(/scope undefined/) + }) + + it('should render html', function () { + const scope = new Scope() + const token = { type: 'html', value: '

' } as Token + return expect(render.renderTemplates([new HTML(token)], scope)).to.eventually.equal('

') + }) + }) +}) diff --git a/test/unit/scope.js b/test/unit/scope.ts similarity index 99% rename from test/unit/scope.js rename to test/unit/scope.ts index 296f1d586..5390891e7 100644 --- a/test/unit/scope.js +++ b/test/unit/scope.ts @@ -1,5 +1,5 @@ import * as chai from 'chai' -import Scope from '../../src/scope' +import Scope from 'src/scope/scope' const expect = chai.expect diff --git a/test/unit/syntax.js b/test/unit/syntax.ts similarity index 91% rename from test/unit/syntax.js rename to test/unit/syntax.ts index 07b149228..e3e4b7f1f 100644 --- a/test/unit/syntax.js +++ b/test/unit/syntax.ts @@ -1,6 +1,6 @@ -import Scope from '../../src/scope' +import Scope from 'src/scope/scope' import { expect } from 'chai' -import { evalExp, evalValue, isTruthy } from '../../src/syntax' +import { evalExp, evalValue, isTruthy } from 'src/render/syntax' describe('expression', function () { let scope @@ -19,8 +19,8 @@ describe('expression', function () { describe('.evalValue()', function () { it('should eval literals', function () { - expect(evalValue('2.3')).to.equal(2.3) - expect(evalValue('"foo"')).to.equal('foo') + expect(evalValue('2.3', scope)).to.equal(2.3) + expect(evalValue('"foo"', scope)).to.equal('foo') }) it('should eval variables', function () { @@ -31,7 +31,7 @@ describe('expression', function () { }) it('should throw if not valid', function () { - const fn = () => evalValue('===') + const fn = () => evalValue('===', scope) expect(fn).to.throw("cannot eval '===' as value") }) }) @@ -53,7 +53,7 @@ describe('expression', function () { describe('.evalExp()', function () { it('should throw when scope undefined', function () { expect(function () { - evalExp('') + (evalExp as any)('') }).to.throw(/scope undefined/) }) diff --git a/test/unit/tag.js b/test/unit/tag.ts similarity index 74% rename from test/unit/tag.js rename to test/unit/tag.ts index d7d8ba2af..7f8cc5647 100644 --- a/test/unit/tag.js +++ b/test/unit/tag.ts @@ -1,12 +1,14 @@ import * as chai from 'chai' -import Tag from '../../src/tag' -import Scope from '../../src/scope' +import Tag from 'src/template/tag/tag' +import TagToken from 'src/parser/tag-token' +import Scope from 'src/scope/scope' import * as sinon from 'sinon' import * as sinonChai from 'sinon-chai' +import Liquid from 'src/liquid' chai.use(sinonChai) const expect = chai.expect -const tag = Tag() +const liquid = new Liquid(); describe('tag', function () { let scope @@ -18,22 +20,22 @@ describe('tag', function () { coo: 'uoo' } }) - tag.clear() + Tag.clear() }) it('should throw when not registered', function () { expect(function () { - tag.construct({ + new Tag({ // eslint-disable-line type: 'tag', value: 'foo', name: 'foo' - }, []) + }, [], liquid) }).to.throw(/tag foo not found/) }) it('should register simple tag', function () { expect(function () { - tag.register('foo', { + Tag.register('foo', { render: x => 'bar' }) }).not.throw() @@ -41,7 +43,7 @@ describe('tag', function () { it('should call tag.render', async function () { const spy = sinon.spy() - tag.register('foo', { + Tag.register('foo', { render: spy }) const token = { @@ -49,7 +51,7 @@ describe('tag', function () { value: 'foo', name: 'foo' } - await tag.construct(token, []).render(scope, {}) + await new Tag(token, [], liquid).render(scope) expect(spy).to.have.been.called }) @@ -57,7 +59,7 @@ describe('tag', function () { let spy, token beforeEach(function () { spy = sinon.spy() - tag.register('foo', { + Tag.register('foo', { render: spy }) token = { @@ -68,29 +70,29 @@ describe('tag', function () { } }) it('should call tag.render with scope', async function () { - await tag.construct(token, []).render(scope, {}) + await new Tag(token, [], liquid).render(scope) expect(spy).to.have.been.calledWithMatch(scope) }) it('should resolve identifier hash', async function () { - await tag.construct(token, []).render(scope, {}) + await new Tag(token, [], liquid).render(scope) expect(spy).to.have.been.calledWithMatch({}, { aa: 'bar' }) }) it('should accept space between key/value', async function () { - await tag.construct(token, []).render(scope, {}) + await new Tag(token, [], liquid).render(scope) expect(spy).to.have.been.calledWithMatch({}, { bb: 2 }) }) it('should resolve number value hash', async function () { - await tag.construct(token, []).render(scope, {}) + await new Tag(token, [], liquid).render(scope) expect(spy).to.have.been.calledWithMatch(scope, { cc: 2.3 }) }) it('should resolve property access hash', async function () { - await tag.construct(token, []).render(scope, {}) + await new Tag(token, [], liquid).render(scope) expect(spy).to.have.been.calledWithMatch(scope, { dd: 'uoo' }) diff --git a/test/unit/tags/assign.js b/test/unit/tags/assign.ts similarity index 98% rename from test/unit/tags/assign.js rename to test/unit/tags/assign.ts index ff18a7508..f88ac497a 100644 --- a/test/unit/tags/assign.js +++ b/test/unit/tags/assign.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' import * as sinonChai from 'chai-as-promised' diff --git a/test/unit/tags/capture.js b/test/unit/tags/capture.ts similarity index 96% rename from test/unit/tags/capture.js rename to test/unit/tags/capture.ts index 84d80711e..6e824328a 100644 --- a/test/unit/tags/capture.js +++ b/test/unit/tags/capture.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src/index' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/case.js b/test/unit/tags/case.ts similarity index 98% rename from test/unit/tags/case.js rename to test/unit/tags/case.ts index 2a50756ea..10595485c 100644 --- a/test/unit/tags/case.js +++ b/test/unit/tags/case.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/comment.js b/test/unit/tags/comment.ts similarity index 97% rename from test/unit/tags/comment.js rename to test/unit/tags/comment.ts index 429043e15..14aaabc6e 100644 --- a/test/unit/tags/comment.js +++ b/test/unit/tags/comment.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/cycle.js b/test/unit/tags/cycle.ts similarity index 96% rename from test/unit/tags/cycle.js rename to test/unit/tags/cycle.ts index 6c460b3c3..fa965fae3 100644 --- a/test/unit/tags/cycle.js +++ b/test/unit/tags/cycle.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/decrement.js b/test/unit/tags/decrement.ts similarity index 98% rename from test/unit/tags/decrement.js rename to test/unit/tags/decrement.ts index eb385feb6..44a7a5bf5 100644 --- a/test/unit/tags/decrement.js +++ b/test/unit/tags/decrement.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/for.js b/test/unit/tags/for.ts similarity index 99% rename from test/unit/tags/for.js rename to test/unit/tags/for.ts index 58e55db79..f16f6770b 100644 --- a/test/unit/tags/for.js +++ b/test/unit/tags/for.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/if.js b/test/unit/tags/if.ts similarity index 99% rename from test/unit/tags/if.js rename to test/unit/tags/if.ts index ae3acf26c..407f1f5be 100644 --- a/test/unit/tags/if.js +++ b/test/unit/tags/if.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src/index' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/include.js b/test/unit/tags/include.ts similarity index 99% rename from test/unit/tags/include.js rename to test/unit/tags/include.ts index fffd906eb..798df1e32 100644 --- a/test/unit/tags/include.js +++ b/test/unit/tags/include.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as mock from 'mock-fs' import * as chai from 'chai' diff --git a/test/unit/tags/increment.js b/test/unit/tags/increment.ts similarity index 98% rename from test/unit/tags/increment.js rename to test/unit/tags/increment.ts index 6130f160c..cc8b0527e 100644 --- a/test/unit/tags/increment.js +++ b/test/unit/tags/increment.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/layout.js b/test/unit/tags/layout.ts similarity index 99% rename from test/unit/tags/layout.js rename to test/unit/tags/layout.ts index c14dc5a9e..7e2f845a8 100644 --- a/test/unit/tags/layout.js +++ b/test/unit/tags/layout.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as mock from 'mock-fs' import * as chai from 'chai' diff --git a/test/unit/tags/raw.js b/test/unit/tags/raw.ts similarity index 95% rename from test/unit/tags/raw.js rename to test/unit/tags/raw.ts index 97e3e5269..a86ae7eae 100644 --- a/test/unit/tags/raw.js +++ b/test/unit/tags/raw.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/tablerow.js b/test/unit/tags/tablerow.ts similarity index 98% rename from test/unit/tags/tablerow.js rename to test/unit/tags/tablerow.ts index c7cf114b2..0cc1e8169 100644 --- a/test/unit/tags/tablerow.js +++ b/test/unit/tags/tablerow.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect diff --git a/test/unit/tags/unless.js b/test/unit/tags/unless.ts similarity index 93% rename from test/unit/tags/unless.js rename to test/unit/tags/unless.ts index feab87adf..efe8078eb 100644 --- a/test/unit/tags/unless.js +++ b/test/unit/tags/unless.ts @@ -1,11 +1,12 @@ -import Liquid from '../../../src' +import Liquid from 'src/liquid' import * as chai from 'chai' const expect = chai.expect chai.use(require('chai-as-promised')) describe('tags/unless', function () { - const liquid = new Liquid() + let liquid + before(() => { liquid = new Liquid() }) it('should render else when predicate yields true', function () { // 0 is truthy diff --git a/test/unit/template-browser.js b/test/unit/template-browser.ts similarity index 93% rename from test/unit/template-browser.js rename to test/unit/template-browser.ts index e0c8aac07..a92b57566 100644 --- a/test/unit/template-browser.js +++ b/test/unit/template-browser.ts @@ -1,10 +1,10 @@ -import { resolve } from '../../src/template-browser' +import { resolve } from '../../src/parser/template-browser' import * as chai from 'chai' const expect = chai.expect describe('template-browser', function () { - if (process.version.match(/^v(\d+)/)[1] < 8) { + if (+process.version.match(/^v(\d+)/)[1] < 8) { console.info('jsdom not supported, skipping template-browser...') return } @@ -14,11 +14,11 @@ describe('template-browser', function () { url: 'https://example.com/foo/bar/', contentType: 'text/html', includeNodeLocations: true - }) - global.document = dom.window.document + }); + (global as any).document = dom.window.document }) afterEach(function () { - delete global.document + delete (global as any).document }) describe('resolve', function () { it('should support relative root', function () { diff --git a/test/unit/template.js b/test/unit/template.ts similarity index 93% rename from test/unit/template.js rename to test/unit/template.ts index a14fba626..55270717e 100644 --- a/test/unit/template.js +++ b/test/unit/template.ts @@ -1,4 +1,4 @@ -import { resolve } from '../../src/template' +import { resolve } from '../../src/parser/template' import * as mock from 'mock-fs' import * as chai from 'chai' import * as path from 'path' diff --git a/test/unit/tokenizer.js b/test/unit/tokenizer.ts similarity index 74% rename from test/unit/tokenizer.js rename to test/unit/tokenizer.ts index 0a30ff756..c74693efb 100644 --- a/test/unit/tokenizer.js +++ b/test/unit/tokenizer.ts @@ -1,6 +1,8 @@ -const chai = require('chai') -const parse = require('../../src/tokenizer.js').parse -const expect = chai.expect +import { expect } from 'chai' +import { parse } from 'src/parser/tokenizer' +import TagToken from 'src/parser/tag-token' +import OutputToken from 'src/parser/output-token' +import HTMLToken from 'src/parser/html-token' describe('tokenizer', function () { describe('parse', function () { @@ -10,19 +12,14 @@ describe('tokenizer', function () { expect(tokens.length).to.equal(1) expect(tokens[0].value).to.equal(html) - expect(tokens[0].type).to.equal('html') - }) - it('should throw when non-string passed in', function () { - expect(function () { - parse({}) - }).to.throw('illegal input') + expect(tokens[0]).instanceOf(HTMLToken) }) it('should handle tag syntax', function () { const html = '

{% for p in a[1]%}

' const tokens = parse(html) expect(tokens.length).to.equal(3) - expect(tokens[1].type).to.equal('tag') + expect(tokens[1]).instanceOf(TagToken) expect(tokens[1].value).to.equal('for p in a[1]') }) it('should handle value syntax', function () { @@ -30,7 +27,7 @@ describe('tokenizer', function () { const tokens = parse(html) expect(tokens.length).to.equal(3) - expect(tokens[1].type).to.equal('value') + expect(tokens[1]).instanceOf(OutputToken) expect(tokens[1].value).to.equal('foo | date: "%Y-%m-%d"') }) it('should handle consecutive value and tags', function () { @@ -38,8 +35,8 @@ describe('tokenizer', function () { const tokens = parse(html) expect(tokens.length).to.equal(4) - expect(tokens[0].type).to.equal('value') - expect(tokens[3].type).to.equal('tag') + expect(tokens[0]).instanceOf(OutputToken) + expect(tokens[2]).instanceOf(TagToken) expect(tokens[1].value).to.equal('bar') expect(tokens[2].value).to.equal('foo') @@ -48,16 +45,16 @@ describe('tokenizer', function () { const html = '{%foo%}\n{%bar %} \n {%alice%}' const tokens = parse(html) expect(tokens.length).to.equal(5) - expect(tokens[1].type).to.equal('html') + expect(tokens[1]).instanceOf(HTMLToken) expect(tokens[1].raw).to.equal('\n') - expect(tokens[3].type).to.equal('html') + expect(tokens[3]).instanceOf(HTMLToken) expect(tokens[3].raw).to.equal(' \n ') }) it('should handle multiple lines tag', function () { const html = '{%foo\na:a\nb:1.23\n%}' const tokens = parse(html) expect(tokens.length).to.equal(1) - expect(tokens[0].type).to.equal('tag') + expect(tokens[0]).instanceOf(TagToken) expect(tokens[0].args).to.equal('a:a\nb:1.23') expect(tokens[0].raw).to.equal('{%foo\na:a\nb:1.23\n%}') }) @@ -65,7 +62,7 @@ describe('tokenizer', function () { const html = '{{foo\n|date:\n"%Y-%m-%d"\n}}' const tokens = parse(html) expect(tokens.length).to.equal(1) - expect(tokens[0].type).to.equal('value') + expect(tokens[0]).instanceOf(OutputToken) expect(tokens[0].raw).to.equal('{{foo\n|date:\n"%Y-%m-%d"\n}}') }) }) diff --git a/test/unit/util/assert.js b/test/unit/util/assert.ts similarity index 100% rename from test/unit/util/assert.js rename to test/unit/util/assert.ts diff --git a/test/unit/util/error.js b/test/unit/util/error.ts similarity index 99% rename from test/unit/util/error.js rename to test/unit/util/error.ts index 76dee57a9..dda291c76 100644 --- a/test/unit/util/error.js +++ b/test/unit/util/error.ts @@ -1,4 +1,4 @@ -import Liquid from '../../../src' +import Liquid from '../../../src/liquid' import * as mock from 'mock-fs' import * as chai from 'chai' import * as path from 'path' diff --git a/test/unit/util/promise.js b/test/unit/util/promise.ts similarity index 98% rename from test/unit/util/promise.js rename to test/unit/util/promise.ts index a4dc30b9b..01d43de7d 100644 --- a/test/unit/util/promise.js +++ b/test/unit/util/promise.ts @@ -4,7 +4,7 @@ const expect = chai.expect chai.use(require('chai-as-promised')) chai.use(require('sinon-chai')) -const P = require('../../../src/util/promise.js') +const P = require('../../../src/util/promise') describe('util/promise', function () { describe('.anySeries()', function () { diff --git a/test/unit/util/strftime.js b/test/unit/util/strftime.ts similarity index 98% rename from test/unit/util/strftime.js rename to test/unit/util/strftime.ts index efc46a939..035f47e17 100644 --- a/test/unit/util/strftime.js +++ b/test/unit/util/strftime.ts @@ -126,7 +126,7 @@ describe('util/strftime', function () { }) function mockUTC () { - const p = Date.prototype + const p = Date.prototype as any p._getHours = p.getHours p.getHours = p.getUTCHours @@ -139,7 +139,7 @@ function mockUTC () { } function restoreUTC () { - const p = Date.prototype + const p = Date.prototype as any p.getHours = p._getHours p.getDays = p._getDays p.getTimezoneOffset = p._getTimezoneOffset diff --git a/test/unit/util/underscore.js b/test/unit/util/underscore.ts similarity index 93% rename from test/unit/util/underscore.js rename to test/unit/util/underscore.ts index 519bbdb87..1e0076d85 100644 --- a/test/unit/util/underscore.js +++ b/test/unit/util/underscore.ts @@ -21,7 +21,7 @@ describe('util/underscore', function () { expect(_.isError(new RenderError(new Error(), tpl))).to.be.true }) it('should return true for RenderBreakError', function () { - expect(_.isError(new RenderBreakError())).to.be.true + expect(_.isError(new RenderBreakError(''))).to.be.true }) }) describe('.isString()', function () { @@ -45,11 +45,11 @@ describe('util/underscore', function () { it('should recursively call toLiquid()', function () { expect(_.stringify({ toLiquid: () => ({ toLiquid: () => 'foo' }) })).to.equal('foo') }) - it('should return "null" for null', function () { - expect(_.stringify(null)).to.equal('null') + it('should return "" for null', function () { + expect(_.stringify(null)).to.equal('') }) - it('should return "undefined" for undefined', function () { - expect(_.stringify(undefined)).to.equal('undefined') + it('should return "" for undefined', function () { + expect(_.stringify(undefined)).to.equal('') }) it('should return regex string for RegExp', function () { const reg = /foo/g @@ -98,7 +98,7 @@ describe('util/underscore', function () { it('should return a range of integers', function () { expect(_.range(3, 5)).to.deep.equal([3, 4]) }) - it('should treat start as 0 if omitted', function () { + it('should start from 0 if begin omitted', function () { expect(_.range(3)).to.deep.equal([0, 1, 2]) }) }) diff --git a/test/unit/value.ts b/test/unit/value.ts new file mode 100644 index 000000000..3749bab19 --- /dev/null +++ b/test/unit/value.ts @@ -0,0 +1,72 @@ +import * as chai from 'chai' +import * as chaiAsPromised from 'chai-as-promised' +import * as sinonChai from 'sinon-chai' +import * as sinon from 'sinon' +import Scope from '../../src/scope/scope' +import Filter from 'src/template/filter' +import Value from 'src/template/value' + +chai.use(sinonChai) +chai.use(chaiAsPromised) + +const expect = chai.expect +const add = (l, r) => l + r + +describe('Value', function () { + beforeEach(() => Filter.clear()) + + it('should throw when value string illegal', function () { + expect(function () { + new Value('/') + }).to.throw(/illegal value string/) + }) + + it('should parse value string', function () { + const tpl: any = new Value('foo') + expect(tpl.initial).to.equal('foo') + expect(tpl.filters).to.deep.equal([]) + }) + + it('should parse value string with a simple filter', function () { + Filter.register('add', add) + const tpl: any = new Value('foo | add: 3, "foo"') + expect(tpl.initial).to.equal('foo') + expect(tpl.filters.length).to.equal(1) + expect(tpl.filters[0].impl).to.equal(add) + }) + + it('should parse value string with filters', function () { + const tpl: any = new Value('foo | add: "|" | add') + expect(tpl.initial).to.equal('foo') + expect(tpl.filters.length).to.equal(2) + }) + + + it('should eval value', function () { + Filter.register('date', (l, r) => l + r) + Filter.register('time', (l, r) => l + 3 * r) + const tpl = new Value('foo.bar[0] | date: "b" | time:2') + const scope = new Scope({ + foo: { bar: ['a'] } + }) + expect(tpl.value(scope)).to.equal('ab6') + }) + it('should reserve type', function () { + Filter.register('arr', () => [1]) + const tpl = new Value('"x" | arr') + expect(tpl.value(new Scope())).to.deep.equal([1]) + }) + it('should eval filter with correct arguments', function () { + const date = sinon.stub().returns('y') + const time = sinon.spy() + Filter.register('date', date) + Filter.register('time', time) + const tpl = new Value('foo.bar | date: "b" | time:2') + const scope = new Scope({ + foo: { bar: 'bar' } + }) + tpl.value(scope) + expect(date).to.have.been.calledWith('bar', 'b') + expect(time).to.have.been.calledWith('y', 2) + }) +}) diff --git a/test/unit/xhr.js b/test/unit/xhr.ts similarity index 85% rename from test/unit/xhr.js rename to test/unit/xhr.ts index 1ed9f7ad4..3ff80636c 100644 --- a/test/unit/xhr.js +++ b/test/unit/xhr.ts @@ -1,4 +1,4 @@ -import { read } from '../../src/template-browser' +import { read } from 'src/parser/template-browser' import * as sinon from 'sinon' import * as chai from 'chai' @@ -7,7 +7,7 @@ chai.use(require('chai-as-promised')) const expect = chai.expect describe('template-browser', () => { - if (process.version.match(/^v(\d+)/)[1] < 8) { + if (+process.version.match(/^v(\d+)/)[1] < 8) { console.info('jsdom not supported, skipping xhr...') return } @@ -16,12 +16,12 @@ describe('template-browser', () => { server = sinon.createFakeServer() server.autoRespond = true server.respondWith('GET', 'https://example.com/views/hello.html', - [200, { 'Content-Type': 'text/plain' }, 'hello {{name}}']) - global.XMLHttpRequest = sinon.useFakeXMLHttpRequest() + [200, { 'Content-Type': 'text/plain' }, 'hello {{name}}']); + (global as any).XMLHttpRequest = sinon.useFakeXMLHttpRequest() }) afterEach(() => { server.restore() - delete global.XMLHttpRequest + delete (global as any).XMLHttpRequest }) describe('#read()', () => { it('should get corresponding text', () => { diff --git a/tsconfig.json b/tsconfig.json index 8bc88af0a..a4ae9be05 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,9 +7,15 @@ "sourceMap": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true, - "emitDecoratorMetadata": true + "emitDecoratorMetadata": true, + "baseUrl": ".", + "paths": { + "template": ["src/parser/template"], + "src/*": ["src/*"] + } }, "include": [ - "src" - ] + "src", "test" + ], + "exclude": [ "node_modules", "dist" ] }