diff --git a/.eslintrc b/.eslintrc index f27ebb44..9f688a90 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,7 +9,7 @@ "discovery": true }, "parserOptions": { - "ecmaVersion": 2018, + "ecmaVersion": 2020, "sourceType": "module" }, "plugins": [ diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 956c0d1c..3d22b7c0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,8 +12,8 @@ jobs: - name: Cypress run uses: cypress-io/github-action@v2 with: - start: npm run start:server - wait-on: 'http://localhost:8123' + start: npm run cypress:server + wait-on: 'http://localhost:8124' record: true env: CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 81fd3eb0..09d5836e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,17 @@ ## next +- Reworked to use `esbuild` for bundling +- Reworked to use Shadow DOM for style and event isolation +- Added preloader +- Removed quick inspection mode for now, due to annoying in various use cases - Added JSON parser from `json-ext` library, that's adds support for JSON greater than 512MB on V8 - Improved UX when data loading from a file by showing progress bar - Added `App#loadDataFromStream()` and `App#loadDataFromFile()` methods - Added `unsubscribe` as a second parameter for publisher's subscriber handler +- Changed `source` view to highligh using CodeMirror only +- Enabled `source` view syntaxes can be observed on `#views-showcase:source` page +- Removed `Prismjs` and related dependencies +- Moved `source` view to regular views, dropped `complexViews` from exports ## 1.0.0-beta.52 (19-11-2020) diff --git a/LICENSE b/LICENSE index 1150c174..f672e854 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Avito Technology -Copyright (c) 2019 Roman Dvornov +Copyright (c) 2018-2021 Roman Dvornov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/cypress.json b/cypress.json index 911ee30c..396e762c 100644 --- a/cypress.json +++ b/cypress.json @@ -1,3 +1,4 @@ { - "projectId": "t2rgkz" -} \ No newline at end of file + "projectId": "t2rgkz", + "includeShadowDom": true +} diff --git a/cypress/integration/single-model/single-model.spec.js b/cypress/integration/single-model/single-model.spec.js index b04b044c..6aa57552 100644 --- a/cypress/integration/single-model/single-model.spec.js +++ b/cypress/integration/single-model/single-model.spec.js @@ -1,6 +1,6 @@ describe('Single model', () => { it('Visits discovery server', () => { - cy.visit('localhost:8123'); + cy.visit('localhost:8124'); }); it('Has model name', () => { diff --git a/cypress/test.sh b/cypress/test.sh index 564b090a..fdf65a4c 100755 --- a/cypress/test.sh +++ b/cypress/test.sh @@ -1,5 +1,5 @@ #!/bin/bash -npx discovery -c ./cypress/fixtures/single-model/.discoveryrc.js & +npm run cypress:server & PID=$! cypress run --headless -kill $PID \ No newline at end of file +kill $PID diff --git a/dist/.npmignore b/dist/.npmignore index 3490e769..864d6be2 100644 --- a/dist/.npmignore +++ b/dist/.npmignore @@ -1,5 +1,6 @@ * -!discovery.js -!discovery.*.js +!discovery-preloader.js +# !discovery-preloader.js.map !discovery.css -!discovery.*.css +!discovery.js +# !discovery.js.map diff --git a/libs/es5toEs6.js b/libs/es5toEs6.js deleted file mode 100644 index 746d8287..00000000 --- a/libs/es5toEs6.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = function es5toEs6(name, code, imports, cjs) { - const importStmts = Object.entries(imports || {}).reduce( - (res, [ref, lib]) => - res.concat( - cjs - ? `var ${ref} = require('/gen/${lib}.js').default;` - : `import ${ref} from '/gen/${lib}.js';` - ), - []); - const exportStmt = cjs - ? `Object.defineProperty(exports, "__esModule", { value: true });\nexports.default = ${name};` - : `export default ${name};`; - - return [ - ...importStmts, - `var global = {${Object.keys(imports || {}).join(', ')}};`, - 'var module = undefined;', - `var ${name};`, - 'var define = function() {', - ' const fn = arguments[arguments.length - 1];', - ` ${name} = fn();`, - ' define = undefined;', - '};', - 'define.amd = true;', - code, - exportStmt - ].join('\n'); -}; diff --git a/libs/index.js b/libs/index.js deleted file mode 100644 index 21e4e280..00000000 --- a/libs/index.js +++ /dev/null @@ -1,92 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const es5toEs6 = require('./es5toEs6'); -const es6NodeModules = { - jora: { - name: 'jora', - files: [ - 'dist/jora.js' - ] - }, - '@discoveryjs/json-ext': { - name: 'jsonExt', - files: [ - 'dist/json-ext.js' - ] - }, - codemirror: { - name: 'CodeMirror', - files: [ - 'lib/codemirror.js', - 'mode/javascript/javascript.js' - ] - }, - marked: { - name: 'marked', - files: [ - 'marked.min.js' - ] - }, - prismjs: { - name: 'Prism', - files: [ - 'prism.js', - 'components/prism-json.js', - 'components/prism-php.js', - 'components/prism-twig.js', - 'components/prism-yaml.js', - 'components/prism-stylus.js' - ], - patch(content) { - return content - // prevent global polution - .replace(/_self.Prism = _;/, '') - // prevent auto-highlighting - .replace(/manual:.+?,/, 'manual:true,'); - } - }, - hitext: { - name: 'hitext', - files: [ - 'dist/hitext.min.js' - ] - }, - 'hitext-prismjs': { - name: 'hitextPrismjs', - imports: { - Prism: 'prismjs' - }, - files: [ - 'dist/hitext-prismjs.min.js' - ] - } -}; - -function libContent(libPath, libConfig) { - const filesContent = libConfig.files.reduce( - (res, relFilename) => - res + fs.readFileSync(path.join(libPath, relFilename), 'utf8'), - '' - ); - - return typeof libConfig.patch === 'function' - ? libConfig.patch(filesContent) - : filesContent; -} - -for (let name in es6NodeModules) { - const libConfig = es6NodeModules[name]; - const libPath = path.dirname(require.resolve((libConfig.pkg || name) + '/package.json')); - - exports[name] = { - name, - filename: `${name}.js`, - path: libPath, - get source() { - return es5toEs6(libConfig.name, libContent(libPath, libConfig), libConfig.imports); - }, - get sourceCjs() { - return es5toEs6(libConfig.name, libContent(libPath, libConfig), libConfig.imports, true); - } - }; -} diff --git a/package-lock.json b/package-lock.json index 85e7a607..0841b07e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,58 +14,52 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true }, "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", "dev": true, "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.10", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -79,41 +73,38 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -128,12 +119,12 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-function-name": { @@ -148,12 +139,12 @@ } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-hoist-variables": { @@ -166,45 +157,47 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.7" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-plugin-utils": { @@ -213,56 +206,45 @@ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -280,10 +262,16 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -293,14 +281,14 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { @@ -312,39 +300,52 @@ "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "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.3.0" + } + } } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -352,9 +353,9 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -362,9 +363,9 @@ } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -372,9 +373,9 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -382,9 +383,9 @@ } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -392,9 +393,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -402,20 +403,20 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -423,33 +424,33 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -463,9 +464,9 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -553,56 +554,56 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -610,52 +611,52 @@ "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", @@ -663,18 +664,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -682,225 +683,224 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.10.tgz", + "integrity": "sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA==", "dev": true, "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -910,45 +910,42 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", + "@babel/types": "^7.12.10", + "core-js-compat": "^3.8.0", "semver": "^5.5.0" } }, @@ -966,46 +963,46 @@ } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.10", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1025,12 +1022,6 @@ "figures": "^1.7.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -1050,50 +1041,6 @@ "supports-color": "^2.0.0" } }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -1149,9 +1096,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -1160,9 +1107,9 @@ } }, "@discoveryjs/cli": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/cli/-/cli-1.14.3.tgz", - "integrity": "sha512-tuRiDy7fZ0L40VngS7k+tVac151alAnSWvg7GDrUukGXKa7jnEgzu6BZDCB95qhCXJDM2sxFKAL7zZImHPovHg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@discoveryjs/cli/-/cli-1.15.0.tgz", + "integrity": "sha512-OKoX7JSuSDv5qpNhMdS0DxaEPiWhOgnWdxwK8wuMyjFJDJb823845VnkcMAl2AjWn0LIlVDOh2MKqMoeIxqwAA==", "dev": true, "requires": { "@babel/core": "^7.5.5", @@ -1173,7 +1120,7 @@ "browserify": "^16.5.0", "chalk": "^3.0.0", "clap": "^2.0.1", - "css-tree": "^1.0.0", + "css-tree": "^1.0.1", "express": "^4.17.1", "mime": "^2.4.4", "parse-duration": "^0.4.4", @@ -1186,62 +1133,13 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.3.2.tgz", "integrity": "sha512-C7G6IE8/8tVrLhXxNIh7Jwt2qIDXGUlwMNU4lSRzcwfcxM4Vb5yOnfR+EtoC1ci+UBSJE1NfbY4O0VcsnIhlhQ==", "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, "@discoveryjs/json-ext": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.4.0.tgz", - "integrity": "sha512-duX5JTqLWZYpcAxWmDGXX4nm3LDaVCgl/yMSKNXtpzbM5KAm5yQxvtFByt1+SJQDies/lJBK0sIFtqAyja0cuQ==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==" }, "@samverschueren/stream-to-observable": { "version": "0.3.1", @@ -1252,12 +1150,6 @@ "any-observable": "^0.3.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "@types/sinonjs__fake-timers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", @@ -1291,9 +1183,9 @@ } }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { @@ -1320,9 +1212,9 @@ "dev": true }, "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -1332,26 +1224,15 @@ } }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } + "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": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { @@ -1369,15 +1250,15 @@ "dev": true }, "arch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", - "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true }, "archiver": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.0.2.tgz", - "integrity": "sha512-Tq3yV/T4wxBsD2Wign8W9VQKhaUxzzRmjEiSoOK0SLqPgDP/N1TKdYyBeIEu56T4I9iO4fKTTR0mN9NWkBA0sg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.1.0.tgz", + "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", "dev": true, "requires": { "archiver-utils": "^2.1.0", @@ -1386,7 +1267,7 @@ "readable-stream": "^3.6.0", "readdir-glob": "^1.0.0", "tar-stream": "^2.1.4", - "zip-stream": "^4.0.0" + "zip-stream": "^4.0.4" } }, "archiver-utils": { @@ -1532,9 +1413,9 @@ "dev": true }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-plugin-dynamic-import-node": { @@ -1559,9 +1440,9 @@ "dev": true }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "bcrypt-pbkdf": { @@ -1797,21 +1678,13 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } } }, "browserify-sign": { @@ -1849,15 +1722,16 @@ } }, "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", + "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" } }, "buffer": { @@ -1912,6 +1786,16 @@ "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1919,9 +1803,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001142", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001142.tgz", - "integrity": "sha512-pDPpn9ankEpBFZXyCv2I4lh1v/ju+bqb78QfKf+w9XgDAFWBwSYPswXqprRdrgQWK0wQnpIbfwRjNHO1HWqvoQ==", + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", "dev": true }, "caseless": { @@ -1931,51 +1815,13 @@ "dev": true }, "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.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clap/-/clap-2.0.1.tgz", - "integrity": "sha512-0tMYgaWjmtCNSZ3lgtNga4NTWOohokdoOe7G41sdr5C9tihu3U0GBXJGOXqfsxKATjwOSBaI3cRv/mNVwddksQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "chalk": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "dependencies": { "ansi-styles": { @@ -1987,16 +1833,6 @@ "color-convert": "^2.0.1" } }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2029,13 +1865,50 @@ } } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clap/-/clap-2.0.1.tgz", + "integrity": "sha512-0tMYgaWjmtCNSZ3lgtNga4NTWOohokdoOe7G41sdr5C9tihu3U0GBXJGOXqfsxKATjwOSBaI3cRv/mNVwddksQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0" + } + }, "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^1.0.1" } }, "cli-table3": { @@ -2059,12 +1932,6 @@ "string-width": "^1.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": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -2074,12 +1941,6 @@ "number-is-nan": "^1.0.0" } }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -2090,15 +1951,6 @@ "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } } } }, @@ -2108,17 +1960,6 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, - "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -2126,9 +1967,9 @@ "dev": true }, "codemirror": { - "version": "5.58.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.58.1.tgz", - "integrity": "sha512-UGb/ueu20U4xqWk8hZB3xIfV2/SFqnSLYONiM3wTMDqko0bsYrsAkGGhqUzbRkYm89aBKPyHtuNEbVWF9FTFzw==" + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.59.0.tgz", + "integrity": "sha512-UGzSkCacY9z0rSpQ3wnTWRN2nvRE6foDXnJltWW8pazInR/R+3gXHrao4IFQMv/bSBvFBxt8/HPpkpKAS54x5Q==" }, "color-convert": { "version": "1.9.3", @@ -2143,6 +1984,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -2180,9 +2027,9 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, "common-tags": { @@ -2192,13 +2039,13 @@ "dev": true }, "compress-commons": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.1.tgz", - "integrity": "sha512-xZm9o6iikekkI0GnXCmAl3LQGZj5TBDj0zLowsqi7tJtEa3FMGSEcHcqrSJIrOAk1UG/NBbDn/F1q+MG/p/EsA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.2.tgz", + "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", "dev": true, "requires": { "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.0", + "crc32-stream": "^4.0.1", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" } @@ -2287,12 +2134,12 @@ "dev": true }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", + "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.15.0", "semver": "7.0.0" }, "dependencies": { @@ -2310,22 +2157,23 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", "dev": true, "requires": { - "buffer": "^5.1.0" + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" } }, "crc32-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.0.tgz", - "integrity": "sha512-tyMw2IeUX6t9jhgXI6um0eKfWq4EIDpfv5m7GX4Jzp7eVelQ360xd8EPXJhp2mHwLQIkqlnMLjzqSZI3a+0wRw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.1.tgz", + "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", "dev": true, "requires": { - "crc": "^3.4.4", + "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, @@ -2375,16 +2223,14 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-browserify": { @@ -2407,12 +2253,12 @@ } }, "css-tree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0.tgz", - "integrity": "sha512-CdVYz/Yuqw0VdKhXPBIgi8DO3NicJVYZNWeX9XcIuSp9ZoFT5IcleVRW07O5rMjdcx1mb+MEJPknTTEW7DdsYw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "dev": true, "requires": { - "mdn-data": "2.0.12", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { @@ -2425,9 +2271,9 @@ } }, "cypress": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-5.3.0.tgz", - "integrity": "sha512-XgebyqL7Th6/8YenE1ddb7+d4EiCG2Jvg/5c8+HPfFFY/gXnOVhoCVUU3KW8qg3JL7g0B+iJbHd5hxuCqbd1RQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-5.6.0.tgz", + "integrity": "sha512-cs5vG3E2JLldAc16+5yQxaVRLLqMVya5RlrfPWkC72S5xrlHFdw7ovxPb61s4wYweROKTyH01WQc2PFzwwVvyQ==", "dev": true, "requires": { "@cypress/listr-verbose-renderer": "^0.4.1", @@ -2442,7 +2288,7 @@ "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-table3": "~0.6.0", - "commander": "^4.1.1", + "commander": "^5.1.0", "common-tags": "^1.8.0", "debug": "^4.1.1", "eventemitter2": "^6.4.2", @@ -2460,10 +2306,10 @@ "minimist": "^1.2.5", "moment": "^2.27.0", "ospath": "^1.2.2", - "pretty-bytes": "^5.3.0", + "pretty-bytes": "^5.4.1", "ramda": "~0.26.1", "request-progress": "^3.0.0", - "supports-color": "^7.1.0", + "supports-color": "^7.2.0", "tmp": "~0.2.1", "untildify": "^4.0.0", "url": "^0.11.0", @@ -2504,27 +2350,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2533,15 +2364,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } } } }, @@ -2567,9 +2389,9 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2602,12 +2424,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "optional": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2730,9 +2546,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz", - "integrity": "sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew==", + "version": "1.3.622", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.622.tgz", + "integrity": "sha512-AJT0Fm1W0uZlMVVkkJrcCVvczDuF8tPm3bwzQf5WO8AaASB2hwTRP7B8pU5rqjireH+ib6am8+hH5/QkXzzYKw==", "dev": true }, "elegant-spinner": { @@ -2785,41 +2601,16 @@ "once": "^1.4.0" } }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } + "esbuild": { + "version": "0.8.42", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.42.tgz", + "integrity": "sha512-zUtj5RMqROCCCH0vV/a7cd8YQg8I0GWBhV3A3PklWRT+oM/YwVbnrtFnITzE1otGdnXplWHWdZ4OcYiV0PN+JQ==", + "dev": true }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { @@ -2879,6 +2670,44 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -2888,11 +2717,50 @@ "type-fest": "^0.8.1" } }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -3022,9 +2890,9 @@ } }, "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -3038,45 +2906,13 @@ "strip-final-newline": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "mimic-fn": "^2.1.0" } } } @@ -3096,6 +2932,12 @@ "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", "dev": true }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -3166,6 +3008,17 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } } }, "extract-zip": { @@ -3237,12 +3090,13 @@ } }, "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -3295,6 +3149,17 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -3369,9 +3234,9 @@ "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-assigned-identifiers": { @@ -3380,6 +3245,17 @@ "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", "dev": true }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -3445,15 +3321,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -3492,14 +3359,6 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } } }, "has-flag": { @@ -3551,11 +3410,6 @@ "ansi-styles": "^3.2.1" } }, - "hitext-prismjs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hitext-prismjs/-/hitext-prismjs-1.1.0.tgz", - "integrity": "sha512-mcpq3ZO8VW2gv/G6dCzGwO2UjNYGUQBEJ4zSZnuE/Uc1+m4ZqHfZ/cIyeJ3PVSZXNtcM2WB6xGLboyR8coGqGg==" - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3627,9 +3481,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore": { @@ -3639,9 +3493,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -3677,9 +3531,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true }, "inline-source-map": { @@ -3712,13 +3566,27 @@ "through": "^2.3.6" }, "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -3732,6 +3600,15 @@ "supports-color": "^7.1.0" } }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3747,12 +3624,40 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -3770,13 +3675,19 @@ "requires": { "has-flag": "^4.0.0" } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true } } }, "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -3791,15 +3702,6 @@ "xtend": "^4.0.0" } }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -3812,12 +3714,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -3827,11 +3723,14 @@ "ci-info": "^2.0.0" } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } }, "is-extglob": { "version": "2.1.1", @@ -3864,12 +3763,6 @@ "is-path-inside": "^3.0.1" } }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, "is-observable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", @@ -3891,30 +3784,12 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3951,9 +3826,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4015,13 +3890,21 @@ } }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "jsonify": { @@ -4090,21 +3973,6 @@ } } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4162,12 +4030,6 @@ "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 - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -4187,16 +4049,6 @@ "supports-color": "^2.0.0" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -4206,15 +4058,6 @@ "chalk": "^1.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -4235,6 +4078,17 @@ "figures": "^2.0.0" }, "dependencies": { + "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.3.0" + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -4399,12 +4253,6 @@ "wrap-ansi": "^3.0.1" }, "dependencies": { - "ansi-escapes": { - "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 - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -4441,19 +4289,10 @@ } } }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, "marked": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.3.tgz", - "integrity": "sha512-RQuL2i6I6Gn+9n81IDNGbL0VHnta4a+8ZhqvryXEniTb/hQNtf3i26hi1XWUhzb9BgVyWHKR3UO8MaHtKoYibw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.7.tgz", + "integrity": "sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==" }, "md5.js": { "version": "1.3.5", @@ -4467,9 +4306,9 @@ } }, "mdn-data": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.12.tgz", - "integrity": "sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "media-typer": { @@ -4660,9 +4499,9 @@ "dev": true }, "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", "dev": true }, "normalize-path": { @@ -4678,14 +4517,6 @@ "dev": true, "requires": { "path-key": "^3.0.0" - }, - "dependencies": { - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - } } }, "number-is-nan": { @@ -4706,12 +4537,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4719,13 +4544,13 @@ "dev": true }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } @@ -4749,13 +4574,10 @@ } }, "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true }, "optionator": { "version": "0.8.3", @@ -4863,9 +4685,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -4938,13 +4760,11 @@ "parse-ms": "^2.1.0" } }, - "prismjs": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", - "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", - "requires": { - "clipboard": "^2.0.0" - } + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true }, "process": { "version": "0.11.10", @@ -5126,9 +4946,9 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { @@ -5208,11 +5028,12 @@ } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -5223,19 +5044,19 @@ "dev": true }, "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -5278,12 +5099,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "optional": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5390,18 +5205,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { @@ -5423,23 +5238,10 @@ "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true }, "source-map": { "version": "0.5.7", @@ -5447,24 +5249,6 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5598,6 +5382,12 @@ "strip-ansi": "^6.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -5609,68 +5399,6 @@ } } }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5681,20 +5409,12 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "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": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^2.0.0" } }, "strip-final-newline": { @@ -5754,6 +5474,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -5766,6 +5492,17 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -5776,6 +5513,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -5792,25 +5538,6 @@ "readable-stream": "^3.1.1" } }, - "terser": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.4.tgz", - "integrity": "sha512-dxuB8KQo8Gt6OVOeLg/rxfcxdNZI/V1G6ze1czFUzPeCFWZRtvZMgSzlZZ5OYBZ4HoG607F6pFPNLekJyV+yVw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5865,19 +5592,13 @@ "process": "~0.11.0" } }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "optional": true - }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "rimraf": "^3.0.0" } }, "to-fast-properties": { @@ -5911,9 +5632,9 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tty-browserify": { @@ -6104,9 +5825,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "vary": { @@ -6133,9 +5854,9 @@ "dev": true }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -6222,13 +5943,13 @@ } }, "zip-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.2.tgz", - "integrity": "sha512-TGxB2g+1ur6MHkvM644DuZr8Uzyz0k0OYWtS3YlpfWBEmK4woaC2t3+pozEL3dBfIPmpgmClR5B2QRcMgGt22g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz", + "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", "dev": true, "requires": { "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.0", + "compress-commons": "^4.0.2", "readable-stream": "^3.6.0" } } diff --git a/package.json b/package.json index 42125b06..77ebd900 100644 --- a/package.json +++ b/package.json @@ -6,28 +6,19 @@ "license": "MIT", "repository": "discoveryjs/discovery", "keywords": [], - "main": "dist/discovery.umd.js", - "unpkg": "dist/discovery.umd.js", - "jsdelivr": "dist/discovery.umd.js", - "browser": { - "/gen/jora.js": "./dist/gen/jora.js", - "/gen/@discoveryjs/json-ext.js": "./dist/gen/@discoveryjs/json-ext.js", - "/gen/hitext": "./dist/gen/hitext.js", - "/gen/hitext-prismjs": "./dist/gen/hitext-prismjs.js", - "/gen/marked": "./dist/gen/marked.js", - "/gen/prismjs": "./dist/gen/prismjs.js", - "/gen/codemirror": "./dist/gen/codemirror.js" - }, + "main": "src/lib.js", + "unpkg": "dist/discovery.js", + "jsdelivr": "dist/discovery.js", "scripts": { - "lint": "eslint libs scripts src", - "build": "npm run build:esm && npm run build:css", - "build:esm": "npm run build:umd && node scripts/convert-lib-to-es6", - "build:umd": "node scripts/build-js | terser --compress --mangle -o dist/discovery.umd.js", - "build:css": "node scripts/build-css", - "build-gh-pages": "npm run build && discovery-build -o .gh-pages --isolate-styles", + "lint": "eslint scripts src", + "build": "npm run build:js && npm run build:css && npm run build:preloader", + "build:js": "esbuild src/lib.js --outfile=dist/discovery.js --bundle --define:global=window --format=esm --minify --sourcemap", + "build:css": "esbuild src/lib.css --outfile=dist/discovery.css --bundle --minify --loader:.svg=dataurl", + "build:preloader": "esbuild src/preloader.js --outfile=dist/discovery-preloader.js --bundle --define:global=window --format=esm --minify --sourcemap", + "build-gh-pages": "discovery-build -o .gh-pages --cleanup", "prepublishOnly": "npm run build", "cypress": "npx cypress open", - "start:server": "discovery -c ./cypress/fixtures/single-model/.discoveryrc.js", + "cypress:server": "discovery -c ./cypress/fixtures/single-model/.discoveryrc.js -p 8124", "start": "discovery -c models", "test": "./cypress/test.sh" }, @@ -35,28 +26,21 @@ "node": ">=8.0.0" }, "dependencies": { - "@discoveryjs/json-ext": "^0.4.0", - "codemirror": "^5.52.2", + "@discoveryjs/json-ext": "^0.5.2", + "codemirror": "^5.59.0", "hitext": "^1.0.0-beta.1", - "hitext-prismjs": "^1.1.0", "jora": "1.0.0-beta.5", - "marked": "^1.2.3", - "prismjs": "^1.21.0" + "marked": "^1.2.7" }, "devDependencies": { - "@babel/core": "^7.9.0", - "@babel/preset-env": "^7.9.0", - "@discoveryjs/cli": "^1.14.3", - "babelify": "^10.0.0", - "browserify": "^16.5.0", + "@discoveryjs/cli": "^1.15.0", "cypress": "^5.3.0", + "esbuild": "^0.8.42", "eslint": "^6.8.0", - "eslint-plugin-cypress": "^2.11.2", - "terser": "^5.3.3" + "eslint-plugin-cypress": "^2.11.2" }, "files": [ "dist", - "libs", "src" ] } diff --git a/scripts/build-css.js b/scripts/build-css.js deleted file mode 100644 index 852b44b6..00000000 --- a/scripts/build-css.js +++ /dev/null @@ -1,23 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const { bundleCss } = require('@discoveryjs/cli').build; -const inputFilename = path.join(__dirname, '../src/lib.css'); -const outputPath = path.join(__dirname, '../dist'); -const isolateOptions = { - isolate: 'style-boundary-8H37xEyN' -}; - -function writeCssFile(task, filename) { - task.then(({ content }) => - fs.writeFileSync(path.join(outputPath, filename), content, 'utf8') - ); -} - -writeCssFile( - bundleCss(inputFilename), - 'discovery.raw.css' -); -writeCssFile( - bundleCss(inputFilename, isolateOptions), - 'discovery.css' -); diff --git a/scripts/build-js.js b/scripts/build-js.js deleted file mode 100644 index 72b3b44f..00000000 --- a/scripts/build-js.js +++ /dev/null @@ -1,46 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const browserify = require('browserify'); -const babelify = require('babelify'); -const libs = require('../libs'); - -buildLibs(path.join(__dirname, '../dist/gen')); -build(path.join(__dirname, '../src/lib.js')); - -function build(inputFilename) { - return browserify(inputFilename, { - standalone: 'discovery', - ignoreMissing: true - }) - .transform(babelify, { - presets: [ - ['@babel/preset-env', { - exclude: [ - '@babel/plugin-transform-regenerator' - ] - }] - ], - generatorOpts: { - compact: true, - comments: false - } - }) - .bundle() - .pipe(process.stdout); -} - -function buildLibs(distDir) { - for (let name in libs) { - fs.writeFileSync( - ensurePath(path.join(distDir, libs[name].filename)), - libs[name].sourceCjs, - 'utf8' - ); - } -} - -function ensurePath(filepath) { - fs.mkdirSync(path.dirname(filepath), { recursive: true }); - - return filepath; -} diff --git a/scripts/convert-lib-to-es6.js b/scripts/convert-lib-to-es6.js deleted file mode 100644 index d6ea3eb0..00000000 --- a/scripts/convert-lib-to-es6.js +++ /dev/null @@ -1,18 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const es5toEs6 = require('../libs/es5toEs6'); -const libFilename = path.join(__dirname, '../src/lib.js'); -const libBundleFilename = path.join(__dirname, '../dist/discovery.umd.js'); -const libContent = fs.readFileSync(libFilename, 'utf8'); -const libBundleContent = fs.readFileSync(libBundleFilename, 'utf8'); -const exportNames = ((libContent.match(/export {\s*((\S+,\s*)*\S+)\s*}/) || [])[1] || '').split(/\s*,\s*/); - -fs.writeFileSync( - libBundleFilename.replace(/\.umd\./, '.'), - es5toEs6('discovery', libBundleContent) - .replace('export default discovery', - exportNames.length - ? 'export const ' + exportNames.map(n => `${n} = discovery.${n}`).join(',') - : '' - ) -); diff --git a/src/app/app.css b/src/app/app.css index ab8b946b..1ed6b265 100644 --- a/src/app/app.css +++ b/src/app/app.css @@ -1,5 +1,5 @@ .discovery > .loading-overlay { - position: fixed; + position: absolute; z-index: 10000; top: 0; right: 0; @@ -33,30 +33,8 @@ visibility: hidden; transition: all .2s; } -.discovery > .loading-overlay:not(.error) .progress { - content: ''; - display: block; - position: relative; - overflow: hidden; - margin-top: 4px; - box-sizing: border-box; - height: 3px; - max-width: 300px; - background: rgba(198, 198, 198, 0.3); - border-radius: 2px; -} -.discovery > .loading-overlay:not(.error) .progress::before { - content: ''; - display: block; - height: 100%; - width: 100%; - position: absolute; - left: 0; - top: 0; - transform: scaleX(var(--progress, 0)); - transform-origin: left; - /* transition: transform .2s; */ /* since Chrome (tested on 85) freezes transition during js loop */ - background-color: #1f7ec5; +.discovery > .loading-overlay .progressbar { + margin: 15px 20px; } .discovery-nav-popup > .toggle-menu-item { diff --git a/src/app/index.css b/src/app/index.css index 06ad0b91..d7401855 100644 --- a/src/app/index.css +++ b/src/app/index.css @@ -1,3 +1,2 @@ @import url('../widget/index.css'); -@import url('../views/index-complex.css'); @import url('./app.css'); diff --git a/src/app/index.js b/src/app/index.js index 7e8d977f..1678e7f0 100644 --- a/src/app/index.js +++ b/src/app/index.js @@ -1,78 +1,21 @@ /* eslint-env browser */ import Widget from '../widget/index.js'; -import * as complexViews from '../views/index-complex.js'; import router from '../core/router.js'; import { createElement } from '../core/utils/dom.js'; import { escapeHtml } from '../core/utils/html.js'; +import applyContainerStyles from '../core/utils/apply-container-styles.js'; +import Progressbar from '../core/utils/progressbar.js'; import { loadDataFromStream, loadDataFromFile, loadDataFromEvent, loadDataFromUrl, - loadStages -} from '../core/utils/data-load.js'; + syncLoaderWithProgressbar +} from '../core/utils/load-data.js'; const coalesceOption = (value, fallback) => value !== undefined ? value : fallback; -function progressbar(state, progressEl) { - if (!progressEl) { - progressEl = document.createElement('div'); - } - - progressEl.innerHTML = '
'; - - const unsubscribe = state.subscribeSync(state => { - const { stage, progress, error } = state; - - if (error) { - unsubscribe(); - progressEl.classList.add('error'); - return; - } - - const { value, title, duration } = loadStages[stage]; - let progressValue = 0; - let progressLabel; - - if (progress) { - const { - done, - elapsed, - units, - completed, - total - } = progress; - - if (total) { - progressValue = done ? 1.0 : completed / total; - progressLabel = units === 'bytes' - ? Math.round(progressValue * 100) + '%' - : `${completed}/${total}`; - } else { - progressValue = done ? 1.0 : 0.1 + Math.min(0.9, elapsed / 20000); - progressLabel = units === 'bytes' - ? (completed / (1024 * 1024)).toFixed(1) + 'MB' - : completed; - } - } - - progressEl.style.setProperty('--progress', value + progressValue * duration); - progressEl.querySelector('.title').textContent = progressLabel - ? `${title} (${progressLabel})...` - : stage !== 'done' - ? `${title}...` - : title; - - if (stage === 'done') { - unsubscribe(); - progressEl.classList.add('done'); - } - }); - - return unsubscribe; -} - export default class App extends Widget { constructor(container, options = {}) { super(container, null, { @@ -82,10 +25,10 @@ export default class App extends Widget { }); this.mode = this.options.mode; - this.download = this.options.setup.model && this.options.setup.model.download; - this.apply(complexViews); this.apply(router); + // FIXME: should not apply styles by default + this.darkmode.subscribe(darkmode => applyContainerStyles(this.dom.wrapper.parentNode, { darkmode })); // let detachDarkMode = () => {}; // this.nav.append({ @@ -94,7 +37,7 @@ export default class App extends Widget { // onClick: () => this.darkmode.toggle(true), // postRender: el => { // detachDarkMode(); - // detachDarkMode = this.darkmode.on((value, mode) => { + // detachDarkMode = this.darkmode.subscribe((value, mode) => { // el.classList.toggle('dark', value); // el.classList.toggle('auto', mode === 'auto'); // el.textContent = mode === 'auto' ? 'Auto light/dark' : value ? 'Dark mode' : 'Light mode'; @@ -112,7 +55,7 @@ export default class App extends Widget { let selfValue; detachToggleDarkMode(); - detachToggleDarkMode = this.darkmode.on((value, mode) => { + detachToggleDarkMode = this.darkmode.subscribe((value, mode) => { const newValue = mode === 'auto' ? 'auto' : value; if (newValue === selfValue) { @@ -161,23 +104,6 @@ export default class App extends Widget { when: '#.widget | pageId != reportPageId', data: '{ text: "Make report", href: pageLink(#.widget.reportPageId) }' }); - this.nav.menu.append({ - name: 'download', - when: '#.widget | download', - data: '{ text: "Download report", href: #.widget.download }' - }); - this.nav.menu.append({ - name: 'drop-cache', - when: '#.widget | options.cache', - content: 'text:"Reload with no cache"', - onClick: () => fetch('drop-cache').then(() => location.reload()) - }); - this.nav.menu.append({ - name: 'switch-model', - when: '#.widget | mode = "multi"', - data: { href: '..' }, - content: 'text:"Switch model"' - }); } this.nav.append({ @@ -203,103 +129,90 @@ export default class App extends Widget { return setDataPromise; } - // FIXME: temporary solution progressbar(...args) { - return progressbar(...args); + return new Progressbar(...args); } - trackLoadDataProgress({ result, state, timing }) { - if (this.cancelTrackLoadDataProgress) { - this.cancelTrackLoadDataProgress(); - } + trackLoadDataProgress(loader) { + const progressbar = this.progressbar({ + onTiming: ({ title, duration }) => + console.log(`[Discovery] Data loading / ${title} – ${duration}ms`) + }); const containerEl = this.dom.loadingOverlay; + containerEl.innerHTML = ''; + containerEl.append(progressbar.el); containerEl.classList.remove('error', 'done'); containerEl.classList.add('init'); + this.dom.wrapper.style.opacity = 1; requestAnimationFrame(() => containerEl.classList.remove('init')); - const subscriptions = [ - progressbar(state, containerEl), - timing.subscribe(({ stage, elapsed }) => - console.log(`[Discovery] Data loading / ${loadStages[stage].title} - ${elapsed}ms`) + syncLoaderWithProgressbar(loader, progressbar) + .then(({ data, context }) => + this.setDataProgress(data, context, progressbar) ) - ]; - - this.cancelTrackLoadDataProgress = () => { - for (const unsubscribe of subscriptions) { - unsubscribe(); - } - }; - - // output error - result.catch(error => { - containerEl.innerHTML = [ - '
', - '

Ops, something went wrong with data loading

', - '
' + escapeHtml(error.stack || String(error)).replace(/^Error:\s*(\S+Error:)/, '$1') + '
', - '
' - ].join(''); - - if (this.options.cache) { - containerEl.prepend(createElement('button', { - class: 'view-button', - async onclick() { - await fetch('drop-cache'); - location.reload(); + .then( + async () => { + containerEl.classList.add('done'); + await progressbar.setState({ stage: 'done' }); + }, + error => { + // output error + containerEl.classList.add('error'); + containerEl.innerHTML = [ + '
', + '

Ooops, something went wrong on data loading

', + '
' + escapeHtml(error.stack || String(error)).replace(/^Error:\s*(\S+Error:)/, '$1') + '
', + '
' + ].join(''); + + if (this.options.cache) { + containerEl.prepend(createElement('button', { + class: 'view-button', + async onclick() { + await fetch('drop-cache'); + location.reload(); + } + }, 'Reload with no cache')); } - }, 'Reload with no cache')); - } - }); + } + ); - return result - .finally(this.cancelTrackLoadDataProgress); + return loader.result; } loadDataFromStream(stream, totalSize) { return this.trackLoadDataProgress(loadDataFromStream( - () => ({ stream, totalSize }), - this.setData.bind(this) + () => ({ stream, totalSize }) )); } loadDataFromEvent(event) { - return this.trackLoadDataProgress(loadDataFromEvent( - event, - this.setData.bind(this) - )); + return this.trackLoadDataProgress(loadDataFromEvent(event)); } loadDataFromFile(file) { - return this.trackLoadDataProgress(loadDataFromFile( - file, - this.setData.bind(this) - )); + return this.trackLoadDataProgress(loadDataFromFile(file)); } loadDataFromUrl(url, dataField) { - return this.trackLoadDataProgress(loadDataFromUrl( - url, - this.setData.bind(this), - dataField - )); + return this.trackLoadDataProgress(loadDataFromUrl(url, dataField)); } - setContainer(container) { - super.setContainer(container); + initDom() { + super.initDom(); - if (this.dom.container) { - this.dom.container.append( - this.dom.loadingOverlay = createElement('div', 'loading-overlay done') - ); + this.dom.container.append( + this.dom.loadingOverlay = createElement('div', 'loading-overlay done') + ); - // setup the drag&drop listeners for model free mode - if (this.options.mode === 'modelfree') { - this.dom.container.addEventListener('drop', e => this.loadDataFromEvent(e), true); - this.dom.container.addEventListener('dragover', e => { - e.stopPropagation(); - e.preventDefault(); - }, true); - } + // setup the drag&drop listeners for model free mode + if (this.options.mode === 'modelfree') { + this.dom.container.addEventListener('drop', e => this.loadDataFromEvent(e), true); + this.dom.container.addEventListener('dragover', e => { + e.stopPropagation(); + e.preventDefault(); + }, true); } } diff --git a/src/widget/darkmode.js b/src/core/darkmode.js similarity index 79% rename from src/widget/darkmode.js rename to src/core/darkmode.js index 09728df1..6b518a64 100644 --- a/src/widget/darkmode.js +++ b/src/core/darkmode.js @@ -1,5 +1,5 @@ /* eslint-env browser */ -import { localStorageEntry } from '../core/utils/persistent.js'; +import { localStorageEntry } from './utils/persistent.js'; const validValues = new Set([true, false, 'auto', 'disabled']); const instances = new Set(); @@ -41,6 +41,31 @@ applyLocalStorageValue(localStorage.value); localStorage.on(applyLocalStorageValue); prefersDarkModeMedia.addListener(applyPrefersColorScheme); // Safari doesn't support for addEventListener() +function resolveInitValue(value, persistent) { + if (value === 'off' || value === 'disable') { + value = 'disabled'; + } + + // use value from a localStorage when persistent + if (value !== 'disabled' && persistent && localStorageValue !== null) { + value = localStorageValue; + } + + return value; +} + +function resolveSetValue(value) { + if (!validValues.has(value)) { + value = 'disabled'; + } + + return value === 'auto' ? prefersDarkModeMedia.matches : value === true; +} + +export function resolveDarkmodeValue(value, persistent) { + return resolveSetValue(resolveInitValue(value, persistent)); +} + // input value | controller internal state // | ------------------------- // | mode | value @@ -52,24 +77,14 @@ prefersDarkModeMedia.addListener(applyPrefersColorScheme); // Safari doesn't sup export class DarkModeController { constructor(value, persistent) { - if (value === 'off' || value === 'disable') { - value = 'disabled'; - } - this.persistent = persistent ? localStorage : null; this.handlers = []; - this.set( - // use value from a localStorage when persistent - value !== 'disabled' && this.persistent !== null && localStorageValue !== null - ? localStorageValue - : value, - true - ); + this.set(resolveInitValue(value, persistent), true); instances.add(this); } - on(fn, fire) { + subscribe(fn, fire) { let entry = { fn }; this.handlers.push(entry); @@ -101,7 +116,7 @@ export class DarkModeController { } this.mode = typeof value === 'boolean' ? 'manual' : value; - this.value = this.mode === 'auto' ? prefersDarkModeMedia.matches : value === true; + this.value = resolveSetValue(value); if (this.mode !== 'disabled') { if (this.persistent && !init) { diff --git a/src/core/page.js b/src/core/page.js index 858d945a..48746287 100644 --- a/src/core/page.js +++ b/src/core/page.js @@ -26,36 +26,35 @@ export default class PageRenderer extends Dict { if (typeof IntersectionObserver === 'function') { const pageOverscrollTriggerEl = createElement('div', { style: 'position:absolute' }); + const root = host.dom.content; let overscrollObserver = null; let unsubscribe = () => {}; - host.on('container-changed', ({ content: root }) => { - if (overscrollObserver) { - overscrollObserver.disconnect(); - overscrollObserver = null; - } - - if (root) { - overscrollObserver = new IntersectionObserver( - entries => - this.pageOverscrolled.set(!entries[entries.length - 1].isIntersecting), - { root } - ); - - this.setPageOverscroll = newPageEl => { - overscrollObserver.unobserve(pageOverscrollTriggerEl); - unsubscribe(); - - if (newPageEl) { - newPageEl.prepend(pageOverscrollTriggerEl); - overscrollObserver.observe(pageOverscrollTriggerEl); - unsubscribe = this.pageOverscrolled.subscribeSync(overscrolled => - newPageEl.classList.toggle('page_overscrolled', overscrolled) - ); - } - }; - } - }); + if (overscrollObserver) { + overscrollObserver.disconnect(); + overscrollObserver = null; + } + + if (root) { + overscrollObserver = new IntersectionObserver( + entries => + this.pageOverscrolled.set(!entries[entries.length - 1].isIntersecting), + { root } + ); + + this.setPageOverscroll = newPageEl => { + overscrollObserver.unobserve(pageOverscrollTriggerEl); + unsubscribe(); + + if (newPageEl) { + newPageEl.prepend(pageOverscrollTriggerEl); + overscrollObserver.observe(pageOverscrollTriggerEl); + unsubscribe = this.pageOverscrolled.subscribeSync(overscrolled => + newPageEl.classList.toggle('page_overscrolled', overscrolled) + ); + } + }; + } } } diff --git a/src/core/publisher.js b/src/core/publisher.js index cd8b5bfa..76b4cb79 100644 --- a/src/core/publisher.js +++ b/src/core/publisher.js @@ -1,4 +1,27 @@ export default class Publisher { + static setValue(publisher, value) { + if (!publisher.shouldPublish(value, publisher.value)) { + return false; + } + + const callbacks = []; + let cursor = publisher.subscriber; + publisher.value = value; + + // search for a callback and remove it + while (cursor !== null) { + const { callback, thisArg } = cursor; + + if (callback !== null) { + callbacks.push(callback.call(thisArg, value, () => publisher.unsubscribe(callback, thisArg))); + } + + cursor = cursor.subscriber; + } + + return callbacks; + } + constructor(initValue, shouldPublish) { this.value = initValue; this.shouldPublish = typeof shouldPublish === 'function' ? shouldPublish : this.shouldPublish; @@ -7,6 +30,7 @@ export default class Publisher { get readonly() { const host = this; + return { subscribe: this.subscribe.bind(this), subscribeSync: this.subscribeSync.bind(this), @@ -58,24 +82,14 @@ export default class Publisher { } set(value) { - if (!this.shouldPublish(value, this.value)) { - return false; - } - - let cursor = this.subscriber; - this.value = value; - - // search for a callback and remove it - while (cursor !== null) { - const { callback, thisArg } = cursor; - - if (callback !== null) { - callback.call(thisArg, value, () => this.unsubscribe(callback, thisArg)); - } + return this.constructor.setValue(this, value) !== false; + } - cursor = cursor.subscriber; - } + asyncSet(value) { + const callbacks = this.constructor.setValue(this, value); - return true; + return callbacks === false + ? Promise.resolve(false) + : Promise.all(callbacks).then(res => res !== false); } } diff --git a/src/core/utils/apply-container-styles.js b/src/core/utils/apply-container-styles.js new file mode 100644 index 00000000..3df9486a --- /dev/null +++ b/src/core/utils/apply-container-styles.js @@ -0,0 +1,41 @@ +import { resolveDarkmodeValue } from '../darkmode.js'; + +const styles = { + 'font-family': 'Tahoma, Verdana, Arial, sans-serif', + 'font-size': '16px', + 'line-height': '1.6', + '-webkit-text-size-adjust': 'none', + 'text-size-adjust': 'none', + 'background-color': 'var(--discovery-background-color, white)', + 'color': 'var(--discovery-color, black)', + 'transition-property': 'background-color, color', + 'transition-duration': '.25s', + 'transition-timing-function': 'ease-in' +}; +const darkmodeStyles = { + '--discovery-background-color': '#242424', + '--discovery-color': '#cccccc' +}; +const knowContainer = new WeakSet(); + +export default function(container, config) { + config = config || {}; + + const darkmode = resolveDarkmodeValue(config.darkmode, config.darkmodePersistent); + + for (const [prop, value] of Object.entries(styles)) { + if (knowContainer.has(container) || !/^transition/.test(prop)) { + container.style.setProperty(prop, value); + } + } + + for (const [prop, value] of Object.entries(darkmodeStyles)) { + if (darkmode) { + container.style.setProperty(prop, value); + } else { + container.style.removeProperty(prop); + } + } + + knowContainer.add(container); +} diff --git a/src/core/utils/blob-polyfill.js b/src/core/utils/blob-polyfill.js index 885140a7..87ff18b0 100644 --- a/src/core/utils/blob-polyfill.js +++ b/src/core/utils/blob-polyfill.js @@ -51,13 +51,13 @@ export function streamFromBlob(blob) { if (fullStreamSupport) { return new ReadableStream({ type: 'bytes', - autoAllocateChunkSize: 524288, + autoAllocateChunkSize: 512 * 1024, pull(controller) { const view = controller.byobRequest.view; const chunk = blob.slice(position, position + view.byteLength); - return arrayBufferFromBlob(chunk).then(function (buffer) { + return arrayBufferFromBlob(chunk).then(function(buffer) { const uint8array = new Uint8Array(buffer); const bytesRead = uint8array.byteLength; @@ -77,9 +77,9 @@ export function streamFromBlob(blob) { if (basicStreamSupport) { return new ReadableStream({ pull(controller) { - const chunk = blob.slice(position, position + 524288); + const chunk = blob.slice(position, position + 512 * 1024); - return arrayBufferFromBlob(chunk).then(function (buffer) { + return arrayBufferFromBlob(chunk).then(function(buffer) { position += buffer.byteLength; controller.enqueue(new Uint8Array(buffer)); diff --git a/src/core/utils/data-load.js b/src/core/utils/data-load.js deleted file mode 100644 index 6cc3cf8d..00000000 --- a/src/core/utils/data-load.js +++ /dev/null @@ -1,234 +0,0 @@ -import Publisher from '../publisher.js'; -import { streamFromBlob } from './blob-polyfill.js'; -import jsonExt from '/gen/@discoveryjs/json-ext.js'; - -export const loadStages = { - request: { - value: 0.0, - title: 'Awaiting data' - }, - receive: { - value: 0.1, - title: 'Receiving data' - }, - parse: { - value: 0.9, - title: 'Processing data (parse)' - }, - apply: { - value: 0.925, - title: 'Processing data (prepare)' - }, - done: { - value: 1.0, - title: 'Done!' - } -}; -Object.values(loadStages).forEach((item, idx, array) => { - item.duration = (idx !== array.length - 1 ? array[idx + 1].value : 0) - item.value; -}); - -const letRepaintIfNeeded = async () => { - await new Promise(resolve => setTimeout(resolve, 1)); - - if (!document.hidden) { - return Promise.race([ - new Promise(requestAnimationFrame), - new Promise(resolve => setTimeout(resolve, 8)) - ]); - } -}; - -function isSameOrigin(url) { - try { - return new URL(url, location.origin).origin === location.origin; - } catch (e) { - return false; - } -} - -export function jsonFromStream(stream, totalSize, setProgress = () => {}) { - const CHUNK_SIZE = 1024 * 1024; // 1MB - - return jsonExt.parseChunked(async function*() { - const reader = stream.getReader(); - const streamStartTime = Date.now(); - let completed = 0; - let awaitRepaint = Date.now(); - - try { - while (true) { - const { done, value } = await reader.read(); - - if (done) { - setProgress({ - done: true, - elapsed: Date.now() - streamStartTime, - units: 'bytes', - completed, - total: totalSize - }); - await letRepaintIfNeeded(); - break; - } - - for (let offset = 0; offset < value.length; offset += CHUNK_SIZE) { - const chunk = offset === 0 && value.length - offset < CHUNK_SIZE - ? value - : value.slice(offset, offset + CHUNK_SIZE); - - completed += chunk.length; - yield chunk; - - const now = Date.now(); - setProgress({ - done: false, - elapsed: now - streamStartTime, - units: 'bytes', - completed, - total: totalSize - }); - - if (now - awaitRepaint > 65 && now - streamStartTime > 200) { - await letRepaintIfNeeded(); - awaitRepaint = Date.now(); - } - } - } - } finally { - reader.releaseLock(); - } - }); -} - -async function loadDataFromStreamInternal(request, applyData, progress, timing) { - const stage = async (stage, fn = () => {}) => { - const startTime = Date.now(); - - try { - progress.set({ stage }); - await letRepaintIfNeeded(); - return await fn(); - } finally { - timing.set({ stage, elapsed: Date.now() - startTime }); - } - }; - - try { - const startTime = Date.now(); - const { stream, data: explicitData, size: payloadSize } = await stage('request', request); - let size = 0; - const data = explicitData || await stage('receive', () => - jsonFromStream(stream, Number(payloadSize) || 0, state => { - size = state.completed; - progress.set({ - stage: 'receive', - progress: state - }); - }) - ); - - const beforeApplyTime = Date.now(); - await stage('apply', () => applyData(data)); - progress.set({ stage: 'done' }); - - return { - data, - size, - payloadSize: Number(payloadSize) || 0, - time: Date.now() - startTime, - loadTime: beforeApplyTime - startTime, - applyTime: Date.now() - beforeApplyTime - }; - } catch (error) { - progress.set({ stage: 'error', error }); - console.error('[Discovery] Error loading data:', error); - throw error; - } -} - -export function loadDataFromStream(request, applyData) { - const state = new Publisher(); - const timing = new Publisher(); - - return { - state, - timing, - // encapsulate logic into separate function since it's async, - // but we need to return publishers for progress tracking purposes - result: loadDataFromStreamInternal( - request, - applyData, - state, - timing - ) - }; -} - -export function loadDataFromFile(file, applyData) { - return loadDataFromStream( - () => { - if (file.type !== 'application/json') { - throw new Error('Not a JSON file'); - } - - return { - stream: streamFromBlob(file), - size: file.size - }; - }, - data => applyData(data, { - name: `Discover file: ${file.name}`, - createdAt: new Date(file.lastModified || Date.now()), - data - }) - ); -} - -export function loadDataFromEvent(event, applyData) { - const source = event.dataTransfer || event.target; - const file = source && source.files && source.files[0]; - - event.stopPropagation(); - event.preventDefault(); - - return loadDataFromFile(file, applyData); -} - -export function loadDataFromUrl(url, applyData, dataField) { - const explicitData = typeof url === 'string' ? undefined : url; - - return loadDataFromStream( - async () => { - const response = await fetch(explicitData ? 'data:application/json,{}' : url); - - if (response.ok) { - return explicitData ? { data: explicitData } : { - stream: response.body, - size: isSameOrigin(url) && !response.headers.get('content-encoding') - ? response.headers.get('content-length') - : response.headers.get('x-file-size') - }; - } - - let error = await response.text(); - - if (response.headers.get('content-type') === 'application/json') { - const json = JSON.parse(error); - error = json.error || json; - } - - error = new Error(error); - error.stack = null; - throw error; - }, - data => applyData( - dataField ? data[dataField] : data, - { - name: 'Discovery', - createdAt: dataField && data.createdAt ? new Date(Date.parse(data.createdAt)) : new Date(), - ...dataField ? data : { data: data } - } - ) - ); -} diff --git a/src/core/utils/index.js b/src/core/utils/index.js index 41b26415..8c852d4f 100644 --- a/src/core/utils/index.js +++ b/src/core/utils/index.js @@ -1,19 +1,22 @@ +import applyContainerStyles from './apply-container-styles.js'; import * as base64 from './base64.js'; import * as compare from './compare.js'; import copyText from './copy-text.js'; -import * as dataLoad from './data-load.js'; import debounce from './debounce.js'; import * as dom from './dom.js'; import * as html from './html.js'; import * as json from './json.js'; import * as layout from './layout.js'; +import * as dataLoad from './load-data.js'; import * as pattern from './pattern.js'; import * as persistent from './persistent.js'; import * as pointer from './pointer.js'; +import progressbar from './progressbar.js'; import safeFilterRx from './safe-filter-rx.js'; import * as size from './size.js'; export default { + applyContainerStyles, base64, ...compare, copyText, @@ -26,6 +29,7 @@ export default { pattern, persistent, ...pointer, + progressbar, safeFilterRx, ...size }; diff --git a/src/core/utils/json.js b/src/core/utils/json.js index 74c16079..79649e4f 100644 --- a/src/core/utils/json.js +++ b/src/core/utils/json.js @@ -1,4 +1,4 @@ -import jsonExt from '/gen/@discoveryjs/json-ext.js'; +import jsonExt from '@discoveryjs/json-ext'; export const { stringifyInfo: jsonStringifyInfo diff --git a/src/core/utils/load-data.js b/src/core/utils/load-data.js new file mode 100644 index 00000000..5a43145c --- /dev/null +++ b/src/core/utils/load-data.js @@ -0,0 +1,241 @@ +import Publisher from '../publisher.js'; +import { streamFromBlob } from './blob-polyfill.js'; +import parseChunked from '@discoveryjs/json-ext/src/parse-chunked'; + +export const dataSource = { + stream: loadDataFromStream, + event: loadDataFromEvent, + file: loadDataFromFile, + url: loadDataFromUrl, + push: loadDataFromPush +}; + +function isSameOrigin(url) { + try { + return new URL(url, location.origin).origin === location.origin; + } catch (e) { + return false; + } +} + +export function jsonFromStream(stream, totalSize, setProgress) { + const CHUNK_SIZE = 1024 * 1024; // 1MB + let size = 0; + + return parseChunked(async function*() { + const reader = stream.getReader(); + const streamStartTime = Date.now(); + + try { + while (true) { + const { done, value } = await reader.read(); + + if (done) { + await setProgress({ + done: true, + elapsed: Date.now() - streamStartTime, + units: 'bytes', + completed: size, + total: totalSize + }); + break; + } + + for (let offset = 0; offset < value.length; offset += CHUNK_SIZE) { + const chunk = offset === 0 && value.length - offset < CHUNK_SIZE + ? value + : value.slice(offset, offset + CHUNK_SIZE); + + size += chunk.length; + yield chunk; + + await setProgress({ + done: false, + elapsed: Date.now() - streamStartTime, + units: 'bytes', + completed: size, + total: totalSize + }); + } + } + } finally { + reader.releaseLock(); + } + }).then(data => ({ data, size })); +} + +async function loadDataFromStreamInternal(request, progress) { + const stage = async (stage, fn) => { + await progress.asyncSet({ stage }); + return await fn(); + }; + + try { + const startTime = Date.now(); + const { stream, data: explicitData, size: payloadSize } = await stage('request', request); + const requestTime = Date.now() - startTime; + const { data, size } = explicitData || await stage('receive', () => + jsonFromStream(stream, Number(payloadSize) || 0, state => progress.asyncSet({ + stage: 'receive', + progress: state + })) + ); + + await progress.asyncSet({ stage: 'done' }); + + return { + data, + size, + payloadSize: Number(payloadSize) || 0, + time: Date.now() - startTime, + requestTime + }; + } catch (error) { + console.error('[Discovery] Error loading data:', error); + await progress.asyncSet({ stage: 'error', error }); + throw error; + } +} + +export function loadDataFromStream(request, prepare, ext) { + const state = new Publisher(); + + return { + state, + // encapsulate logic into separate function since it's async, + // but we need to return publisher for progress tracking purposes + result: loadDataFromStreamInternal(request, state) + .then(res => ({ + ...res, + ...prepare(res.data) + })), + ...ext + }; +} + +export function loadDataFromFile(file) { + return loadDataFromStream( + () => { + if (file.type !== 'application/json') { + throw new Error('Not a JSON file'); + } + + return { + stream: streamFromBlob(file), + size: file.size + }; + }, + data => ({ + data, + context: { + name: `File: ${file.name}`, + createdAt: new Date(file.lastModified || Date.now()), + data + } + }) + ); +} + +export function loadDataFromEvent(event) { + const source = event.dataTransfer || event.target; + const file = source && source.files && source.files[0]; + + event.stopPropagation(); + event.preventDefault(); + + return loadDataFromFile(file); +} + +export function loadDataFromUrl(url, dataField) { + const explicitData = typeof url === 'string' ? undefined : url; + + return loadDataFromStream( + async () => { + const response = await fetch(explicitData ? 'data:application/json,{}' : url); + + if (response.ok) { + return explicitData ? { data: explicitData } : { + stream: response.body, + size: isSameOrigin(url) && !response.headers.get('content-encoding') + ? response.headers.get('content-length') + : response.headers.get('x-file-size') + }; + } + + const contentType = response.headers.get('content-type') || ''; + let error = await response.text(); + + if (contentType.toLowerCase().startsWith('application/json')) { + const json = JSON.parse(error); + error = json.error || json; + } + + error = new Error(error); + error.stack = null; + throw error; + }, + data => ({ + data: dataField ? data[dataField] : data, + context: { + name: 'Discovery', + createdAt: dataField && data.createdAt ? new Date(Date.parse(data.createdAt)) : new Date(), + ...dataField ? data : { data } + } + }) + ); +} + +export function loadDataFromPush(size, createdAt) { + let controller; + + return loadDataFromStream( + () => ({ + size, + stream: new ReadableStream({ + start(controller_) { + controller = controller_; + }, + cancel() { + controller = null; + } + }) + }), + data => ({ + data: data.data, + context: { + name: data.name || 'Discovery', + createdAt: createdAt || data.createdAt || Date.now(), + data: data.data + } + }), + { + push(chunk) { + controller.enqueue(chunk); + }, + finish() { + controller.close(); + controller = null; + } + } + ); +} + +export function syncLoaderWithProgressbar({ result, state }, progressbar) { + return new Promise((resolve, reject) => { + const unsubscribeLoader = state.subscribeSync(({ stage, progress, error }) => { + if (error) { + unsubscribeLoader(); + reject(error); + return; + } + + if (stage === 'done') { + unsubscribeLoader(); + resolve(result); + return; + } + + progressbar.setState({ stage, progress }); + }); + }); +} diff --git a/src/core/utils/pointer.js b/src/core/utils/pointer.js index 9ebcf5bf..a693a933 100644 --- a/src/core/utils/pointer.js +++ b/src/core/utils/pointer.js @@ -7,7 +7,7 @@ const lastPointerXYPublisher = new Publisher({ x: 0, y: 0 }, (newCoords, oldCoor document.addEventListener( 'pointermove', - ({ x, y}) => lastPointerXYPublisher.set({ x, y }), + ({ x, y }) => lastPointerXYPublisher.set({ x, y }), passiveCaptureOptions ); diff --git a/src/core/utils/progressbar.js b/src/core/utils/progressbar.js new file mode 100644 index 00000000..9a061aa8 --- /dev/null +++ b/src/core/utils/progressbar.js @@ -0,0 +1,195 @@ +const style = ` +:host { + position: absolute; + margin: 35px 40px; + width: 100%; + max-width: 300px; + z-index: 1; + transition: opacity .15s var(--appearance-delay, 0ms); + pointer-events: none; +} +:host(.init) { + opacity: 0; +} +.progress { + content: ''; + display: block; + position: relative; + overflow: hidden; + margin-top: 4px; + box-sizing: border-box; + height: 3px; + background: rgba(198, 198, 198, 0.3); + border-radius: 2px; +} +.progress::before { + content: ''; + display: block; + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + transform: scaleX(var(--progress, 0)); + transform-origin: left; + /* transition: transform .2s; */ /* since Chrome (tested on 85) freezes transition during js loop */ + background-color: #1f7ec5; +}`; + +export const loadStages = { + request: { + value: 0.0, + title: 'Awaiting data' + }, + receive: { + value: 0.1, + title: 'Receiving data' + }, + parse: { + value: 0.9, + title: 'Processing data (parse)' + }, + prepare: { + value: 0.925, + title: 'Processing data (prepare)' + }, + initui: { + value: 0.975, + title: 'Preparing UI' + }, + done: { + value: 1.0, + title: 'Done!' + } +}; +Object.values(loadStages).forEach((item, idx, array) => { + item.duration = (idx !== array.length - 1 ? array[idx + 1].value : 0) - item.value; +}); + +const letRepaintIfNeeded = async () => { + await new Promise(resolve => setTimeout(resolve, 1)); + + if (!document.hidden) { + return Promise.race([ + new Promise(requestAnimationFrame), + new Promise(resolve => setTimeout(resolve, 8)) + ]); + } +}; + +export default class Progressbar { + constructor({ onTiming, delay }) { + this.finished = false; + this.awaitRepaint = null; + this.lastStage = null; + this.lastStageStart = null; + this.timings = []; + this.onTiming = typeof onTiming === 'function' ? onTiming : () => {}; + + this.el = document.createElement('div'); + this.shadowRoot = this.el.attachShadow({ mode: 'closed' }); + + this.el.className = 'progressbar init'; + this.el.style.setProperty('--appearance-delay', `${delay === true ? 200 : Number(delay) || 0}ms`); + this.shadowRoot.innerHTML = + `` + + '
' + + '
'; + } + + async setState(state) { + const { stage, progress, error } = state; + + if (error || this.finished) { + return; + } + + + const { value, title, duration } = loadStages[stage]; + const stageChanged = stage !== this.lastStage; + const now = Date.now(); + let progressValue = 0; + let progressLabel; + + if (!this.lastStage) { + this.startTime = now; + requestAnimationFrame(() => this.el.classList.remove('init')); + } + + if (stageChanged) { + if (this.lastStageStart !== null) { + const entry = { + stage: this.lastStage, + title: loadStages[this.lastStage].title, + duration: now - this.lastStageStart + }; + + this.timings.push(entry); + this.onTiming(entry); + } + + this.lastStage = stage; + this.lastStageStart = now; + this.awaitRepaint = now; + } + + if (progress) { + const { + done, + elapsed, + units, + completed, + total + } = progress; + + if (total) { + progressValue = done ? 1.0 : completed / total; + progressLabel = units === 'bytes' + ? Math.round(progressValue * 100) + '%' + : `${completed}/${total}`; + } else { + progressValue = done ? 1.0 : 0.1 + Math.min(0.9, elapsed / 20000); + progressLabel = units === 'bytes' + ? (completed / (1024 * 1024)).toFixed(1) + 'MB' + : completed; + } + } + + this.el.style.setProperty('--progress', value + progressValue * duration); + this.shadowRoot.querySelector('.title').textContent = progressLabel + ? `${title} (${progressLabel})...` + : stage !== 'done' + ? `${title}...` + : title; + + if (stageChanged || (now - this.awaitRepaint > 65 && now - this.lastStageStart > 200)) { + await letRepaintIfNeeded(); + this.awaitRepaint = Date.now(); + } + } + + finish() { + if (!this.finished && this.lastStageStart !== null) { + const stage = this.lastStage; + const duration = Date.now() - this.lastStageStart; + const title = loadStages[stage].title; + const entry = { stage, title, duration }; + + this.timings.push(entry); + this.onTiming(entry); + + this.onTiming({ + stage: 'done', + title: loadStages.done.title, + duration: Date.now() - this.startTime + }); + } + + this.finished = true; + } + + dispose() { + this.finish(); + this.el.remove(); + } +} diff --git a/src/core/view.js b/src/core/view.js index 587c7032..4d936680 100644 --- a/src/core/view.js +++ b/src/core/view.js @@ -526,9 +526,7 @@ export default class ViewRenderer extends Dict { const ignoreNodes = new Set(ignore || []); const result = []; - for (const root of this.host.getDomRoots()) { - collectViewTree(root, { parent: null, children: result }, ignoreNodes); - } + collectViewTree(this.host.dom.container, { parent: null, children: result }, ignoreNodes); return result; } diff --git a/src/inspector/index.css b/src/inspector/index.css index d4e652b2..dfab0809 100644 --- a/src/inspector/index.css +++ b/src/inspector/index.css @@ -1,5 +1,5 @@ -@import 'style/overlay.css'; -@import 'style/popup.css'; -@import 'style/sidebar.css'; -@import 'style/toolbar.css'; -@import 'style/content.css'; +@import './style/overlay.css'; +@import './style/popup.css'; +@import './style/sidebar.css'; +@import './style/toolbar.css'; +@import './style/content.css'; diff --git a/src/inspector/index.js b/src/inspector/index.js index 3fbe244b..45776687 100644 --- a/src/inspector/index.js +++ b/src/inspector/index.js @@ -127,12 +127,12 @@ export default (host) => { }, { maxWait: 0, wait: 50 }); const updateState = () => { const { x, y } = pointerXY.value; - onHover([...document.elementsFromPoint(x | 0, y | 0) || []] + onHover([...host.dom.container.parentNode.elementsFromPoint(x | 0, y | 0) || []] .find(el => viewByEl.has(el)) || null ); }; const keyPressedEventListener = (e) => { - if (e.key === 'Escase' || e.keyCode === 27 || e.which === 27) { + if (e.key === 'Escape' || e.keyCode === 27 || e.which === 27) { host.inspectMode.set(false); } }; @@ -446,23 +446,23 @@ export default (host) => { // quick inspection // let inspectByQuick = false; - document.addEventListener('keydown', quickInspect, true); - document.addEventListener('keyup', quickInspect, true); - function quickInspect(e) { - if (e.key === 'Alt' || e.keyCode === 18 || e.which === 18) { - if (e.type === 'keydown') { - if (!inspectorActivated) { - inspectByQuick = true; - cancelHintEl.dataset.alt = true; - host.inspectMode.set(true); - } - } else { - if (inspectByQuick && !selectedTreeViewLeaf) { - inspectByQuick = false; - delete cancelHintEl.dataset.alt; - host.inspectMode.set(false); - } - } - } - } + // document.addEventListener('keydown', quickInspect, true); + // document.addEventListener('keyup', quickInspect, true); + // function quickInspect(e) { + // if (e.key === 'Alt' || e.keyCode === 18 || e.which === 18) { + // if (e.type === 'keydown') { + // if (!inspectorActivated) { + // inspectByQuick = true; + // cancelHintEl.dataset.alt = true; + // host.inspectMode.set(true); + // } + // } else { + // if (inspectByQuick && !selectedTreeViewLeaf) { + // inspectByQuick = false; + // delete cancelHintEl.dataset.alt; + // host.inspectMode.set(false); + // } + // } + // } + // } }; diff --git a/src/inspector/style/content.css b/src/inspector/style/content.css index 404eb1b4..23a06ba6 100644 --- a/src/inspector/style/content.css +++ b/src/inspector/style/content.css @@ -35,7 +35,7 @@ color: #444; border-bottom: 2px solid #ddd; } -.discovery-root-darkmode.discovery-inspect-details-popup .content-section::before { +.discovery-root-darkmode .discovery-inspect-details-popup .content-section::before { color: inherit; text-shadow: 1px 1px 0 rgba(0, 0, 0, .25); border-bottom: 2px solid #666; diff --git a/src/inspector/style/popup.css b/src/inspector/style/popup.css index 32d29f53..62b68ae2 100644 --- a/src/inspector/style/popup.css +++ b/src/inspector/style/popup.css @@ -20,7 +20,7 @@ --discovery-link-underline-color: #0002; --discovery-view-root-highlight-color: rgba(106, 0, 204, 25%); } -.discovery-root-darkmode.discovery-inspect-details-popup { +.discovery-root-darkmode .discovery-inspect-details-popup { background: rgba(36, 36, 36, var(--discovery-background-alpha)); --discovery-background-alpha: .92; @@ -53,7 +53,7 @@ -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px); } - .discovery-root-darkmode.discovery-inspect-details-popup { + .discovery-root-darkmode .discovery-inspect-details-popup { --discovery-background-alpha: .4; } } diff --git a/src/lib.css b/src/lib.css index 32c45e25..7ccb83d7 100644 --- a/src/lib.css +++ b/src/lib.css @@ -2,7 +2,6 @@ @import url('./views/index.css'); @import url('./widget/widget.css'); @import url('./inspector/index.css'); -@import url('./views/index-complex.css'); @import url('./app/app.css'); .discovery .buildin-view-config-error { diff --git a/src/lib.js b/src/lib.js index 2c3a9e44..8476f1cd 100644 --- a/src/lib.js +++ b/src/lib.js @@ -1,7 +1,6 @@ -import Widget from './widget/index.js'; import App from './app/index.js'; +import Widget from './widget/index.js'; import * as views from './views/index.js'; -import * as complexViews from './views/index-complex.js'; import * as pages from './pages/index.js'; import router from './core/router.js'; import utils from './core/utils/index.js'; @@ -10,7 +9,6 @@ export { Widget, App, views, - complexViews, pages, router, utils diff --git a/src/preloader.js b/src/preloader.js new file mode 100644 index 00000000..86b6ba74 --- /dev/null +++ b/src/preloader.js @@ -0,0 +1,52 @@ +import Progressbar from './core/utils/progressbar.js'; +import { dataSource, syncLoaderWithProgressbar } from './core/utils/load-data.js'; +import applyContainerStyles from './core/utils/apply-container-styles.js'; + +function defaultProgressbar() { + return new Progressbar({ + delay: 300, + onTiming: ({ title, duration }) => + console.log(`[Discovery/loader] ${title} – ${duration}ms`) + }); +} + +export function preloader(config = {}) { + const container = config.container || document.body; + const progressbar = config.progressbar || defaultProgressbar(); + + if (config.dataSource && !dataSource.hasOwnProperty(config.dataSource)) { + throw new Error(`dataSource "${config.dataSource}" is not supported`); + } + + applyContainerStyles(container, config); + + const loadData = dataSource[config.dataSource || 'url']; + const loading = config.dataSource === 'push' + ? loadData() + : config.data + ? loadData(config.data, 'data') + : { + result: Promise.resolve(config) + }; + + if (loading.push) { + window.discoveryLoader = { + push: loading.push, + finish: () => { + delete window.discoveryLoader; + loading.finish(); + } + }; + } + + if (loading.state) { + syncLoaderWithProgressbar(loading, progressbar); + } + + container.append(progressbar.el); + + return Object.assign( + loading.result, + { progressbar } + ); +} diff --git a/src/views/_usage.js b/src/views/_usage.js index 87909c68..fd380f3f 100644 --- a/src/views/_usage.js +++ b/src/views/_usage.js @@ -56,18 +56,19 @@ export default function(discovery) { { content: { view: 'render', config: 'beforeDemo', - context: '{ __demoContext: true }' + context: '{ __demoContext: true, ...(#.viewDef | { name, group, options }) }' } } ] }, { view: 'block', + when: 'demo or view', className: 'usage-render', postRender: (el, { onInit }) => onInit(el, 'root'), content: { view: 'render', config: 'demo or view', - context: '{ __demoContext: true }' + context: '{ __demoContext: true, ...(#.viewDef | { name, group, options }) }' } }, { @@ -78,13 +79,14 @@ export default function(discovery) { { content: { view: 'render', config: 'afterDemo', - context: '{ __demoContext: true }' + context: '{ __demoContext: true, ...(#.viewDef | { name, group, options }) }' } } ] } ], content: { view: 'tabs', + when: 'source != false', className: 'usage-sources', name: 'code', tabs: [ @@ -142,7 +144,8 @@ export default function(discovery) { ? { examples: options.usage } : options.usage, name, - group + group, + options }; }, content: [ @@ -150,7 +153,7 @@ export default function(discovery) { renderDemo, { view: 'list', - data: 'examples', + data: 'examples.({ ..., viewDef: @ })', whenData: true, itemConfig: { className: 'usage-section' diff --git a/src/views/badges.css b/src/views/badges.css index 8b6cbb7b..9f85aee7 100644 --- a/src/views/badges.css +++ b/src/views/badges.css @@ -50,7 +50,7 @@ border-radius: 8px 0 0 8px; background-color: rgba(0, 0, 0, .12); } -.view-pill-badge > .prefix { +.view-pill-badge > .postfix { padding: 1px 6px 3px; margin: -1px -6px -3px 6px; border-radius: 0 8px 8px 0; diff --git a/src/views/checkbox.css b/src/views/checkbox.css index 5e59af47..61bd427c 100644 --- a/src/views/checkbox.css +++ b/src/views/checkbox.css @@ -27,7 +27,7 @@ .view-checkbox > input:checked { border-color: transparent; background-color: rgba(0, 121, 232, 0.68); - background-image: url(checkbox.svg); + background-image: url('./checkbox.svg'); } .view-checkbox > input:focus { box-shadow: 0 0 1px 3px rgba(0, 170, 255, .2); diff --git a/src/views/dropdown.css b/src/views/dropdown.css index 54a25712..5aee45eb 100644 --- a/src/views/dropdown.css +++ b/src/views/dropdown.css @@ -27,7 +27,7 @@ position: absolute; width: 1em; height: 1em; - background-image: url('select-arrow.svg'); + background-image: url('./select-arrow.svg'); background-size: 1em; background-position: center; cursor: pointer; diff --git a/src/views/editors-hint.js b/src/views/editors-hint.js index 055b4077..323c91c1 100644 --- a/src/views/editors-hint.js +++ b/src/views/editors-hint.js @@ -5,7 +5,7 @@ /* eslint-env browser */ -import CodeMirror from '/gen/codemirror.js'; // FIXME: generated file to make it local +import CodeMirror from 'codemirror'; const POPUP_CLASS = 'discovery-view-editor-hints-popup'; const HINT_CLASS = 'discovery-view-editor-hint'; @@ -194,7 +194,6 @@ class Widget { const hintsElClassNames = [ POPUP_CLASS, completion.cm.options.theme, - completion.options.isolateStyleMarker, completion.options.darkmode ].filter(Boolean); diff --git a/src/views/editors.css b/src/views/editors.css index 9f106f7c..520532cf 100644 --- a/src/views/editors.css +++ b/src/views/editors.css @@ -1,5 +1,5 @@ -@import url('/node_modules/codemirror/lib/codemirror.css'); -@import url('/node_modules/codemirror/theme/neo.css'); +@import url('codemirror/lib/codemirror.css'); +@import url('codemirror/theme/neo.css'); @import url('./editors-hint.css'); .discovery-editor .CodeMirror { diff --git a/src/views/editors.js b/src/views/editors.js index b611dfdb..9e379494 100644 --- a/src/views/editors.js +++ b/src/views/editors.js @@ -3,7 +3,8 @@ import { createElement } from '../core/utils/dom.js'; import { escapeHtml } from '../core/utils/html.js'; import Emitter from '../core/emitter.js'; -import CodeMirror from '/gen/codemirror.js'; // FIXME: generated file to make it local +import CodeMirror from 'codemirror'; +import 'codemirror/mode/javascript/javascript'; import './editors-hint.js'; function renderQueryAutocompleteItem(el, self, { entry: { value, current, type }}) { @@ -41,7 +42,9 @@ class Editor extends Emitter { indentUnit: 0, showHintOptions: { hint, - isolateStyleMarker: this.isolateStyleMarker, + get container() { + return self.container; + }, get darkmode() { return self.darkmode.value ? 'darkmode' : false; } @@ -88,7 +91,6 @@ class Editor extends Emitter { this.cm.focus(); } - get isolateStyleMarker() {} get darkmode() {} } @@ -216,20 +218,17 @@ CodeMirror.defineMode('discovery-view', function(config, options) { export default function(discovery) { Object.assign(discovery.view, { QueryEditor: class extends QueryEditor { - get isolateStyleMarker() { - return discovery.isolateStyleMarker; - } get darkmode() { return discovery.darkmode; } + get container() { + return discovery.dom.container; + } }, ViewEditor: class extends ViewEditor { isViewDefined(name) { return discovery.view.isDefined(name); } - get isolateStyleMarker() { - return discovery.isolateStyleMarker; - } get darkmode() { return discovery.darkmode; } diff --git a/src/views/expand.css b/src/views/expand.css index 9b76d2c2..cf1bb62a 100644 --- a/src/views/expand.css +++ b/src/views/expand.css @@ -41,7 +41,7 @@ background-image: linear-gradient(0deg, rgba(150, 150, 150, .15), rgba(150, 150, 150, .15)); } .view-expand > .header > .trigger::before { - background: url(expand.svg) no-repeat center; + background: url(./expand.svg) no-repeat center; background-size: 12px; transition: transform .15s ease-in; width: 12px; diff --git a/src/views/index-complex.css b/src/views/index-complex.css deleted file mode 100644 index 4f26e72b..00000000 --- a/src/views/index-complex.css +++ /dev/null @@ -1 +0,0 @@ -@import url('./source.css'); diff --git a/src/views/index-complex.js b/src/views/index-complex.js deleted file mode 100644 index e0db6c24..00000000 --- a/src/views/index-complex.js +++ /dev/null @@ -1,2 +0,0 @@ -// These views will be extracted in the future -export { default as source } from './source.js'; diff --git a/src/views/index.css b/src/views/index.css index c5183d5c..d1315a93 100644 --- a/src/views/index.css +++ b/src/views/index.css @@ -27,6 +27,7 @@ @import url('./section.css'); @import url('./select.css'); @import url('./signature.css'); +@import url('./source.css'); @import url('./struct.css'); @import url('./table-cell.css'); @import url('./table-row.css'); diff --git a/src/views/index.js b/src/views/index.js index 48f41314..25766173 100644 --- a/src/views/index.js +++ b/src/views/index.js @@ -30,6 +30,7 @@ export { default as popup } from './popup.js'; export { default as section } from './section.js'; export { default as select } from './select.js'; export { default as signature } from './signature.js'; +export { default as source } from './source.js'; export { default as struct } from './struct.js'; export { default as switch } from './switch.js'; export { default as tableCell } from './table-cell.js'; diff --git a/src/views/markdown.js b/src/views/markdown.js index 241f4278..be99df9b 100644 --- a/src/views/markdown.js +++ b/src/views/markdown.js @@ -1,6 +1,6 @@ /* eslint-env browser */ +import marked from 'marked'; import usage from './markdown.usage.js'; -import marked from '/gen/marked.js'; import { escapeHtml } from '../core/utils/html.js'; class CustomRenderer extends marked.Renderer { diff --git a/src/views/popup.css b/src/views/popup.css index ad77db2c..024845af 100644 --- a/src/views/popup.css +++ b/src/views/popup.css @@ -10,11 +10,7 @@ min-height: 20px; border: 1px solid rgba(176, 176, 176, 0.65); box-shadow: 3px 3px 18px rgba(0, 0, 0, .2); - - --discovery-background-color: white; -} -.discovery-view-popup.discovery-root-darkmode { - --discovery-background-color: #323232; + background-color: var(--discovery-background-color); } .discovery-view-popup.inspect { z-index: 2002; diff --git a/src/views/popup.js b/src/views/popup.js index ef7de645..28d03b11 100644 --- a/src/views/popup.js +++ b/src/views/popup.js @@ -36,13 +36,14 @@ export default function(discovery) { const hoverTriggerInstances = []; const inspectorLockedInstances = new Set(); let globalListeners = null; - const addGlobalHoverListeners = () => { + let hideAllPopups = null; + const addHostElHoverListeners = () => { if (globalListeners !== null) { return; } globalListeners = [ - discovery.addGlobalEventListener('mouseenter', ({ target }) => { + discovery.addHostElEventListener('mouseenter', ({ target }) => { if (target === document) { return; } @@ -73,7 +74,7 @@ export default function(discovery) { } }, passiveCaptureOptions), - discovery.addGlobalEventListener('mouseleave', ({ target }) => { + discovery.addHostElEventListener('mouseleave', ({ target }) => { for (const instance of hoverTriggerInstances) { if (instance.lastHoverTriggerEl && instance.lastHoverTriggerEl === target) { instance.lastHoverTriggerEl = null; @@ -82,7 +83,27 @@ export default function(discovery) { } }, passiveCaptureOptions), + discovery.addGlobalEventListener('scroll', (event) => { + hideAllPopups = setTimeout(() => { + hideIfEventOutside(event); + }, 0); + }, true), + + discovery.addHostElEventListener('scroll', (event) => { + clearTimeout(hideAllPopups); + hideIfEventOutside(event); + }), + discovery.addGlobalEventListener('click', (event) => { + hideAllPopups = setTimeout(() => { + hideIfEventOutside(event); + }, 0); + }, true), + + discovery.addHostElEventListener('click', (event) => { + clearTimeout(hideAllPopups); + hideIfEventOutside(event); + for (const instance of hoverTriggerInstances) { if (instance.options.hoverPin === 'trigger-click') { if (instance.lastHoverTriggerEl && instance.lastTriggerEl.contains(event.target)) { @@ -120,8 +141,7 @@ export default function(discovery) { }; this.el = document.createElement('div'); - this.el.classList.add('discovery-root', 'discovery-view-popup', discovery.isolateStyleMarker); - this.el.dataset.discoveryInstanceId = discovery.instanceId; + this.el.classList.add('discovery-view-popup'); this.hide = this.hide.bind(this); this.hideTimer; @@ -145,7 +165,7 @@ export default function(discovery) { this.el.dataset.pinMode = this.options.hoverPin || 'none'; hoverTriggerInstances.push(this); - addGlobalHoverListeners(); + addHostElHoverListeners(); } } @@ -166,11 +186,10 @@ export default function(discovery) { } show(triggerEl, render = this.options.render) { - const hostEl = document.body; + const hostEl = discovery.dom.container; this.hideTimer = clearTimeout(this.hideTimer); this.relatedPopups.forEach(related => related.hide()); - this.el.classList.toggle('discovery-root-darkmode', discovery.darkmode.value); this.el.classList.toggle('inspect', discovery.inspectMode.value); if (typeof render === 'function') { @@ -190,12 +209,9 @@ export default function(discovery) { if (!this.visible) { openedPopups.push(this); - discovery.view.setViewRoot(this.el, 'popup', { props: this.options }); if (openedPopups.length === 1) { window.addEventListener('resize', hideOnResize); - document.addEventListener('scroll', hideIfEventOutside, passiveCaptureOptions); - document.addEventListener('click', hideIfEventOutside, true); } } @@ -210,7 +226,7 @@ export default function(discovery) { return; } - const hostEl = document.body; + const hostEl = discovery.dom.container; const offsetParent = getOffsetParent(hostEl.firstChild); const viewport = getViewportRect(window, offsetParent); const { x: pointerX, y: pointerY } = pointerXY.value; @@ -288,8 +304,6 @@ export default function(discovery) { if (openedPopups.length === 0) { window.removeEventListener('resize', hideOnResize); - document.removeEventListener('scroll', hideIfEventOutside, passiveCaptureOptions); - document.removeEventListener('click', hideIfEventOutside, true); } } } diff --git a/src/views/source.css b/src/views/source.css index d2d781eb..5b67ea86 100644 --- a/src/views/source.css +++ b/src/views/source.css @@ -1,5 +1,3 @@ -@import url('/node_modules/prismjs/themes/prism.css'); - .view-source { padding: 8px; overflow: auto; @@ -100,32 +98,34 @@ .view-source .token.number { color: var(--discovery-fmt-number-color); } -.view-source .token.property, -.view-source .token.tag, -.view-source .token.constant, -.view-source .token.symbol, -.view-source .token.deleted { - color: var(--discovery-fmt-property-color); -} .view-source .token.selector, -.view-source .token.attr-name, +.view-source .token.attr-value, .view-source .token.string, .view-source .token.char, .view-source .token.builtin, .view-source .token.inserted { color: var(--discovery-fmt-string-color); } +.view-source .token.property, +.view-source .token.tag, +.view-source .token.constant, +.view-source .token.symbol, +.view-source .token.deleted { + color: var(--discovery-fmt-property-color); +} .view-source .token.operator, .view-source .token.entity, .view-source .token.url { color: #9a6e3a; } .view-source .token.atrule, -.view-source .token.attr-value, .view-source .token.keyword { color: var(--discovery-fmt-keyword-color); } .view-source .token.function, +.view-source .token.attribute, +.view-source .token.attr-name, +.view-source .token.qualifier, .view-source .token.class-name { color: #DD4A68; } diff --git a/src/views/source.js b/src/views/source.js index a6ecbda4..f1c08804 100644 --- a/src/views/source.js +++ b/src/views/source.js @@ -1,26 +1,68 @@ /* eslint-env browser */ -import hitext from '/gen/hitext.js'; -import hitextPrismjs from '/gen/hitext-prismjs.js'; -import CodeMirror from '/gen/codemirror.js'; +import hitext from 'hitext'; +import CodeMirror from 'codemirror'; +import 'codemirror/mode/javascript/javascript'; +import 'codemirror/mode/css/css'; +import 'codemirror/mode/xml/xml'; +import { equal } from '../core/utils/compare'; import usage from './source.usage.js'; const maxSourceSizeToHighlight = 100 * 1024; -const mimeToSyntax = new Map(Object.entries({ - 'application/javascript': 'javascript', - 'application/x-httpd-php': 'php', - 'application/xml': 'xml', - 'application/json': 'json', - 'text/html': 'html', - 'text/css': 'css', - 'text/stylus': 'stylus', - 'text/yaml': 'yaml', - 'image/svg+xml': 'svg' -})); +CodeMirror.modeToMime = { + js: 'application/javascript', + ts: 'application/typescript', + typescript: 'application/typescript', + json: 'application/json', + html: 'text/html', + css: 'text/css', + scss: 'text/x-scss', + less: 'text/x-less' +}; + +function getSupported() { + const mimeMode = new Map(); + const resolveMode = ref => { + const mode = CodeMirror.resolveMode(ref); + const key = [...mimeMode.keys()].find(key => equal(key, mode)); + + if (key) { + return key; + } + + mimeMode.set(mode, { + mime: new Set(), + name: new Set() + }); + + return mode; + }; + + for (const [alias, mime] of Object.entries(CodeMirror.modeToMime)) { + const mode = mimeMode.get(resolveMode(mime)); + + mode.mime.add(mime); + mode.name.add(alias); + } + + for (const [mime, alias] of Object.entries(CodeMirror.mimeModes)) { + const mode = mimeMode.get(resolveMode(mime)); + + mode.mime.add(mime); + if (typeof alias === 'string') { + mode.name.add(alias); + } + } + + return [...mimeMode.values()].map(syntax => ({ + name: [...syntax.name], + mime: [...syntax.mime] + })); +} function codeMirrorHighlight(modespec, discovery) { const mode = CodeMirror.getMode(CodeMirror.defaults, { - name: modespec, + name: CodeMirror.modeToMime[modespec] || modespec, isDiscoveryViewDefined: name => discovery.view.isDefined(name) }); @@ -76,7 +118,16 @@ const refsPrinter = { export default function(discovery) { discovery.view.define('source', function(el, config, data) { const decorators = []; - const { mime, binary, size, syntax, content, refs, error, disabled } = data; + const { + mime, // deprecated, syntax = name or mime + binary, + size, + syntax, + content, + refs, + error, + disabled + } = data; if (disabled) { el.classList.add('disabled'); @@ -96,24 +147,16 @@ export default function(discovery) { // prevent syntax highlighting for sources over maxSourceSizeToHighlight to avoid page freeze if (content.length < maxSourceSizeToHighlight) { - let highlightSyntax = syntax || mimeToSyntax.get(mime); - - if (highlightSyntax) { - decorators.push( - highlightSyntax === 'discovery-view' || highlightSyntax === 'discovery-query' - ? [codeMirrorHighlight(highlightSyntax, discovery), { - html: { - open({ data: type }) { - return ''; - }, - close() { - return ''; - } - } - }] - : hitextPrismjs(highlightSyntax) - ); - } + decorators.push([codeMirrorHighlight(syntax || mime, discovery), { + html: { + open({ data: type }) { + return ''; + }, + close() { + return ''; + } + } + }]); } if (Array.isArray(refs)) { @@ -144,5 +187,10 @@ export default function(discovery) { hitext(decorators, 'html')(content) + ''; } - }, { usage }); + }, { + usage, + get syntaxes() { + return getSupported(); + } + }); } diff --git a/src/views/source.usage.js b/src/views/source.usage.js index fe5df999..c860f29e 100644 --- a/src/views/source.usage.js +++ b/src/views/source.usage.js @@ -2,5 +2,23 @@ export default { demo: { view: 'source', data: { content: 'var hello = "world";', syntax: 'js' } - } + }, + examples: [ + { + title: 'Supported syntaxes', + beforeDemo: [ + 'md:"Following values (for both `name` and `mime`) are supported for `syntax` option:"', + { + view: 'table', + data: '#.options.syntaxes', + cols: { + name: { content: 'comma-list:name' }, + mime: { content: 'comma-list:mime' } + } + }, + 'md:"More syntaxes may be added via `import \'codemirror/mode/[name]/[name]\';`"' + ], + source: false + } + ] }; diff --git a/src/views/struct/index.js b/src/views/struct/index.js index 55b54a86..237a5e32 100644 --- a/src/views/struct/index.js +++ b/src/views/struct/index.js @@ -434,7 +434,7 @@ export default function(discovery) { }; // single event handler for all `struct` view instances - discovery.addGlobalEventListener('click', clickHandler, false); + discovery.addHostElEventListener('click', clickHandler, false); discovery.view.define('struct', function(el, config, data) { const { expanded, limit, limitCollapsed, annotations } = config; // FIXME: add limit option diff --git a/src/views/table-cell.css b/src/views/table-cell.css index 7be3424e..c5b8ba63 100644 --- a/src/views/table-cell.css +++ b/src/views/table-cell.css @@ -24,7 +24,7 @@ transform: rotate(-90deg); transition: .12s ease-in; transition-property: transform, opacity; - background-image: url(table-cell-details-expand.svg); + background-image: url('./table-cell-details-expand.svg'); background-repeat: no-repeat; background-position: center; background-size: 9px; diff --git a/src/views/tree-leaf.js b/src/views/tree-leaf.js index f8f9e9fd..51907597 100644 --- a/src/views/tree-leaf.js +++ b/src/views/tree-leaf.js @@ -22,7 +22,7 @@ export default function(discovery) { }; // single event handler for all `tree-leaf` view instances - discovery.addGlobalEventListener('click', clickHandler, false); + discovery.addHostElEventListener('click', clickHandler, false); discovery.view.define('tree-leaf', async function(el, config, data, context) { const { expanded, content = 'text', itemConfig, collapsible = true, last, hasChildren, children, limit, onToggle } = config; diff --git a/src/widget/index.js b/src/widget/index.js index 90d391cd..d5214472 100644 --- a/src/widget/index.js +++ b/src/widget/index.js @@ -11,10 +11,10 @@ import * as pages from '../pages/index.js'; import { createElement } from '../core/utils/dom.js'; import attachViewInspector from '../inspector/index.js'; import { equal, fuzzyStringCompare } from '../core/utils/compare.js'; -import { DarkModeController } from './darkmode.js'; +import { DarkModeController } from '../core/darkmode.js'; import { WidgetNavigation } from './nav.js'; import * as lib from '../lib.js'; -import jora from '/gen/jora.js'; // FIXME: generated file to make it local +import jora from 'jora'; const lastSetDataPromise = new WeakMap(); const lastQuerySuggestionsStat = new WeakMap(); @@ -47,17 +47,6 @@ function getPageMethod(host, pageId, name, fallback) { : fallback; } -function genUniqueId(len = 16) { - const base36 = val => Math.round(val).toString(36); - let uid = base36(10 + 25 * Math.random()); // uid should starts with alpha - - while (uid.length < len) { - uid += base36(Date.now() * Math.random()); - } - - return uid.substr(0, len); -} - function createDataExtensionApi(instance) { const objectMarkers = new ObjectMarker(); const linkResolvers = []; @@ -165,6 +154,15 @@ export default class Widget extends Emitter { this.lib = lib; // FIXME: temporary solution to expose discovery's lib API this.options = options || {}; + const { + darkmode = 'disabled', + darkmodePersistent = false + } = this.options; + + this.darkmode = new DarkModeController(darkmode, darkmodePersistent); + this.inspectMode = new Publisher(false); + this.initDom(); + this.view = new ViewRenderer(this); this.nav = new WidgetNavigation(this); this.preset = new PresetRenderer(this.view); @@ -196,17 +194,6 @@ export default class Widget extends Emitter { this.pageParams = {}; this.pageHash = this.encodePageHash(this.pageId, this.pageRef, this.pageParams); - const { - darkmode = 'disabled', - darkmodePersistent = false - } = this.options; - this.darkmode = new DarkModeController(darkmode, darkmodePersistent); - - this.instanceId = genUniqueId(); - this.isolateStyleMarker = this.options.isolateStyleMarker || 'style-boundary-8H37xEyN'; - this.inspectMode = new Publisher(false); - this.dom = {}; - this.apply(views); this.apply(pages); @@ -218,7 +205,9 @@ export default class Widget extends Emitter { this.apply(this.options.extensions); } + this.nav.render(this.dom.nav); this.setContainer(container); + attachViewInspector(this); } apply(extensions) { @@ -245,7 +234,8 @@ export default class Widget extends Emitter { this.prepare = fn; } - setData(data, context = {}) { + setData(data, context = {}, options) { + const { norender } = options || {}; const startTime = Date.now(); const dataExtension = createDataExtensionApi(this); const checkIsNotPrevented = () => { @@ -256,8 +246,8 @@ export default class Widget extends Emitter { throw new Error('Prevented by another setData()'); } }; - const setDataPromise = Promise.resolve(data) - .then((data) => { + const setDataPromise = Promise.resolve() + .then(() => { checkIsNotPrevented(); return this.prepare(data, dataExtension.methods) || data; @@ -277,14 +267,31 @@ export default class Widget extends Emitter { lastSetDataPromise.set(this, setDataPromise); // run after data is prepared and set - setDataPromise.then(() => { - this.scheduleRender('sidebar'); - this.scheduleRender('page'); - }); + if (norender) { + setDataPromise.then(() => { + this.scheduleRender('sidebar'); + this.scheduleRender('page'); + }); + } return setDataPromise; } + async setDataProgress(data, context, progressbar = { setState() {} }) { + // set new data & context + await progressbar.setState({ stage: 'prepare' }); + await this.setData(data, context, { norender: true }); + + // await dom is ready and everything is rendered + await progressbar.setState({ stage: 'initui' }); + this.scheduleRender('sidebar'); + this.scheduleRender('page'); + await Promise.all([ + await this.dom.ready, + renderScheduler.get(this).timer + ]); + } + // TODO: remove addEntityResolver() { console.error('[Discovery] "Widget#addEntityResolver()" method was removed, use "defineObjectMarker()" instead, i.e. setPrepare((data, { defineObjectMarker }) => objects.forEach(defineObjectMarker(...)))'); @@ -468,73 +475,119 @@ export default class Widget extends Emitter { // UI // - getDomRoots() { - return [ - ...document.querySelectorAll(`[data-discovery-instance-id=${JSON.stringify(this.instanceId)}]`) - ]; - } + initDom() { + const wrapper = createElement('div', 'discovery'); + const shadow = wrapper.attachShadow({ mode: 'open' }); + let readyStyles = Promise.resolve(); - setContainer(container) { - const newContainerEl = container || null; - const oldDomRefs = this.dom; + wrapper.style.opacity = 0; // FIXME: there must be a better way to hide a widget until everything is ready - if (this.dom.container === newContainerEl) { - return; - } + if (Array.isArray(this.options.styles)) { + const foucFix = createElement('style', null, ':host{display:none}'); + const awaitingStyles = new Set(); - // reset old refs - this.dom = {}; - if (typeof oldDomRefs.detachDarkMode === 'function') { - oldDomRefs.detachDarkMode(); - } + shadow.append(...this.options.styles.map(style => { + if (typeof style === 'string') { + style = { + type: 'style', + content: style + }; + } - if (newContainerEl !== null) { - this.dom.container = newContainerEl; - this.dom.detachDarkMode = this.darkmode.on( - dark => new Set([newContainerEl, ...this.getDomRoots()]) - .forEach(rootEl => rootEl.classList.toggle('discovery-root-darkmode', dark)) - ); - - newContainerEl.classList.add('discovery-root', 'discovery', this.isolateStyleMarker); - newContainerEl.classList.toggle('discovery-root-darkmode', this.darkmode.value); - newContainerEl.dataset.discoveryInstanceId = this.instanceId; - newContainerEl.append( - this.dom.sidebar = createElement('nav', 'discovery-sidebar'), - this.dom.content = createElement('main', 'discovery-content', [ - this.dom.nav = createElement('div', 'discovery-nav'), - this.dom.pageContent = createElement('article') - ]) - ); - - // cancel transitions on attach - newContainerEl.style.transition = 'none'; - requestAnimationFrame(() => newContainerEl.style.transition = ''); - - this.nav.render(this.dom.nav); - attachViewInspector(this); - } else { - for (let key in this.dom) { - this.dom[key] = null; + switch (style.type) { + case 'style': + return createElement('style', null, style.content); + + case 'link': { + let resolveStyle; + let rejectStyle; + let state = new Promise((resolve, reject) => { + resolveStyle = resolve; + rejectStyle = reject; + }); + + awaitingStyles.add(state); + + const linkEl = createElement('link', { + rel: 'stylesheet', + href: style.href, + media: style.media, + onerror(err) { + awaitingStyles.delete(state); + rejectStyle(err); + + if (!awaitingStyles.size) { + foucFix.remove(); + } + }, + onload() { + awaitingStyles.delete(state); + resolveStyle(); + + if (!awaitingStyles.size) { + foucFix.remove(); + } + } + }); + + return linkEl; + } + + default: + throw new Error(`Unknown type "${style.type}" in options.styles`); + } + })); + + if (awaitingStyles.size) { + readyStyles = Promise.all(awaitingStyles); + shadow.append(foucFix); } } - this.emit('container-changed', this.dom, oldDomRefs); + const container = shadow.appendChild(createElement('div')); + this.dom = {}; + this.dom.ready = Promise.all([readyStyles]); + this.dom.wrapper = wrapper; + this.dom.root = shadow; + this.dom.container = container; + this.dom.detachDarkMode = this.darkmode.subscribe( + dark => container.classList.toggle('discovery-root-darkmode', dark), + true + ); + + container.classList.add('discovery-root', 'discovery'); + container.append( + this.dom.nav = createElement('div', 'discovery-nav'), + this.dom.sidebar = createElement('nav', 'discovery-sidebar'), + this.dom.content = createElement('main', 'discovery-content', [ + this.dom.pageContent = createElement('article') + ]) + ); + } + + setContainer(container) { + container.append(this.dom.wrapper); + } + + disposeDom() { + if (typeof this.dom.detachDarkMode === 'function') { + this.dom.detachDarkMode(); + this.dom.detachDarkMode = null; + } + this.dom.container.remove(); + this.dom = null; } addGlobalEventListener(eventName, handler, options) { - const instanceId = this.instanceId; - const handlerWrapper = function(event) { - const root = event.target !== document - ? event.target.closest('[data-discovery-instance-id]') - : null; - - if (root && root.dataset.discoveryInstanceId === instanceId) { - handler.call(this, event); - } - }; + document.addEventListener(eventName, handler, options); + return () => document.removeEventListener(eventName, handler, options); + } + + addHostElEventListener(eventName, handler, options) { + const el = this.dom.container; - document.addEventListener(eventName, handlerWrapper, options); - return () => document.removeEventListener(eventName, handlerWrapper, options); + el.addEventListener(eventName, handler, options); + return () => el.removeEventListener(eventName, handler, options); } addBadge() { @@ -546,20 +599,20 @@ export default class Widget extends Emitter { // scheduleRender(subject) { - const scheduler = renderScheduler.get(this); + const scheduledRenders = renderScheduler.get(this); - if (scheduler.has(subject)) { + if (scheduledRenders.has(subject)) { return; } - scheduler.add(subject); + scheduledRenders.add(subject); - if (scheduler.timer) { + if (scheduledRenders.timer) { return; } - scheduler.timer = Promise.resolve().then(async () => { - for (const subject of scheduler) { + scheduledRenders.timer = Promise.resolve().then(async () => { + for (const subject of scheduledRenders) { switch (subject) { case 'sidebar': await this.renderSidebar(); @@ -570,8 +623,10 @@ export default class Widget extends Emitter { } } - scheduler.timer = null; + scheduledRenders.timer = null; }); + + return scheduledRenders.timer; } cancelScheduledRender(subject) { @@ -728,6 +783,9 @@ export default class Widget extends Emitter { setDatasetValue(this.dom.container, 'dzen', this.pageParams.dzen); setDatasetValue(this.dom.container, 'compact', this.options.compact); + // FIXME: there must be a better way to reveal a widget when everything is ready + renderState.then(() => this.dom.wrapper.style.opacity = 1); + return renderState; } } diff --git a/src/widget/nav.js b/src/widget/nav.js index 8de7b4fb..e1a6c71c 100644 --- a/src/widget/nav.js +++ b/src/widget/nav.js @@ -84,6 +84,11 @@ export class WidgetNavigation { this.popup = new this.host.view.Popup({ className: 'discovery-nav-popup' }); + this.popup.el.addEventListener('click', ({ target }) => { + if (target.closest('a[href]')) { + setTimeout(() => this.popup.hide(), 50); + } + }, true); } this.popup.toggle(el, (el) => el.append(...nodes)); diff --git a/src/widget/widget.css b/src/widget/widget.css index 117c1bbb..3316173d 100644 --- a/src/widget/widget.css +++ b/src/widget/widget.css @@ -1,10 +1,12 @@ /* isolate-style-root: discovery, discovery-root, discovery-root-darkmode */ -.discovery { - display: flex; +:host { + transition: opacity .2s; } .discovery-root { - all: reset; + all: initial; + + position: relative; font-family: Tahoma, Verdana, Arial, sans-serif; font-size: 14px; @@ -69,6 +71,12 @@ --discovery-fmt-string-hover-color: #97cf26; } +.discovery { + display: flex; + overflow: hidden; + height: 100%; +} + .discovery-content { flex: 1; display: flex; @@ -160,7 +168,7 @@ } .discovery-nav { - position: fixed; + position: absolute; z-index: 102; top: 0; right: 40px; @@ -195,7 +203,7 @@ border-radius: 0; } .discovery-nav .view-nav-button[data-name="burger"] { - background-image: url(burger-menu.svg); + background-image: url('./burger-menu.svg'); background-repeat: no-repeat; background-position: center; background-size: 18px;