diff --git a/.babelrc b/.babelrc deleted file mode 100644 index b18b30c..0000000 --- a/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env"] - ] -} \ No newline at end of file diff --git a/.gitignore b/.gitignore index b66ad50..89cc368 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,5 @@ -.idea -*.iml -.vscode -build -dist -downloads -node_modules -*.zip -npm-debug.log -/.vs +/node_modules/ +/public/build/ + +.DS_Store +.idea \ No newline at end of file diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..b9b22e7 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,3 @@ +{ + "test": "./src/**/*.test.js" +} \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 8b1919a..0000000 --- a/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -bower.json -CONTRIBUTING.md -downloads -misc -node_modules -test -tools -.idea -component.json -.npmignore -.gitignore -*.zip -npm-debug.log diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index dcb0ff8..0000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "lts/*" - -script: npm test && npm run lint diff --git a/greenkeeper.json b/greenkeeper.json deleted file mode 100644 index 6438fef..0000000 --- a/greenkeeper.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "groups": { - "default": { - "packages": [ - "examples/react_advanced_demo/package.json", - "examples/react_demo/package.json", - "package.json" - ] - } - } -} diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 7d64077..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,238 +0,0 @@ -const fs = require('fs') -const path = require('path') -const gulp = require('gulp') -const log = require('fancy-log') -const format = require('date-format') -const concatCss = require('gulp-concat-css') -const minifyCSS = require('gulp-clean-css') -const sass = require('gulp-sass') -const mkdirp = require('mkdirp') -const webpack = require('webpack') -const uglify = require('uglify-js') -const btoa = require('btoa') - -const NAME = 'jsoneditor' -const NAME_MINIMALIST = 'jsoneditor-minimalist' -const ENTRY = './src/js/JSONEditor.js' -const HEADER = './src/js/header.js' -const IMAGE = './src/scss/img/jsoneditor-icons.svg' -const DOCS = './src/docs/*' -const DIST = path.join(__dirname, 'dist') - -// generate banner with today's date and correct version -function createBanner () { - const today = format.asString('yyyy-MM-dd', new Date()) // today, formatted as yyyy-MM-dd - const version = require('./package.json').version // math.js version - - return String(fs.readFileSync(HEADER)) - .replace('@@date', today) - .replace('@@version', version) -} - -const bannerPlugin = new webpack.BannerPlugin({ - banner: createBanner(), - entryOnly: true, - raw: true -}) - -const webpackConfigModule = { - rules: [ - { - test: /\.m?js$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader' - } - } - ] -} - -// create a single instance of the compiler to allow caching -const compiler = webpack({ - entry: ENTRY, - output: { - library: 'JSONEditor', - libraryTarget: 'umd', - path: DIST, - filename: NAME + '.js' - }, - plugins: [bannerPlugin], - optimization: { - // We no not want to minimize our code. - minimize: false - }, - module: webpackConfigModule, - resolve: { - extensions: ['.js'], - mainFields: ['main'] // pick ES5 version of vanilla-picker - }, - cache: true -}) - -// create a single instance of the compiler to allow caching -const compilerMinimalist = webpack({ - entry: ENTRY, - output: { - library: 'JSONEditor', - libraryTarget: 'umd', - path: DIST, - filename: NAME_MINIMALIST + '.js' - }, - module: webpackConfigModule, - plugins: [ - bannerPlugin, - new webpack.IgnorePlugin(new RegExp('^ace-builds')), - new webpack.IgnorePlugin(new RegExp('worker-json-data-url')), - new webpack.IgnorePlugin(new RegExp('^ajv')), - new webpack.IgnorePlugin(new RegExp('^vanilla-picker')) - ], - optimization: { - // We no not want to minimize our code. - minimize: false - }, - cache: true -}) - -function minify (name) { - const code = String(fs.readFileSync(DIST + '/' + name + '.js')) - const result = uglify.minify(code, { - sourceMap: { - url: name + '.map' - }, - output: { - comments: /@license/, - max_line_len: 64000 // extra large because we have embedded code for workers - } - }) - - if (result.error) { - throw result.error - } - - const fileMin = DIST + '/' + name + '.min.js' - const fileMap = DIST + '/' + name + '.map' - - fs.writeFileSync(fileMin, result.code) - fs.writeFileSync(fileMap, result.map) - - log('Minified ' + fileMin) - log('Mapped ' + fileMap) -} - -// make dist folder structure -gulp.task('mkdir', function (done) { - mkdirp.sync(DIST) - mkdirp.sync(DIST + '/img') - - done() -}) - -// Create an embedded version of the json worker code: a data url -gulp.task('embed-json-worker', function (done) { - const workerBundleFile = './node_modules/ace-builds/src-noconflict/worker-json.js' - const workerEmbeddedFile = './src/js/generated/worker-json-data-url.js' - const workerScript = String(fs.readFileSync(workerBundleFile)) - - const workerDataUrl = 'data:application/javascript;base64,' + btoa(workerScript) - - fs.writeFileSync(workerEmbeddedFile, 'module.exports = \'' + workerDataUrl + '\'\n') - - done() -}) - -// bundle javascript -gulp.task('bundle', function (done) { - // update the banner contents (has a date in it which should stay up to date) - bannerPlugin.banner = createBanner() - - compiler.run(function (err, stats) { - if (err) { - log(err) - } - - log('bundled ' + NAME + '.js') - - done() - }) -}) - -// bundle minimalist version of javascript -gulp.task('bundle-minimalist', function (done) { - // update the banner contents (has a date in it which should stay up to date) - bannerPlugin.banner = createBanner() - - compilerMinimalist.run(function (err, stats) { - if (err) { - log(err) - } - - log('bundled ' + NAME_MINIMALIST + '.js') - - done() - }) -}) - -// bundle css -gulp.task('bundle-css', function (done) { - gulp - .src(['src/scss/jsoneditor.scss']) - .pipe( - sass({ - // importer: tildeImporter - }) - ) - .pipe(concatCss(NAME + '.css')) - .pipe(gulp.dest(DIST)) - .pipe(concatCss(NAME + '.min.css')) - .pipe(minifyCSS()) - .pipe(gulp.dest(DIST)) - done() -}) - -// create a folder img and copy the icons -gulp.task('copy-img', function (done) { - gulp.src(IMAGE).pipe(gulp.dest(DIST + '/img')) - log('Copied images') - - done() -}) - -// create a folder img and copy the icons -gulp.task('copy-docs', function (done) { - gulp.src(DOCS).pipe(gulp.dest(DIST)) - log('Copied doc') - - done() -}) - -gulp.task('minify', function (done) { - minify(NAME) - - done() -}) - -gulp.task('minify-minimalist', function (done) { - minify(NAME_MINIMALIST) - - done() -}) - -// The watch task (to automatically rebuild when the source code changes) -// Does only generate jsoneditor.js and jsoneditor.css, and copy the image -// Does NOT minify the code and does NOT generate the minimalist version -gulp.task('watch', gulp.series('bundle', 'bundle-css', 'copy-img', function () { - gulp.watch(['src/**/*'], gulp.series('bundle', 'bundle-css', 'copy-img')) -})) - -// The default task (called when you run `gulp`) -gulp.task('default', gulp.series( - 'mkdir', - 'embed-json-worker', - gulp.parallel( - 'copy-img', - 'copy-docs', - 'bundle-css', - gulp.series('bundle', 'minify'), - gulp.series('bundle-minimalist', 'minify-minimalist') - ) -)) diff --git a/index.js b/index.js deleted file mode 100644 index af2df48..0000000 --- a/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/jsoneditor') diff --git a/misc/architecture.md b/misc/architecture.md new file mode 100644 index 0000000..2899f4e --- /dev/null +++ b/misc/architecture.md @@ -0,0 +1,14 @@ +# JSONEditor Svelte architecture choices + +- Immutable -> one-way data binding +- All Actions based on JSONPatch +- It must be possible to persist all state, including expanded/collapsed and + selection. +- State with search results, and, expanded state, and selection is separate + from the JSON document itself, and are JSON objectswith the same structure, + using symbols. +- Must be able to open huge JSON files + - Must work directly on the JSON object itself, not on a wrapped object model + - Display only the first 100 items of an array etc. Or show items in groups + of 100 items. + - Search must not crash on large files. Stop at 999 results or something. diff --git a/package-lock.json b/package-lock.json index dc05efe..01addc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "jsoneditor", - "version": "8.6.6", + "name": "svelte-app", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -13,276 +13,12 @@ "@babel/highlight": "^7.8.3" } }, - "@babel/compat-data": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", - "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", - "dev": true, - "requires": { - "browserslist": "^4.9.1", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.9.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", - "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.6", - "browserslist": "^4.9.1", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", - "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, "@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", "dev": true }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" - } - }, "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", @@ -294,962 +30,118 @@ "js-tokens": "^4.0.0" } }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "@fortawesome/fontawesome-common-types": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.28.tgz", + "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==" + }, + "@fortawesome/free-regular-svg-icons": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.13.0.tgz", + "integrity": "sha512-70FAyiS5j+ANYD4dh9NGowTorNDnyvQHHpCM7FpnF7GxtDjBUCKdrFqCPzesEIpNDFNd+La3vex+jDk4nnUfpA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.28" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.0.tgz", + "integrity": "sha512-IHUgDJdomv6YtG4p3zl1B5wWf9ffinHIvebqQOmV3U+3SLw4fC+LUCCgwfETkbTtjy5/Qws2VoVf6z/ETQpFpg==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.28" + } + }, + "@polka/url": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", + "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", "dev": true }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "@rollup/plugin-commonjs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz", + "integrity": "sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@rollup/pluginutils": "^3.0.8", + "commondir": "^1.0.1", + "estree-walker": "^1.0.1", + "glob": "^7.1.2", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "@rollup/pluginutils": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.9.tgz", + "integrity": "sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "micromatch": "^4.0.2" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", - "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.9.5" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", - "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.8", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", - "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", - "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", - "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", - "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", - "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", - "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", - "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/preset-env": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", - "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.5", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", - "@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.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.5", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.9.5", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.9.5", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.5", - "browserslist": "^4.9.1", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/register": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.9.0.tgz", - "integrity": "sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.13", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" - } - }, - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@sphinxxxx/color-conversion": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", - "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" - }, - "@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==", + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "@types/node": { + "version": "13.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.2.tgz", + "integrity": "sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A==", + "dev": true + }, + "@types/pug": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz", + "integrity": "sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@types/node": "*" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@types/sass": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz", + "integrity": "sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" + "@types/node": "*" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "ace-builds": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.11.tgz", - "integrity": "sha512-keACH1d7MvAh72fE/us36WQzOFQPJbHphNpj33pXwVZOM84pTWcdFzIAvngxOGIGLTm7gtUP2eJ4Ku6VaPo8bw==" - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", - "dev": true - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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-styles": { @@ -1261,51 +153,14 @@ "color-convert": "^1.9.0" } }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "argparse": { @@ -1317,447 +172,28 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { + "assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { + "async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "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==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, "brace-expansion": { @@ -1771,290 +207,52 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "dev": true - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callsites": { + "builtin-modules": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, - "caniuse-lite": { - "version": "1.0.30001043", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001043.tgz", - "integrity": "sha512-MrBDRPJPDBYwACtSQvxg9+fkna5jPXhJlKmuxenl/ml9uf8LHKlDmLpElu+zTW/bEz7lC1m0wTDD7jiIB+hgFg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2066,185 +264,26 @@ "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==", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "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" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "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 - } - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" } }, "color-convert": { @@ -2262,21 +301,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -2289,301 +313,16 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.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 - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "console-clear": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", + "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", "dev": true }, "decamelize": { @@ -2592,47 +331,15 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "type-detect": "^4.0.0" } }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2642,95 +349,10 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "deglob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-4.0.1.tgz", - "integrity": "sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg==", - "dev": true, - "requires": { - "find-root": "^1.0.0", - "glob": "^7.0.5", - "ignore": "^5.0.0", - "pkg-config": "^1.1.0", - "run-parallel": "^1.1.2", - "uniq": "^1.0.1" - }, - "dependencies": { - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", "dev": true }, "diff": { @@ -2739,164 +361,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.3.413", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.413.tgz", - "integrity": "sha512-Jm1Rrd3siqYHO3jftZwDljL2LYQafj3Kki5r+udqE58d0i91SkjItVJ5RwlJn9yko8i7MOcoidVKjQlgSdd1hg==", - "dev": true - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-abstract": { "version": "1.17.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", @@ -2927,891 +391,33 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "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 - }, - "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 - } - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "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" - } - }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true - } - } - }, - "eslint-config-standard": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", - "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", - "dev": true - }, - "eslint-config-standard-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz", - "integrity": "sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw==", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-es": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", - "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", - "dev": true, - "requires": { - "eslint-utils": "^1.4.2", - "regexpp": "^3.0.0" - }, - "dependencies": { - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", - "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", - "dev": true, - "requires": { - "eslint-plugin-es": "^2.0.0", - "eslint-utils": "^1.4.2", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "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 - } - } - }, - "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", - "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.1.0", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "resolve": "^1.10.1" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-standard": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", - "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -3829,117 +435,6 @@ } } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3947,578 +442,11 @@ "dev": true }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -4526,88 +454,24 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "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==", - "dev": true - }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-imports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-imports/-/get-imports-1.0.0.tgz", - "integrity": "sha1-R8C07piTUWQsVJdxk79Pyqv1N48=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1", - "import-regex": "^1.1.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -4623,370 +487,20 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", - "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "async": "^1.2.1", - "glob": "^5.0.3", - "object-assign": "^3.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "globule": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", - "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.12", - "minimatch": "~3.0.2" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - } - } - }, - "gulp-clean-css": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", - "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", - "dev": true, - "requires": { - "clean-css": "4.2.3", - "plugin-error": "1.0.1", - "through2": "3.0.1", - "vinyl-sourcemaps-apply": "0.2.1" - }, - "dependencies": { - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulp-concat-css": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gulp-concat-css/-/gulp-concat-css-3.1.0.tgz", - "integrity": "sha512-iLTBPS+cutlgLyK3bp9DMts+WuS8n2mQpjzQ7p/ZVQc8FO5fvpN+ntg9U6jsuNvPeuii82aKm8XeOzF0nUK+TA==", - "dev": true, - "requires": { - "lodash.defaults": "^3.0.0", - "parse-import": "^2.0.0", - "plugin-error": "^0.1.2", - "rework": "~1.0.0", - "rework-import": "^2.0.0", - "rework-plugin-url": "^1.0.1", - "through2": "~1.1.1", - "vinyl": "^2.1.0" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "dev": true, - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-sass": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.0.2.tgz", - "integrity": "sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "lodash.clonedeep": "^4.3.2", - "node-sass": "^4.8.3", - "plugin-error": "^1.0.1", - "replace-ext": "^1.0.0", - "strip-ansi": "^4.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4996,15 +510,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5017,192 +522,12 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/import-regex/-/import-regex-1.1.0.tgz", - "integrity": "sha1-pVxS5McFx2XKIQ6SQqBrvMiqf2Y=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5219,279 +544,33 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "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 - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "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" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.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-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -5501,52 +580,26 @@ "is-extglob": "^2.1.1" } }, - "is-negated-glob": { + "is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "is-reference": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", + "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39" + } }, "is-regex": { "version": "1.0.5", @@ -5557,21 +610,6 @@ "has": "^1.0.3" } }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -5581,84 +619,32 @@ "has-symbols": "^1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", - "dev": true + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, "js-tokens": { "version": "4.0.0", @@ -5676,404 +662,42 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "jsdom": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", - "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", + "livereload": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", + "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.0.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "chokidar": "^3.3.0", + "livereload-js": "^3.1.0", + "opts": ">= 1.2.0", + "ws": "^6.2.1" } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "livereload-js": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", + "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", "dev": true }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", - "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" - }, - "json-stable-stringify-without-jsonify": { + "local-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz", + "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "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", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", @@ -6083,219 +707,41 @@ "chalk": "^2.4.2" } }, - "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==", + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "sourcemap-codec": "^1.4.4" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { + "merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "min-indent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", + "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", "dev": true }, "minimatch": { @@ -6313,67 +759,14 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mobius1-selectr": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", - "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "mocha": { "version": "7.1.1", @@ -6407,49 +800,6 @@ "yargs-unparser": "1.6.0" }, "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -6486,14 +836,11 @@ "ms": "^2.1.1" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, "find-up": { "version": "3.0.0", @@ -6504,19 +851,6 @@ "locate-path": "^3.0.0" } }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -6531,36 +865,12 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -6571,36 +881,12 @@ "path-exists": "^3.0.0" } }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -6610,10 +896,10 @@ "p-limit": "^2.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "readdirp": { @@ -6625,12 +911,6 @@ "picomatch": "^2.0.4" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -6660,21 +940,15 @@ "has-flag": "^3.0.0" } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "is-number": "^7.0.0" + "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -6686,12 +960,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -6722,96 +990,10 @@ } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "mri": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz", + "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==", "dev": true }, "node-environment-flags": { @@ -6822,263 +1004,22 @@ "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" - } - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" }, "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", - "dev": true - }, - "node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -7091,15 +1032,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -7112,42 +1044,6 @@ "object-keys": "^1.0.11" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", @@ -7158,47 +1054,6 @@ "es-abstract": "^1.17.0-next.1" } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7208,208 +1063,25 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "opts": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", + "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" + "p-try": "^2.0.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-import": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-import/-/parse-import-2.0.0.tgz", - "integrity": "sha1-KyR0Aw4AirmNt2xLy/TbWucwb18=", - "dev": true, - "requires": { - "get-imports": "^1.0.0" - } - }, - "parse-json": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-is-absolute": { @@ -7418,69 +1090,16 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { + "pathval": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "picomatch": { @@ -7489,667 +1108,13 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "picomodal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz", - "integrity": "sha1-+s0w9PvzSoCcHgTqUl8ATzmcC4I=" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, - "pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", - "dev": true, - "requires": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "picomatch": "^2.0.7" } }, "require-directory": { @@ -8159,259 +1124,101 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", "dev": true }, "resolve": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", - "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "rollup": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.7.2.tgz", + "integrity": "sha512-SdtTZVMMVSPe7SNv4exUyPXARe5v/p3TeeG3LRA5WabLPJt4Usi3wVrvVlyAUTG40JJmqS6zbIHt2vWTss2prw==", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "fsevents": "~2.1.2" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "rollup-plugin-livereload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.2.0.tgz", + "integrity": "sha512-zKcS4D8ElSFj9Mv6OAM1kGB3o5LkCtEClewO8CDPEacj6p4DSvTOm6WlKSc8/WtsD0d3Q33Y96c5Jqzyaxo/8g==", "dev": true, "requires": { - "value-or-function": "^3.0.0" + "livereload": "^0.9.1" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "rollup-plugin-svelte": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.1.tgz", + "integrity": "sha512-wc93cN66sRpX6uFljVFqvWT6NU3V5ab/uLXKt2UiARuexFU/ctolzkmdXM7WM5iKdTX9scToS9sabJTJV4DUMA==", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "require-relative": "^0.8.7", + "rollup-pluginutils": "^2.8.2", + "sourcemap-codec": "^1.4.8" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "rollup-plugin-terser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz", + "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==", "dev": true, "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^2.1.2", + "terser": "^4.6.2" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" }, "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true } } }, - "rework-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rework-import/-/rework-import-2.1.0.tgz", - "integrity": "sha1-wm7StTFZrHvi7GDaIj74lgPB7x8=", + "sade": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.3.tgz", + "integrity": "sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==", "dev": true, "requires": { - "css": "^2.0.0", - "globby": "^2.0.0", - "parse-import": "^2.0.0", - "url-regex": "^3.0.0" + "mri": "^1.1.0" } }, - "rework-plugin-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/rework-plugin-function/-/rework-plugin-function-1.0.2.tgz", - "integrity": "sha1-Es5G+1sptdk1FGaD9rmM9J0jc7k=", + "sass": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", "dev": true, "requires": { - "rework-visit": "^1.0.0" - } - }, - "rework-plugin-url": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rework-plugin-url/-/rework-plugin-url-1.1.0.tgz", - "integrity": "sha1-q1PosQV7nV7MHIJz/32xhgg3XEU=", - "dev": true, - "requires": { - "rework-plugin-function": "^1.0.0" - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" + "chokidar": ">=2.0.0 <4.0.0" } }, "serialize-javascript": { @@ -8426,470 +1233,59 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "sirv": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.2.tgz", + "integrity": "sha512-dQbZnsMaIiTQPZmbGmktz+c74zt/hyrJEB4tdp2Jj0RNv9J6B/OWR5RyrZEvIn9fyh9Zlg2OlE2XzKz6wMKGAw==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "@polka/url": "^0.5.0", + "mime": "^2.3.1" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "sirv-cli": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-0.4.5.tgz", + "integrity": "sha512-Fl6icSm0EwPrXSGid2xphMp//WNTSX2yENRAGnJuuZNmdc8LvE/BtdZD3MPn28ifAfDqTMwbB3dpcZojAIOiBg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "console-clear": "^1.1.0", + "get-port": "^3.2.0", + "kleur": "^3.0.0", + "local-access": "^1.0.1", + "sade": "^1.4.0", + "sirv": "^0.4.2", + "tinydate": "^1.0.0" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "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 - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "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 - } } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "standard": { - "version": "14.3.3", - "resolved": "https://registry.npmjs.org/standard/-/standard-14.3.3.tgz", - "integrity": "sha512-HBEAD5eVXrr2o/KZ3kU8Wwaxw90wzoq4dOQe6vlRnPoQ6stn4LCLRLBBDp0CjH/aOTL9bDZJbRUOZcBaBnNJ0A==", - "dev": true, - "requires": { - "eslint": "~6.8.0", - "eslint-config-standard": "14.1.0", - "eslint-config-standard-jsx": "8.1.0", - "eslint-plugin-import": "~2.18.0", - "eslint-plugin-node": "~10.0.0", - "eslint-plugin-promise": "~4.2.1", - "eslint-plugin-react": "~7.14.2", - "eslint-plugin-standard": "~4.0.0", - "standard-engine": "^12.0.0" - } - }, - "standard-engine": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-12.0.0.tgz", - "integrity": "sha512-gJIIRb0LpL7AHyGbN9+hJ4UJns37lxmNTnMGRLC8CFrzQ+oB/K60IQjKNgPBCB2VP60Ypm6f8DFXvhVWdBOO+g==", - "dev": true, - "requires": { - "deglob": "^4.0.0", - "get-stdin": "^7.0.0", - "minimist": "^1.1.0", - "pkg-conf": "^3.1.0" - }, - "dependencies": { - "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "string.prototype.trimend": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", @@ -8932,40 +1328,13 @@ "es-abstract": "^1.17.5" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "min-indent": "^1.0.0" } }, "strip-json-comments": { @@ -8983,869 +1352,67 @@ "has-flag": "^3.0.0" } }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, + "svelte": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.21.0.tgz", + "integrity": "sha512-smh3LZKPCGJ+UXa0iZvUmuDctPYCwPY1opmClTWTm+l6e4y9FHLoCZMiue8YIeyc9JvlGT/EK0xry0diXjFDZQ==" + }, + "svelte-awesome": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/svelte-awesome/-/svelte-awesome-2.3.0.tgz", + "integrity": "sha512-xXU3XYJmr5PK9e3pCpW6feU/tNpAhERWDrgDxkC0DU6LNum02zzc00I17bmUWTSRdKLf+IFbA5hWvCm1V8g+/A==", "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "svelte": "^3.15.0" } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "svelte-preprocess": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-3.7.4.tgz", + "integrity": "sha512-0nW7TIjbav2nmw1Y7EAFRRkhNVwJ3zKN85/eITLQMkPuhqHO2i2IK0O3y4YXsSXlc0VGI5jQDVXkcXpga6zzew==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "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 - }, - "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 - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "strip-indent": "^3.0.0" } }, "terser": { - "version": "4.6.11", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.11.tgz", - "integrity": "sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA==", + "version": "4.6.12", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz", + "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" - }, - "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 - } } }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "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 - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "tinydate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz", + "integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg==", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "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" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", - "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", - "dev": true, - "requires": { - "commander": "~2.20.3" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vanilla-picker": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.10.1.tgz", - "integrity": "sha512-Bo4HOKkSorcQoRB08HwDMb8X2jt3SsZw7gzFlbzXbhnaxdUVJBm3LOUudr7M1SCVwPCo8d3nq8ajiAg8lAoqPg==", - "requires": { - "@sphinxxxx/color-conversion": "^2.2.2" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "watchpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", - "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.1", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.0.0.tgz", - "integrity": "sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.0", - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { @@ -9855,31 +1422,39 @@ "dev": true, "requires": { "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "wrappy": { @@ -9888,92 +1463,21 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } + "async-limiter": "~1.0.0" } }, - "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - }, "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", @@ -9985,18 +1489,6 @@ "yargs": "^13.3.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 - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -10008,6 +1500,12 @@ "wrap-ansi": "^5.1.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -10017,12 +1515,6 @@ "locate-path": "^3.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "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", @@ -10039,15 +1531,6 @@ "path-exists": "^3.0.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -10057,16 +1540,10 @@ "p-limit": "^2.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "string-width": { @@ -10089,12 +1566,6 @@ "ansi-regex": "^4.1.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -10106,12 +1577,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/package.json b/package.json index 2064cef..a01d583 100644 --- a/package.json +++ b/package.json @@ -1,75 +1,29 @@ { - "name": "jsoneditor", - "version": "8.6.6", - "main": "./index", - "description": "A web-based tool to view, edit, format, and validate JSON", - "tags": [ - "json", - "editor", - "viewer", - "formatter" - ], - "author": "Jos de Jong ", - "license": "Apache-2.0", - "homepage": "https://github.com/josdejong/jsoneditor", - "repository": { - "type": "git", - "url": "https://github.com/josdejong/jsoneditor.git" - }, - "bugs": "https://github.com/josdejong/jsoneditor/issues", + "name": "svelte-app", + "version": "1.0.0", "scripts": { - "build": "gulp", - "minify": "gulp minify", - "start": "gulp watch", - "test": "mocha test --require @babel/register", - "lint": "standard --env=mocha", - "prepublishOnly": "npm test && npm run build" + "build": "rollup -c", + "dev": "rollup -c -w", + "start": "sirv public", + "test": "mocha ./src/**/*.test.js" }, + "type": "module", "dependencies": { - "ace-builds": "^1.4.11", - "ajv": "^6.12.2", - "javascript-natural-sort": "^0.7.1", - "jmespath": "^0.15.0", - "json-source-map": "^0.6.1", - "mobius1-selectr": "^2.4.13", - "picomodal": "^3.0.0", - "vanilla-picker": "^2.10.1" + "@fortawesome/free-regular-svg-icons": "5.13.0", + "@fortawesome/free-solid-svg-icons": "5.13.0", + "svelte-awesome": "2.3.0" }, "devDependencies": { - "@babel/core": "7.9.0", - "@babel/preset-env": "7.9.5", - "@babel/register": "7.9.0", - "babel-loader": "8.1.0", - "btoa": "1.2.1", - "date-format": "3.0.0", - "fancy-log": "1.3.3", - "gulp": "4.0.2", - "gulp-clean-css": "4.3.0", - "gulp-concat-css": "3.1.0", - "gulp-sass": "4.0.2", - "jsdom": "16.2.2", - "json-loader": "0.5.7", - "mkdirp": "1.0.4", + "@rollup/plugin-commonjs": "11.1.0", + "@rollup/plugin-node-resolve": "7.1.3", "mocha": "7.1.1", - "standard": "14.3.3", - "uglify-js": "3.9.1", - "webpack": "4.43.0" - }, - "files": [ - "dist", - "docs", - "examples", - "src", - "HISTORY.md", - "index.js", - "LICENSE", - "NOTICE", - "README.md" - ], - "standard": { - "ignore": [ - "src/js/assets", - "examples/react*" - ] + "rollup": "2.7.2", + "rollup-plugin-livereload": "1.2.0", + "rollup-plugin-svelte": "5.2.1", + "rollup-plugin-terser": "5.3.0", + "sass": "1.26.5", + "sirv-cli": "0.4.5", + "svelte": "3.21.0", + "svelte-preprocess": "3.7.4" } } diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..48b5f75 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..9b701bf --- /dev/null +++ b/public/index.html @@ -0,0 +1,16 @@ + + + + + + + JSON Editor (Svelte) + + + + + + + + + diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..c67206a --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,75 @@ +import svelte from 'rollup-plugin-svelte'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import livereload from 'rollup-plugin-livereload'; +import { terser } from 'rollup-plugin-terser'; +import autoPreprocess from 'svelte-preprocess'; + +const production = !process.env.ROLLUP_WATCH; + +export default { + input: 'src/main.js', + output: { + sourcemap: true, + format: 'iife', + name: 'app', + file: 'public/build/bundle.js' + }, + plugins: [ + svelte({ + // enable run-time checks when not in production + dev: !production, + + // // we'll extract any component CSS out into + // // a separate file - better for performance + // css: css => { + // css.write('public/build/bundle.css'); + // }, + + preprocess: autoPreprocess() + }), + + // If you have external dependencies installed from + // npm, you'll most likely need these plugins. In + // some cases you'll need additional configuration - + // consult the documentation for details: + // https://github.com/rollup/plugins/tree/master/packages/commonjs + resolve({ + browser: true, + dedupe: ['svelte'] + }), + commonjs(), + + // In dev mode, call `npm run start` once + // the bundle has been generated + !production && serve(), + + // Watch the `public` directory and refresh the + // browser on changes when not in production + !production && livereload('public'), + + // If we're building for production (npm run build + // instead of npm run dev), minify + production && terser() + ], + watch: { + clearScreen: false + } +}; + +function serve() { + let started = false; + + return { + writeBundle() { + if (!started) { + started = true; + + require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { + stdio: ['ignore', 'inherit', 'inherit'], + shell: true + }); + } + } + }; +} diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000..8f72c6f --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,196 @@ + + + + +

+ Search: +

+ +
+ +
+ + + +

+ + +

+ + diff --git a/src/JSONNode.svelte b/src/JSONNode.svelte new file mode 100644 index 0000000..bc0ca80 --- /dev/null +++ b/src/JSONNode.svelte @@ -0,0 +1,136 @@ + + + + +
+ + {key} : + + {#if type !== 'value'} + + {/if} + {#if type === 'array'} + {#if expanded} +
+ {#each items as item, index (index)} + + {/each} + {#if limited} +
+ (showing {limit} of {value.length} items ) +
+ {/if} +
+ {/if} + {:else if type === 'object'} + {#if expanded} +
+ {#each props as prop (prop.key)} + + {/each} +
+ {/if} + {:else} +
+ {value} +
+ {/if} +
\ No newline at end of file diff --git a/src/docs/which files do I need.md b/src/docs/which files do I need.md deleted file mode 100644 index 5adcbb3..0000000 --- a/src/docs/which files do I need.md +++ /dev/null @@ -1,44 +0,0 @@ -# Which files do I need? - -Ehhh, that's quite some files in this dist folder. Which files do I need? - - -## Full version - -If you're not sure which version to use, use the full version. - -Which files are needed when using the full version? - -- jsoneditor.min.js -- jsoneditor.map (optional, for debugging purposes only) -- jsoneditor.min.css -- img/jsoneditor-icons.svg - - -## Minimalist version - -The minimalist version has excluded the following libraries: - -- `ace` (via `brace`), used for the code editor. -- `ajv`, used for JSON schema validation. -- `vanilla-picker`, used as color picker. - -This reduces the the size of the minified and gzipped JavaScript file -from about 210 kB to about 70 kB (one third). - -When to use the minimalist version? - -- If you don't need the mode "code" and don't need JSON schema validation. -- Or if you want to provide `ace` and/or `ajv` yourself via the configuration - options, for example when you already use Ace in other parts of your - web application too and don't want to bundle the library twice. -- You don't need the color picker, or want to provide your own - color picker using `onColorPicker`. - -Which files are needed when using the minimalist version? - -- jsoneditor-minimalist.min.js -- jsoneditor-minimalist.map (optional, for debugging purposes only) -- jsoneditor.min.css -- img/jsoneditor-icons.svg - diff --git a/src/js/ContextMenu.js b/src/js/ContextMenu.js deleted file mode 100644 index 9bcdb1c..0000000 --- a/src/js/ContextMenu.js +++ /dev/null @@ -1,429 +0,0 @@ -'use strict' - -import { createAbsoluteAnchor } from './createAbsoluteAnchor' -import { addClassName, getSelection, removeClassName, setSelection } from './util' -import { translate } from './i18n' - -/** - * A context menu - * @param {Object[]} items Array containing the menu structure - * TODO: describe structure - * @param {Object} [options] Object with options. Available options: - * {function} close Callback called when the - * context menu is being closed. - * @constructor - */ -export class ContextMenu { - constructor (items, options) { - this.dom = {} - - const me = this - const dom = this.dom - this.anchor = undefined - this.items = items - this.eventListeners = {} - this.selection = undefined // holds the selection before the menu was opened - this.onClose = options ? options.close : undefined - - // create root element - const root = document.createElement('div') - root.className = 'jsoneditor-contextmenu-root' - dom.root = root - - // create a container element - const menu = document.createElement('div') - menu.className = 'jsoneditor-contextmenu' - dom.menu = menu - root.appendChild(menu) - - // create a list to hold the menu items - const list = document.createElement('ul') - list.className = 'jsoneditor-menu' - menu.appendChild(list) - dom.list = list - dom.items = [] // list with all buttons - - // create a (non-visible) button to set the focus to the menu - const focusButton = document.createElement('button') - focusButton.type = 'button' - dom.focusButton = focusButton - const li = document.createElement('li') - li.style.overflow = 'hidden' - li.style.height = '0' - li.appendChild(focusButton) - list.appendChild(li) - - function createMenuItems (list, domItems, items) { - items.forEach(item => { - if (item.type === 'separator') { - // create a separator - const separator = document.createElement('div') - separator.className = 'jsoneditor-separator' - const li = document.createElement('li') - li.appendChild(separator) - list.appendChild(li) - } else { - const domItem = {} - - // create a menu item - const li = document.createElement('li') - list.appendChild(li) - - // create a button in the menu item - const button = document.createElement('button') - button.type = 'button' - button.className = item.className - domItem.button = button - if (item.title) { - button.title = item.title - } - if (item.click) { - button.onclick = event => { - event.preventDefault() - me.hide() - item.click() - } - } - li.appendChild(button) - - // create the contents of the button - if (item.submenu) { - // add the icon to the button - const divIcon = document.createElement('div') - divIcon.className = 'jsoneditor-icon' - button.appendChild(divIcon) - const divText = document.createElement('div') - divText.className = 'jsoneditor-text' + - (item.click ? '' : ' jsoneditor-right-margin') - divText.appendChild(document.createTextNode(item.text)) - button.appendChild(divText) - - let buttonSubmenu - if (item.click) { - // submenu and a button with a click handler - button.className += ' jsoneditor-default' - - const buttonExpand = document.createElement('button') - buttonExpand.type = 'button' - domItem.buttonExpand = buttonExpand - buttonExpand.className = 'jsoneditor-expand' - buttonExpand.innerHTML = '
' - li.appendChild(buttonExpand) - if (item.submenuTitle) { - buttonExpand.title = item.submenuTitle - } - - buttonSubmenu = buttonExpand - } else { - // submenu and a button without a click handler - const divExpand = document.createElement('div') - divExpand.className = 'jsoneditor-expand' - button.appendChild(divExpand) - - buttonSubmenu = button - } - - // attach a handler to expand/collapse the submenu - buttonSubmenu.onclick = event => { - event.preventDefault() - me._onExpandItem(domItem) - buttonSubmenu.focus() - } - - // create the submenu - const domSubItems = [] - domItem.subItems = domSubItems - const ul = document.createElement('ul') - domItem.ul = ul - ul.className = 'jsoneditor-menu' - ul.style.height = '0' - li.appendChild(ul) - createMenuItems(ul, domSubItems, item.submenu) - } else { - // no submenu, just a button with clickhandler - button.innerHTML = '
' + - '
' + translate(item.text) + '
' - } - - domItems.push(domItem) - } - }) - } - createMenuItems(list, this.dom.items, items) - - // TODO: when the editor is small, show the submenu on the right instead of inline? - - // calculate the max height of the menu with one submenu expanded - this.maxHeight = 0 // height in pixels - items.forEach(item => { - const height = (items.length + (item.submenu ? item.submenu.length : 0)) * 24 - me.maxHeight = Math.max(me.maxHeight, height) - }) - } - - /** - * Get the currently visible buttons - * @return {Array.} buttons - * @private - */ - _getVisibleButtons () { - const buttons = [] - const me = this - this.dom.items.forEach(item => { - buttons.push(item.button) - if (item.buttonExpand) { - buttons.push(item.buttonExpand) - } - if (item.subItems && item === me.expandedItem) { - item.subItems.forEach(subItem => { - buttons.push(subItem.button) - if (subItem.buttonExpand) { - buttons.push(subItem.buttonExpand) - } - // TODO: change to fully recursive method - }) - } - }) - - return buttons - } - - /** - * Attach the menu to an anchor - * @param {HTMLElement} anchor Anchor where the menu will be attached as sibling. - * @param {HTMLElement} frame The root of the JSONEditor window - * @param {Boolean=} ignoreParent ignore anchor parent in regard to the calculation of the position, needed when the parent position is absolute - */ - show (anchor, frame, ignoreParent) { - this.hide() - - // determine whether to display the menu below or above the anchor - let showBelow = true - const parent = anchor.parentNode - const anchorRect = anchor.getBoundingClientRect() - const parentRect = parent.getBoundingClientRect() - const frameRect = frame.getBoundingClientRect() - - const me = this - this.dom.absoluteAnchor = createAbsoluteAnchor(anchor, frame, () => { - me.hide() - }) - - if (anchorRect.bottom + this.maxHeight < frameRect.bottom) { - // fits below -> show below - } else if (anchorRect.top - this.maxHeight > frameRect.top) { - // fits above -> show above - showBelow = false - } else { - // doesn't fit above nor below -> show below - } - - const topGap = ignoreParent ? 0 : (anchorRect.top - parentRect.top) - - // position the menu - if (showBelow) { - // display the menu below the anchor - const anchorHeight = anchor.offsetHeight - this.dom.menu.style.left = '0' - this.dom.menu.style.top = topGap + anchorHeight + 'px' - this.dom.menu.style.bottom = '' - } else { - // display the menu above the anchor - this.dom.menu.style.left = '0' - this.dom.menu.style.top = '' - this.dom.menu.style.bottom = '0px' - } - - // attach the menu to the temporary, absolute anchor - // parent.insertBefore(this.dom.root, anchor); - this.dom.absoluteAnchor.appendChild(this.dom.root) - - // move focus to the first button in the context menu - this.selection = getSelection() - this.anchor = anchor - setTimeout(() => { - me.dom.focusButton.focus() - }, 0) - - if (ContextMenu.visibleMenu) { - ContextMenu.visibleMenu.hide() - } - ContextMenu.visibleMenu = this - } - - /** - * Hide the context menu if visible - */ - hide () { - // remove temporary absolutely positioned anchor - if (this.dom.absoluteAnchor) { - this.dom.absoluteAnchor.destroy() - delete this.dom.absoluteAnchor - } - - // remove the menu from the DOM - if (this.dom.root.parentNode) { - this.dom.root.parentNode.removeChild(this.dom.root) - if (this.onClose) { - this.onClose() - } - } - - if (ContextMenu.visibleMenu === this) { - ContextMenu.visibleMenu = undefined - } - } - - /** - * Expand a submenu - * Any currently expanded submenu will be hided. - * @param {Object} domItem - * @private - */ - _onExpandItem (domItem) { - const me = this - const alreadyVisible = (domItem === this.expandedItem) - - // hide the currently visible submenu - const expandedItem = this.expandedItem - if (expandedItem) { - // var ul = expandedItem.ul; - expandedItem.ul.style.height = '0' - expandedItem.ul.style.padding = '' - setTimeout(() => { - if (me.expandedItem !== expandedItem) { - expandedItem.ul.style.display = '' - removeClassName(expandedItem.ul.parentNode, 'jsoneditor-selected') - } - }, 300) // timeout duration must match the css transition duration - this.expandedItem = undefined - } - - if (!alreadyVisible) { - const ul = domItem.ul - ul.style.display = 'block' - // eslint-disable-next-line no-unused-expressions - ul.clientHeight // force a reflow in Firefox - setTimeout(() => { - if (me.expandedItem === domItem) { - let childsHeight = 0 - for (let i = 0; i < ul.childNodes.length; i++) { - childsHeight += ul.childNodes[i].clientHeight - } - ul.style.height = childsHeight + 'px' - ul.style.padding = '5px 10px' - } - }, 0) - addClassName(ul.parentNode, 'jsoneditor-selected') - this.expandedItem = domItem - } - } - - /** - * Handle onkeydown event - * @param {Event} event - * @private - */ - _onKeyDown (event) { - const target = event.target - const keynum = event.which - let handled = false - let buttons, targetIndex, prevButton, nextButton - - if (keynum === 27) { // ESC - // hide the menu on ESC key - - // restore previous selection and focus - if (this.selection) { - setSelection(this.selection) - } - if (this.anchor) { - this.anchor.focus() - } - - this.hide() - - handled = true - } else if (keynum === 9) { // Tab - if (!event.shiftKey) { // Tab - buttons = this._getVisibleButtons() - targetIndex = buttons.indexOf(target) - if (targetIndex === buttons.length - 1) { - // move to first button - buttons[0].focus() - handled = true - } - } else { // Shift+Tab - buttons = this._getVisibleButtons() - targetIndex = buttons.indexOf(target) - if (targetIndex === 0) { - // move to last button - buttons[buttons.length - 1].focus() - handled = true - } - } - } else if (keynum === 37) { // Arrow Left - if (target.className === 'jsoneditor-expand') { - buttons = this._getVisibleButtons() - targetIndex = buttons.indexOf(target) - prevButton = buttons[targetIndex - 1] - if (prevButton) { - prevButton.focus() - } - } - handled = true - } else if (keynum === 38) { // Arrow Up - buttons = this._getVisibleButtons() - targetIndex = buttons.indexOf(target) - prevButton = buttons[targetIndex - 1] - if (prevButton && prevButton.className === 'jsoneditor-expand') { - // skip expand button - prevButton = buttons[targetIndex - 2] - } - if (!prevButton) { - // move to last button - prevButton = buttons[buttons.length - 1] - } - if (prevButton) { - prevButton.focus() - } - handled = true - } else if (keynum === 39) { // Arrow Right - buttons = this._getVisibleButtons() - targetIndex = buttons.indexOf(target) - nextButton = buttons[targetIndex + 1] - if (nextButton && nextButton.className === 'jsoneditor-expand') { - nextButton.focus() - } - handled = true - } else if (keynum === 40) { // Arrow Down - buttons = this._getVisibleButtons() - targetIndex = buttons.indexOf(target) - nextButton = buttons[targetIndex + 1] - if (nextButton && nextButton.className === 'jsoneditor-expand') { - // skip expand button - nextButton = buttons[targetIndex + 2] - } - if (!nextButton) { - // move to first button - nextButton = buttons[0] - } - if (nextButton) { - nextButton.focus() - handled = true - } - handled = true - } - // TODO: arrow left and right - - if (handled) { - event.stopPropagation() - event.preventDefault() - } - } -} - -// currently displayed context menu, a singleton. We may only have one visible context menu -ContextMenu.visibleMenu = undefined - -export default ContextMenu diff --git a/src/js/ErrorTable.js b/src/js/ErrorTable.js deleted file mode 100644 index 0da8761..0000000 --- a/src/js/ErrorTable.js +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Show errors and schema warnings in a clickable table view - * @param {Object} config - * @property {boolean} errorTableVisible - * @property {function (boolean) : void} onToggleVisibility - * @property {function (number)} [onFocusLine] - * @property {function (number)} onChangeHeight - * @constructor - */ -export class ErrorTable { - constructor (config) { - this.errorTableVisible = config.errorTableVisible - this.onToggleVisibility = config.onToggleVisibility - this.onFocusLine = config.onFocusLine || (() => {}) - this.onChangeHeight = config.onChangeHeight - - this.dom = {} - - const validationErrorsContainer = document.createElement('div') - validationErrorsContainer.className = 'jsoneditor-validation-errors-container' - this.dom.validationErrorsContainer = validationErrorsContainer - - const additionalErrorsIndication = document.createElement('div') - additionalErrorsIndication.style.display = 'none' - additionalErrorsIndication.className = 'jsoneditor-additional-errors fadein' - additionalErrorsIndication.innerHTML = 'Scroll for more ▿' - this.dom.additionalErrorsIndication = additionalErrorsIndication - validationErrorsContainer.appendChild(additionalErrorsIndication) - - const validationErrorIcon = document.createElement('span') - validationErrorIcon.className = 'jsoneditor-validation-error-icon' - validationErrorIcon.style.display = 'none' - this.dom.validationErrorIcon = validationErrorIcon - - const validationErrorCount = document.createElement('span') - validationErrorCount.className = 'jsoneditor-validation-error-count' - validationErrorCount.style.display = 'none' - this.dom.validationErrorCount = validationErrorCount - - this.dom.parseErrorIndication = document.createElement('span') - this.dom.parseErrorIndication.className = 'jsoneditor-parse-error-icon' - this.dom.parseErrorIndication.style.display = 'none' - } - - getErrorTable () { - return this.dom.validationErrorsContainer - } - - getErrorCounter () { - return this.dom.validationErrorCount - } - - getWarningIcon () { - return this.dom.validationErrorIcon - } - - getErrorIcon () { - return this.dom.parseErrorIndication - } - - toggleTableVisibility () { - this.errorTableVisible = !this.errorTableVisible - this.onToggleVisibility(this.errorTableVisible) - } - - setErrors (errors, errorLocations) { - // clear any previous errors - if (this.dom.validationErrors) { - this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors) - this.dom.validationErrors = null - this.dom.additionalErrorsIndication.style.display = 'none' - } - - // create the table with errors - // keep default behavior for parse errors - if (this.errorTableVisible && errors.length > 0) { - const validationErrors = document.createElement('div') - validationErrors.className = 'jsoneditor-validation-errors' - validationErrors.innerHTML = '
' - const tbody = validationErrors.getElementsByTagName('tbody')[0] - - errors.forEach(error => { - let message - if (typeof error === 'string') { - message = '
' + error + '
' - } else { - message = - '' + (error.dataPath || '') + '' + - '
' + error.message + '
' - } - - let line - - if (!isNaN(error.line)) { - line = error.line - } else if (error.dataPath) { - const errLoc = errorLocations.find(loc => loc.path === error.dataPath) - if (errLoc) { - line = errLoc.line + 1 - } - } - - const trEl = document.createElement('tr') - trEl.className = !isNaN(line) ? 'jump-to-line' : '' - if (error.type === 'error') { - trEl.className += ' parse-error' - } else { - trEl.className += ' validation-error' - } - - trEl.innerHTML = ('' + (!isNaN(line) ? ('Ln ' + line) : '') + '' + message) - trEl.onclick = () => { - this.onFocusLine(line) - } - - tbody.appendChild(trEl) - }) - - this.dom.validationErrors = validationErrors - this.dom.validationErrorsContainer.appendChild(validationErrors) - this.dom.additionalErrorsIndication.title = errors.length + ' errors total' - - if (this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight) { - this.dom.additionalErrorsIndication.style.display = 'block' - this.dom.validationErrorsContainer.onscroll = () => { - this.dom.additionalErrorsIndication.style.display = - (this.dom.validationErrorsContainer.clientHeight > 0 && this.dom.validationErrorsContainer.scrollTop === 0) ? 'block' : 'none' - } - } else { - this.dom.validationErrorsContainer.onscroll = undefined - } - - const height = this.dom.validationErrorsContainer.clientHeight + (this.dom.statusBar ? this.dom.statusBar.clientHeight : 0) - // this.content.style.marginBottom = (-height) + 'px'; - // this.content.style.paddingBottom = height + 'px'; - this.onChangeHeight(height) - } else { - this.onChangeHeight(0) - } - - // update the status bar - const validationErrorsCount = errors.filter(error => error.type !== 'error').length - if (validationErrorsCount > 0) { - this.dom.validationErrorCount.style.display = 'inline' - this.dom.validationErrorCount.innerText = validationErrorsCount - this.dom.validationErrorCount.onclick = this.toggleTableVisibility.bind(this) - - this.dom.validationErrorIcon.style.display = 'inline' - this.dom.validationErrorIcon.title = validationErrorsCount + ' schema validation error(s) found' - this.dom.validationErrorIcon.onclick = this.toggleTableVisibility.bind(this) - } else { - this.dom.validationErrorCount.style.display = 'none' - this.dom.validationErrorIcon.style.display = 'none' - } - - // update the parse error icon - const hasParseErrors = errors.some(error => error.type === 'error') - if (hasParseErrors) { - const line = errors[0].line - this.dom.parseErrorIndication.style.display = 'block' - this.dom.parseErrorIndication.title = !isNaN(line) - ? ('parse error on line ' + line) - : 'parse error - check that the json is valid' - this.dom.parseErrorIndication.onclick = this.toggleTableVisibility.bind(this) - } else { - this.dom.parseErrorIndication.style.display = 'none' - } - } -} diff --git a/src/js/FocusTracker.js b/src/js/FocusTracker.js deleted file mode 100644 index 453f8bb..0000000 --- a/src/js/FocusTracker.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict' - -/** - * @constructor FocusTracker - * A custom focus tracker for a DOM element with complex internal DOM structure - * @param {[Object]} config A set of configurations for the FocusTracker - * {DOM Object} target * The DOM object to track (required) - * {Function} onFocus onFocus callback - * {Function} onBlur onBlur callback - * - * @return - */ - -export class FocusTracker { - constructor (config) { - this.target = config.target || null - if (!this.target) { - throw new Error('FocusTracker constructor called without a "target" to track.') - } - - this.onFocus = (typeof config.onFocus === 'function') ? config.onFocus : null - this.onBlur = (typeof config.onBlur === 'function') ? config.onBlur : null - this._onClick = this._onEvent.bind(this) - this._onKeyUp = function (event) { - if (event.which === 9 || event.keyCode === 9) { - this._onEvent(event) - } - }.bind(this) - - this.focusFlag = false - this.firstEventFlag = true - - /* - Adds required (click and keyup) event listeners to the 'document' object - to track the focus of the given 'target' - */ - if (this.onFocus || this.onBlur) { - document.addEventListener('click', this._onClick) - document.addEventListener('keyup', this._onKeyUp) - } - } - - /** - * Removes the event listeners on the 'document' object - * that were added to track the focus of the given 'target' - */ - destroy () { - document.removeEventListener('click', this._onClick) - document.removeEventListener('keyup', this._onKeyUp) - this._onEvent({ target: document.body }) // calling _onEvent with body element in the hope that the FocusTracker is added to an element inside the body tag - } - - /** - * Tracks the focus of the target and calls the onFocus and onBlur - * event callbacks if available. - * @param {Event} [event] The 'click' or 'keyup' event object, - * from the respective events set on - * document object - * @private - */ - - _onEvent (event) { - const target = event.target - let focusFlag - if (target === this.target) { - focusFlag = true - } else if (this.target.contains(target) || this.target.contains(document.activeElement)) { - focusFlag = true - } else { - focusFlag = false - } - - if (focusFlag) { - if (!this.focusFlag) { - // trigger the onFocus callback - if (this.onFocus) { - this.onFocus({ type: 'focus', target: this.target }) - } - this.focusFlag = true - } - } else { - if (this.focusFlag || this.firstEventFlag) { - // trigger the onBlur callback - if (this.onBlur) { - this.onBlur({ type: 'blur', target: this.target }) - } - this.focusFlag = false - - /* - When switching from one mode to another in the editor, the FocusTracker gets recreated. - At that time, this.focusFlag will be init to 'false' and will fail the above if condition, when blur occurs - this.firstEventFlag is added to overcome that issue - */ - if (this.firstEventFlag) { - this.firstEventFlag = false - } - } - } - } -} diff --git a/src/js/Highlighter.js b/src/js/Highlighter.js deleted file mode 100644 index 55dd2ae..0000000 --- a/src/js/Highlighter.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict' - -/** - * The highlighter can highlight/unhighlight a node, and - * animate the visibility of a context menu. - * @constructor Highlighter - */ -export class Highlighter { - constructor () { - this.locked = false - } - - /** - * Hightlight given node and its childs - * @param {Node} node - */ - highlight (node) { - if (this.locked) { - return - } - - if (this.node !== node) { - // unhighlight current node - if (this.node) { - this.node.setHighlight(false) - } - - // highlight new node - this.node = node - this.node.setHighlight(true) - } - - // cancel any current timeout - this._cancelUnhighlight() - } - - /** - * Unhighlight currently highlighted node. - * Will be done after a delay - */ - unhighlight () { - if (this.locked) { - return - } - - const me = this - if (this.node) { - this._cancelUnhighlight() - - // do the unhighlighting after a small delay, to prevent re-highlighting - // the same node when moving from the drag-icon to the contextmenu-icon - // or vice versa. - this.unhighlightTimer = setTimeout(() => { - me.node.setHighlight(false) - me.node = undefined - me.unhighlightTimer = undefined - }, 0) - } - } - - /** - * Cancel an unhighlight action (if before the timeout of the unhighlight action) - * @private - */ - _cancelUnhighlight () { - if (this.unhighlightTimer) { - clearTimeout(this.unhighlightTimer) - this.unhighlightTimer = undefined - } - } - - /** - * Lock highlighting or unhighlighting nodes. - * methods highlight and unhighlight do not work while locked. - */ - lock () { - this.locked = true - } - - /** - * Unlock highlighting or unhighlighting nodes - */ - unlock () { - this.locked = false - } -} diff --git a/src/js/History.js b/src/js/History.js deleted file mode 100644 index 9430a6d..0000000 --- a/src/js/History.js +++ /dev/null @@ -1,85 +0,0 @@ - -/** - * Keep track on any history, be able - * @param {function} onChange - * @param {function} calculateItemSize - * @param {number} limit Maximum size of all items in history - * @constructor - */ -export class History { - constructor (onChange, calculateItemSize, limit) { - this.onChange = onChange - this.calculateItemSize = calculateItemSize || (() => 1) - this.limit = limit - - this.items = [] - this.index = -1 - } - - add (item) { - // limit number of items in history so that the total size doesn't - // always keep at least one item in memory - while (this._calculateHistorySize() > this.limit && this.items.length > 1) { - this.items.shift() - this.index-- - } - - // cleanup any redo action that are not valid anymore - this.items = this.items.slice(0, this.index + 1) - - this.items.push(item) - this.index++ - - this.onChange() - } - - _calculateHistorySize () { - const calculateItemSize = this.calculateItemSize - let totalSize = 0 - - this.items.forEach(item => { - totalSize += calculateItemSize(item) - }) - - return totalSize - } - - undo () { - if (!this.canUndo()) { - return - } - - this.index-- - - this.onChange() - - return this.items[this.index] - } - - redo () { - if (!this.canRedo()) { - return - } - - this.index++ - - this.onChange() - - return this.items[this.index] - } - - canUndo () { - return this.index > 0 - } - - canRedo () { - return this.index < this.items.length - 1 - } - - clear () { - this.items = [] - this.index = -1 - - this.onChange() - } -} diff --git a/src/js/JSONEditor.js b/src/js/JSONEditor.js deleted file mode 100644 index 7eb774a..0000000 --- a/src/js/JSONEditor.js +++ /dev/null @@ -1,491 +0,0 @@ -'use strict' - -const ace = require('./ace') // may be undefined in case of minimalist bundle -const VanillaPicker = require('./vanilla-picker') // may be undefined in case of minimalist bundle -const { treeModeMixins } = require('./treemode') -const { textModeMixins } = require('./textmode') -const { previewModeMixins } = require('./previewmode') -const { clear, extend, getInternetExplorerVersion, parse } = require('./util') -const { tryRequireAjv } = require('./tryRequireAjv') -const { showTransformModal } = require('./showTransformModal') -const { showSortModal } = require('./showSortModal') - -const Ajv = tryRequireAjv() - -if (typeof Promise === 'undefined') { - console.error('Promise undefined. Please load a Promise polyfill in the browser in order to use JSONEditor') -} - -/** - * @constructor JSONEditor - * @param {Element} container Container element - * @param {Object} [options] Object with options. available options: - * {String} mode Editor mode. Available values: - * 'tree' (default), 'view', - * 'form', 'text', and 'code'. - * {function} onChange Callback method, triggered - * on change of contents. - * Does not pass the contents itself. - * See also `onChangeJSON` and - * `onChangeText`. - * {function} onChangeJSON Callback method, triggered - * in modes on change of contents, - * passing the changed contents - * as JSON. - * Only applicable for modes - * 'tree', 'view', and 'form'. - * {function} onChangeText Callback method, triggered - * in modes on change of contents, - * passing the changed contents - * as stringified JSON. - * {function} onError Callback method, triggered - * when an error occurs - * {Boolean} search Enable search box. - * True by default - * Only applicable for modes - * 'tree', 'view', and 'form' - * {Boolean} history Enable history (undo/redo). - * True by default - * Only applicable for modes - * 'tree', 'view', and 'form' - * {String} name Field name for the root node. - * Only applicable for modes - * 'tree', 'view', and 'form' - * {Number} indentation Number of indentation - * spaces. 4 by default. - * Only applicable for - * modes 'text' and 'code' - * {boolean} escapeUnicode If true, unicode - * characters are escaped. - * false by default. - * {boolean} sortObjectKeys If true, object keys are - * sorted before display. - * false by default. - * {function} onSelectionChange Callback method, - * triggered on node selection change - * Only applicable for modes - * 'tree', 'view', and 'form' - * {function} onTextSelectionChange Callback method, - * triggered on text selection change - * Only applicable for modes - * {HTMLElement} modalAnchor The anchor element to apply an - * overlay and display the modals in a - * centered location. - * Defaults to document.body - * 'text' and 'code' - * {function} onEvent Callback method, triggered - * when an event occurs in - * a JSON field or value. - * Only applicable for - * modes 'form', 'tree' and - * 'view' - * {function} onFocus Callback method, triggered - * when the editor comes into focus, - * passing an object {type, target}, - * Applicable for all modes - * {function} onBlur Callback method, triggered - * when the editor goes out of focus, - * passing an object {type, target}, - * Applicable for all modes - * {function} onClassName Callback method, triggered - * when a Node DOM is rendered. Function returns - * a css class name to be set on a node. - * Only applicable for - * modes 'form', 'tree' and - * 'view' - * {Number} maxVisibleChilds Number of children allowed for a node - * in 'tree', 'view', or 'form' mode before - * the "show more/show all" buttons appear. - * 100 by default. - * - * @param {Object | undefined} json JSON object - */ -function JSONEditor (container, options, json) { - if (!(this instanceof JSONEditor)) { - throw new Error('JSONEditor constructor called without "new".') - } - - // check for unsupported browser (IE8 and older) - const ieVersion = getInternetExplorerVersion() - if (ieVersion !== -1 && ieVersion < 9) { - throw new Error('Unsupported browser, IE9 or newer required. ' + - 'Please install the newest version of your browser.') - } - - if (options) { - // check for deprecated options - if (options.error) { - console.warn('Option "error" has been renamed to "onError"') - options.onError = options.error - delete options.error - } - if (options.change) { - console.warn('Option "change" has been renamed to "onChange"') - options.onChange = options.change - delete options.change - } - if (options.editable) { - console.warn('Option "editable" has been renamed to "onEditable"') - options.onEditable = options.editable - delete options.editable - } - - // warn if onChangeJSON is used when mode can be `text` or `code` - if (options.onChangeJSON) { - if (options.mode === 'text' || options.mode === 'code' || - (options.modes && (options.modes.indexOf('text') !== -1 || options.modes.indexOf('code') !== -1))) { - console.warn('Option "onChangeJSON" is not applicable to modes "text" and "code". ' + - 'Use "onChangeText" or "onChange" instead.') - } - } - - // validate options - if (options) { - Object.keys(options).forEach(option => { - if (JSONEditor.VALID_OPTIONS.indexOf(option) === -1) { - console.warn('Unknown option "' + option + '". This option will be ignored') - } - }) - } - } - - if (arguments.length) { - this._create(container, options, json) - } -} - -/** - * Configuration for all registered modes. Example: - * { - * tree: { - * mixin: TreeEditor, - * data: 'json' - * }, - * text: { - * mixin: TextEditor, - * data: 'text' - * } - * } - * - * @type { Object. } - */ -JSONEditor.modes = {} - -// debounce interval for JSON schema validation in milliseconds -JSONEditor.prototype.DEBOUNCE_INTERVAL = 150 - -JSONEditor.VALID_OPTIONS = [ - 'ajv', 'schema', 'schemaRefs', 'templates', - 'ace', 'theme', 'autocomplete', - 'onChange', 'onChangeJSON', 'onChangeText', - 'onEditable', 'onError', 'onEvent', 'onModeChange', 'onNodeName', 'onValidate', 'onCreateMenu', - 'onSelectionChange', 'onTextSelectionChange', 'onClassName', - 'onFocus', 'onBlur', - 'colorPicker', 'onColorPicker', - 'timestampTag', 'timestampFormat', - 'escapeUnicode', 'history', 'search', 'mode', 'modes', 'name', 'indentation', - 'sortObjectKeys', 'navigationBar', 'statusBar', 'mainMenuBar', 'languages', 'language', 'enableSort', 'enableTransform', - 'maxVisibleChilds', 'onValidationError', - 'modalAnchor', 'popupAnchor', - 'createQuery', 'executeQuery', 'queryDescription' -] - -/** - * Create the JSONEditor - * @param {Element} container Container element - * @param {Object} [options] See description in constructor - * @param {Object | undefined} json JSON object - * @private - */ -JSONEditor.prototype._create = function (container, options, json) { - this.container = container - this.options = options || {} - this.json = json || {} - - const mode = this.options.mode || (this.options.modes && this.options.modes[0]) || 'tree' - this.setMode(mode) -} - -/** - * Destroy the editor. Clean up DOM, event listeners, and web workers. - */ -JSONEditor.prototype.destroy = () => {} - -/** - * Set JSON object in editor - * @param {Object | undefined} json JSON data - */ -JSONEditor.prototype.set = function (json) { - this.json = json -} - -/** - * Get JSON from the editor - * @returns {Object} json - */ -JSONEditor.prototype.get = function () { - return this.json -} - -/** - * Set string containing JSON for the editor - * @param {String | undefined} jsonText - */ -JSONEditor.prototype.setText = function (jsonText) { - this.json = parse(jsonText) -} - -/** - * Get stringified JSON contents from the editor - * @returns {String} jsonText - */ -JSONEditor.prototype.getText = function () { - return JSON.stringify(this.json) -} - -/** - * Set a field name for the root node. - * @param {String | undefined} name - */ -JSONEditor.prototype.setName = function (name) { - if (!this.options) { - this.options = {} - } - this.options.name = name -} - -/** - * Get the field name for the root node. - * @return {String | undefined} name - */ -JSONEditor.prototype.getName = function () { - return this.options && this.options.name -} - -/** - * Change the mode of the editor. - * JSONEditor will be extended with all methods needed for the chosen mode. - * @param {String} mode Available modes: 'tree' (default), 'view', 'form', - * 'text', and 'code'. - */ -JSONEditor.prototype.setMode = function (mode) { - // if the mode is the same as current mode (and it's not the first time), do nothing. - if (mode === this.options.mode && this.create) { - return - } - - const container = this.container - const options = extend({}, this.options) - const oldMode = options.mode - let data - let name - - options.mode = mode - const config = JSONEditor.modes[mode] - if (config) { - try { - const asText = (config.data === 'text') - name = this.getName() - data = this[asText ? 'getText' : 'get']() // get text or json - - this.destroy() - clear(this) - extend(this, config.mixin) - this.create(container, options) - - this.setName(name) - this[asText ? 'setText' : 'set'](data) // set text or json - - if (typeof config.load === 'function') { - try { - config.load.call(this) - } catch (err) { - console.error(err) - } - } - - if (typeof options.onModeChange === 'function' && mode !== oldMode) { - try { - options.onModeChange(mode, oldMode) - } catch (err) { - console.error(err) - } - } - } catch (err) { - this._onError(err) - } - } else { - throw new Error('Unknown mode "' + options.mode + '"') - } -} - -/** - * Get the current mode - * @return {string} - */ -JSONEditor.prototype.getMode = function () { - return this.options.mode -} - -/** - * Throw an error. If an error callback is configured in options.error, this - * callback will be invoked. Else, a regular error is thrown. - * @param {Error} err - * @private - */ -JSONEditor.prototype._onError = function (err) { - if (this.options && typeof this.options.onError === 'function') { - this.options.onError(err) - } else { - throw err - } -} - -/** - * Set a JSON schema for validation of the JSON object. - * To remove the schema, call JSONEditor.setSchema(null) - * @param {Object | null} schema - * @param {Object.=} schemaRefs Schemas that are referenced using the `$ref` property from the JSON schema that are set in the `schema` option, - + the object structure in the form of `{reference_key: schemaObject}` - */ -JSONEditor.prototype.setSchema = function (schema, schemaRefs) { - // compile a JSON schema validator if a JSON schema is provided - if (schema) { - let ajv - try { - // grab ajv from options if provided, else create a new instance - if (this.options.ajv) { - ajv = this.options.ajv - } else { - ajv = Ajv({ - allErrors: true, - verbose: true, - schemaId: 'auto', - $data: true - }) - - // support both draft-04 and draft-06 alongside the latest draft-07 - ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')) - ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')) - } - } catch (err) { - console.warn('Failed to create an instance of Ajv, JSON Schema validation is not available. Please use a JSONEditor bundle including Ajv, or pass an instance of Ajv as via the configuration option `ajv`.') - } - - if (ajv) { - if (schemaRefs) { - for (const ref in schemaRefs) { - ajv.removeSchema(ref) // When updating a schema - old refs has to be removed first - if (schemaRefs[ref]) { - ajv.addSchema(schemaRefs[ref], ref) - } - } - this.options.schemaRefs = schemaRefs - } - this.validateSchema = ajv.compile(schema) - - // add schema to the options, so that when switching to an other mode, - // the set schema is not lost - this.options.schema = schema - - // validate now - this.validate() - } - - this.refresh() // update DOM - } else { - // remove current schema - this.validateSchema = null - this.options.schema = null - this.options.schemaRefs = null - this.validate() // to clear current error messages - this.refresh() // update DOM - } -} - -/** - * Validate current JSON object against the configured JSON schema - * Throws an exception when no JSON schema is configured - */ -JSONEditor.prototype.validate = () => { - // must be implemented by treemode and textmode -} - -/** - * Refresh the rendered contents - */ -JSONEditor.prototype.refresh = () => { - // can be implemented by treemode and textmode -} - -/** - * Register a plugin with one ore multiple modes for the JSON Editor. - * - * A mode is described as an object with properties: - * - * - `mode: String` The name of the mode. - * - `mixin: Object` An object containing the mixin functions which - * will be added to the JSONEditor. Must contain functions - * create, get, getText, set, and setText. May have - * additional functions. - * When the JSONEditor switches to a mixin, all mixin - * functions are added to the JSONEditor, and then - * the function `create(container, options)` is executed. - * - `data: 'text' | 'json'` The type of data that will be used to load the mixin. - * - `[load: function]` An optional function called after the mixin - * has been loaded. - * - * @param {Object | Array} mode A mode object or an array with multiple mode objects. - */ -JSONEditor.registerMode = mode => { - let i, prop - - if (Array.isArray(mode)) { - // multiple modes - for (i = 0; i < mode.length; i++) { - JSONEditor.registerMode(mode[i]) - } - } else { - // validate the new mode - if (!('mode' in mode)) throw new Error('Property "mode" missing') - if (!('mixin' in mode)) throw new Error('Property "mixin" missing') - if (!('data' in mode)) throw new Error('Property "data" missing') - const name = mode.mode - if (name in JSONEditor.modes) { - throw new Error('Mode "' + name + '" already registered') - } - - // validate the mixin - if (typeof mode.mixin.create !== 'function') { - throw new Error('Required function "create" missing on mixin') - } - const reserved = ['setMode', 'registerMode', 'modes'] - for (i = 0; i < reserved.length; i++) { - prop = reserved[i] - if (prop in mode.mixin) { - throw new Error('Reserved property "' + prop + '" not allowed in mixin') - } - } - - JSONEditor.modes[name] = mode - } -} - -// register tree, text, and preview modes -JSONEditor.registerMode(treeModeMixins) -JSONEditor.registerMode(textModeMixins) -JSONEditor.registerMode(previewModeMixins) - -// expose some of the libraries that can be used customized -JSONEditor.ace = ace -JSONEditor.Ajv = Ajv -JSONEditor.VanillaPicker = VanillaPicker - -// expose some utils (this is undocumented, unofficial) -JSONEditor.showTransformModal = showTransformModal -JSONEditor.showSortModal = showSortModal - -// default export for TypeScript ES6 projects -JSONEditor.default = JSONEditor - -module.exports = JSONEditor diff --git a/src/js/ModeSwitcher.js b/src/js/ModeSwitcher.js deleted file mode 100644 index cb9e009..0000000 --- a/src/js/ModeSwitcher.js +++ /dev/null @@ -1,123 +0,0 @@ -'use strict' - -import { ContextMenu } from './ContextMenu' -import { translate } from './i18n' - -/** - * Create a select box to be used in the editor menu's, which allows to switch mode - * @param {HTMLElement} container - * @param {String[]} modes Available modes: 'code', 'form', 'text', 'tree', 'view', 'preview' - * @param {String} current Available modes: 'code', 'form', 'text', 'tree', 'view', 'preview' - * @param {function(mode: string)} onSwitch Callback invoked on switch - * @constructor - */ -export class ModeSwitcher { - constructor (container, modes, current, onSwitch) { - // available modes - const availableModes = { - code: { - text: translate('modeCodeText'), - title: translate('modeCodeTitle'), - click: function () { - onSwitch('code') - } - }, - form: { - text: translate('modeFormText'), - title: translate('modeFormTitle'), - click: function () { - onSwitch('form') - } - }, - text: { - text: translate('modeTextText'), - title: translate('modeTextTitle'), - click: function () { - onSwitch('text') - } - }, - tree: { - text: translate('modeTreeText'), - title: translate('modeTreeTitle'), - click: function () { - onSwitch('tree') - } - }, - view: { - text: translate('modeViewText'), - title: translate('modeViewTitle'), - click: function () { - onSwitch('view') - } - }, - preview: { - text: translate('modePreviewText'), - title: translate('modePreviewTitle'), - click: function () { - onSwitch('preview') - } - } - } - - // list the selected modes - const items = [] - for (let i = 0; i < modes.length; i++) { - const mode = modes[i] - const item = availableModes[mode] - if (!item) { - throw new Error('Unknown mode "' + mode + '"') - } - - item.className = 'jsoneditor-type-modes' + ((current === mode) ? ' jsoneditor-selected' : '') - items.push(item) - } - - // retrieve the title of current mode - const currentMode = availableModes[current] - if (!currentMode) { - throw new Error('Unknown mode "' + current + '"') - } - const currentTitle = currentMode.text - - // create the html element - const box = document.createElement('button') - box.type = 'button' - box.className = 'jsoneditor-modes jsoneditor-separator' - box.innerHTML = currentTitle + ' ▾' - box.title = translate('modeEditorTitle') - box.onclick = () => { - const menu = new ContextMenu(items) - menu.show(box, container) - } - - const frame = document.createElement('div') - frame.className = 'jsoneditor-modes' - frame.style.position = 'relative' - frame.appendChild(box) - - container.appendChild(frame) - - this.dom = { - container: container, - box: box, - frame: frame - } - } - - /** - * Set focus to switcher - */ - focus () { - this.dom.box.focus() - } - - /** - * Destroy the ModeSwitcher, remove from DOM - */ - destroy () { - if (this.dom && this.dom.frame && this.dom.frame.parentNode) { - this.dom.frame.parentNode.removeChild(this.dom.frame) - } - this.dom = null - } -} diff --git a/src/js/Node.js b/src/js/Node.js deleted file mode 100644 index 1b84397..0000000 --- a/src/js/Node.js +++ /dev/null @@ -1,4619 +0,0 @@ -'use strict' - -import naturalSort from 'javascript-natural-sort' -import { createAbsoluteAnchor } from './createAbsoluteAnchor' -import { ContextMenu } from './ContextMenu' -import { appendNodeFactory } from './appendNodeFactory' -import { showMoreNodeFactory } from './showMoreNodeFactory' -import { showSortModal } from './showSortModal' -import { showTransformModal } from './showTransformModal' -import { - addClassName, - addEventListener, - debounce, - escapeUnicodeChars, - findUniqueName, - getAbsoluteLeft, - getAbsoluteTop, - getInnerText, - getType, - isTimestamp, - isUrl, - isValidColor, - makeFieldTooltip, - parse, - parsePath, - parseString, - removeAllClassNames, - removeClassName, - removeEventListener, - selectContentEditable, - setEndOfContentEditable, - stripFormatting, - textDiff -} from './util' -import { translate } from './i18n' -import { DEFAULT_MODAL_ANCHOR } from './constants' - -/** - * @constructor Node - * Create a new Node - * @param {./treemode} editor - * @param {Object} [params] Can contain parameters: - * {string} field - * {boolean} fieldEditable - * {*} value - * {String} type Can have values 'auto', 'array', - * 'object', or 'string'. - */ -export class Node { - constructor (editor, params) { - /** @type {./treemode} */ - this.editor = editor - this.dom = {} - this.expanded = false - - if (params && (params instanceof Object)) { - this.setField(params.field, params.fieldEditable) - if ('value' in params) { - this.setValue(params.value, params.type) - } - if ('internalValue' in params) { - this.setInternalValue(params.internalValue) - } - } else { - this.setField('') - this.setValue(null) - } - - this._debouncedOnChangeValue = debounce(this._onChangeValue.bind(this), Node.prototype.DEBOUNCE_INTERVAL) - this._debouncedOnChangeField = debounce(this._onChangeField.bind(this), Node.prototype.DEBOUNCE_INTERVAL) - - // starting value for visible children - this.visibleChilds = this.getMaxVisibleChilds() - } - - getMaxVisibleChilds () { - return (this.editor && this.editor.options && this.editor.options.maxVisibleChilds) - ? this.editor.options.maxVisibleChilds - : DEFAULT_MAX_VISIBLE_CHILDS - } - - /** - * Determine whether the field and/or value of this node are editable - * @private - */ - _updateEditability () { - this.editable = { - field: true, - value: true - } - - if (this.editor) { - this.editable.field = this.editor.options.mode === 'tree' - this.editable.value = this.editor.options.mode !== 'view' - - if ((this.editor.options.mode === 'tree' || this.editor.options.mode === 'form') && - (typeof this.editor.options.onEditable === 'function')) { - const editable = this.editor.options.onEditable({ - field: this.field, - value: this.value, - path: this.getPath() - }) - - if (typeof editable === 'boolean') { - this.editable.field = editable - this.editable.value = editable - } else { - if (typeof editable.field === 'boolean') this.editable.field = editable.field - if (typeof editable.value === 'boolean') this.editable.value = editable.value - } - } - } - } - - /** - * Get the path of this node - * @return {{string|number}[]} Array containing the path to this node. - * Element is a number if is the index of an array, a string otherwise. - */ - getPath () { - let node = this - const path = [] - while (node) { - const field = node.getName() - if (field !== undefined) { - path.unshift(field) - } - node = node.parent - } - return path - } - - /** - * Get the internal path of this node, a list with the child indexes. - * @return {String[]} Array containing the internal path to this node - */ - getInternalPath () { - let node = this - const internalPath = [] - while (node) { - if (node.parent) { - internalPath.unshift(node.getIndex()) - } - node = node.parent - } - return internalPath - } - - /** - * Get node serializable name - * @returns {String|Number} - */ - getName () { - return !this.parent - ? undefined // do not add an (optional) field name of the root node - : (this.parent.type !== 'array') - ? this.field - : this.index - } - - /** - * Find child node by serializable path - * @param {Array} path - */ - findNodeByPath (path) { - if (!path) { - return - } - - if (path.length === 0) { - return this - } - - if (path.length && this.childs && this.childs.length) { - for (let i = 0; i < this.childs.length; ++i) { - if (('' + path[0]) === ('' + this.childs[i].getName())) { - return this.childs[i].findNodeByPath(path.slice(1)) - } - } - } - } - - /** - * Find child node by an internal path: the indexes of the childs nodes - * @param {Array} internalPath - * @return {Node | undefined} Returns the node if the path exists. - * Returns undefined otherwise. - */ - findNodeByInternalPath (internalPath) { - if (!internalPath) { - return undefined - } - - let node = this - for (let i = 0; i < internalPath.length && node; i++) { - const childIndex = internalPath[i] - node = node.childs[childIndex] - } - - return node - } - - /** - * @typedef {{value: String|Object|Number|Boolean, path: Array.}} SerializableNode - * - * Returns serializable representation for the node - * @return {SerializableNode} - */ - serialize () { - return { - value: this.getValue(), - path: this.getPath() - } - } - - /** - * Find a Node from a JSON path like '.items[3].name' - * @param {string} jsonPath - * @return {Node | null} Returns the Node when found, returns null if not found - */ - findNode (jsonPath) { - const path = parsePath(jsonPath) - let node = this - while (node && path.length > 0) { - const prop = path.shift() - if (typeof prop === 'number') { - if (node.type !== 'array') { - throw new Error('Cannot get child node at index ' + prop + ': node is no array') - } - node = node.childs[prop] - } else { // string - if (node.type !== 'object') { - throw new Error('Cannot get child node ' + prop + ': node is no object') - } - node = node.childs.filter(child => child.field === prop)[0] - } - } - - return node - } - - /** - * Find all parents of this node. The parents are ordered from root node towards - * the original node. - * @return {Array.} - */ - findParents () { - const parents = [] - let parent = this.parent - while (parent) { - parents.unshift(parent) - parent = parent.parent - } - return parents - } - - /** - * - * @param {{dataPath: string, keyword: string, message: string, params: Object, schemaPath: string} | null} error - * @param {Node} [child] When this is the error of a parent node, pointing - * to an invalid child node, the child node itself - * can be provided. If provided, clicking the error - * icon will set focus to the invalid child node. - */ - setError (error, child) { - this.error = error - this.errorChild = child - - if (this.dom && this.dom.tr) { - this.updateError() - } - } - - /** - * Render the error - */ - updateError () { - const error = this.fieldError || this.valueError || this.error - let tdError = this.dom.tdError - if (error && this.dom && this.dom.tr) { - addClassName(this.dom.tr, 'jsoneditor-validation-error') - - if (!tdError) { - tdError = document.createElement('td') - this.dom.tdError = tdError - this.dom.tdValue.parentNode.appendChild(tdError) - } - - const button = document.createElement('button') - button.type = 'button' - button.className = 'jsoneditor-button jsoneditor-schema-error' - - const destroy = () => { - if (this.dom.popupAnchor) { - this.dom.popupAnchor.destroy() // this will trigger the onDestroy callback - } - } - - const onDestroy = () => { - delete this.dom.popupAnchor - } - - const createPopup = (destroyOnMouseOut) => { - const frame = this.editor.frame - this.dom.popupAnchor = createAbsoluteAnchor(button, this.editor.getPopupAnchor(), onDestroy, destroyOnMouseOut) - - const popupWidth = 200 // must correspond to what's configured in the CSS - const buttonRect = button.getBoundingClientRect() - const frameRect = frame.getBoundingClientRect() - const position = (frameRect.width - buttonRect.x > (popupWidth / 2 + 20)) - ? 'jsoneditor-above' - : 'jsoneditor-left' - - const popover = document.createElement('div') - popover.className = 'jsoneditor-popover ' + position - popover.appendChild(document.createTextNode(error.message)) - this.dom.popupAnchor.appendChild(popover) - } - - button.onmouseover = () => { - if (!this.dom.popupAnchor) { - createPopup(true) - } - } - button.onfocus = () => { - destroy() - createPopup(false) - } - button.onblur = () => { - destroy() - } - - // when clicking the error icon, expand all nodes towards the invalid - // child node, and set focus to the child node - const child = this.errorChild - if (child) { - button.onclick = function showInvalidNode () { - child.findParents().forEach(parent => { - parent.expand(false) - }) - - child.scrollTo(() => { - child.focus() - }) - } - } - - // apply the error message to the node - while (tdError.firstChild) { - tdError.removeChild(tdError.firstChild) - } - tdError.appendChild(button) - } else { - if (this.dom.tr) { - removeClassName(this.dom.tr, 'jsoneditor-validation-error') - } - - if (tdError) { - this.dom.tdError.parentNode.removeChild(this.dom.tdError) - delete this.dom.tdError - } - } - } - - /** - * Get the index of this node: the index in the list of childs where this - * node is part of - * @return {number | null} Returns the index, or null if this is the root node - */ - getIndex () { - if (this.parent) { - const index = this.parent.childs.indexOf(this) - return index !== -1 ? index : null - } else { - return -1 - } - } - - /** - * Set parent node - * @param {Node} parent - */ - setParent (parent) { - this.parent = parent - } - - /** - * Set field - * @param {String} field - * @param {boolean} [fieldEditable] - */ - setField (field, fieldEditable) { - this.field = field - this.previousField = field - this.fieldEditable = (fieldEditable === true) - } - - /** - * Get field - * @return {String} - */ - getField () { - if (this.field === undefined) { - this._getDomField() - } - - return this.field - } - - /** - * Set value. Value is a JSON structure or an element String, Boolean, etc. - * @param {*} value - * @param {String} [type] Specify the type of the value. Can be 'auto', - * 'array', 'object', or 'string' - */ - setValue (value, type) { - let childValue, child - let i, j - const updateDom = false - const previousChilds = this.childs - - this.type = this._getType(value) - - // check if type corresponds with the provided type - if (type && type !== this.type) { - if (type === 'string' && this.type === 'auto') { - this.type = type - } else { - throw new Error('Type mismatch: ' + - 'cannot cast value of type "' + this.type + - ' to the specified type "' + type + '"') - } - } - - if (this.type === 'array') { - // array - if (!this.childs) { - this.childs = [] - } - - for (i = 0; i < value.length; i++) { - childValue = value[i] - if (childValue !== undefined && !(childValue instanceof Function)) { - if (i < this.childs.length) { - // reuse existing child, keep its state - child = this.childs[i] - - child.fieldEditable = false - child.index = i - child.setValue(childValue) - } else { - // create a new child - child = new Node(this.editor, { - value: childValue - }) - const visible = i < this.getMaxVisibleChilds() - this.appendChild(child, visible, updateDom) - } - } - } - - // cleanup redundant childs - // we loop backward to prevent issues with shifting index numbers - for (j = this.childs.length; j >= value.length; j--) { - this.removeChild(this.childs[j], updateDom) - } - } else if (this.type === 'object') { - // object - if (!this.childs) { - this.childs = [] - } - - // cleanup redundant childs - // we loop backward to prevent issues with shifting index numbers - for (j = this.childs.length - 1; j >= 0; j--) { - if (!hasOwnProperty(value, this.childs[j].field)) { - this.removeChild(this.childs[j], updateDom) - } - } - - i = 0 - for (const childField in value) { - if (hasOwnProperty(value, childField)) { - childValue = value[childField] - if (childValue !== undefined && !(childValue instanceof Function)) { - const child = this.findChildByProperty(childField) - if (child) { - // reuse existing child, keep its state - child.setField(childField, true) - child.setValue(childValue) - } else { - // create a new child, append to the end - const newChild = new Node(this.editor, { - field: childField, - value: childValue - }) - const visible = i < this.getMaxVisibleChilds() - this.appendChild(newChild, visible, updateDom) - } - } - i++ - } - } - this.value = '' - - // sort object keys during initialization. Must not trigger an onChange action - if (this.editor.options.sortObjectKeys === true) { - const triggerAction = false - this.sort([], 'asc', triggerAction) - } - } else { - // value - this.hideChilds() - - delete this.append - delete this.showMore - delete this.expanded - delete this.childs - - this.value = value - } - - // recreate the DOM if switching from an object/array to auto/string or vice versa - // needed to recreated the expand button for example - if (Array.isArray(previousChilds) !== Array.isArray(this.childs)) { - this.recreateDom() - } - - this.updateDom({ updateIndexes: true }) - - this.previousValue = this.value // used only to check for changes in DOM vs JS model - } - - /** - * Set internal value - * @param {*} internalValue Internal value structure keeping type, - * order and duplicates in objects - */ - setInternalValue (internalValue) { - let childValue, child, visible - let i, j - const notUpdateDom = false - const previousChilds = this.childs - - this.type = internalValue.type - - if (internalValue.type === 'array') { - // array - if (!this.childs) { - this.childs = [] - } - - for (i = 0; i < internalValue.childs.length; i++) { - childValue = internalValue.childs[i] - if (childValue !== undefined && !(childValue instanceof Function)) { - if (i < this.childs.length) { - // reuse existing child, keep its state - child = this.childs[i] - - child.fieldEditable = false - child.index = i - child.setInternalValue(childValue) - } else { - // create a new child - child = new Node(this.editor, { - internalValue: childValue - }) - visible = i < this.getMaxVisibleChilds() - this.appendChild(child, visible, notUpdateDom) - } - } - } - - // cleanup redundant childs - // we loop backward to prevent issues with shifting index numbers - for (j = this.childs.length; j >= internalValue.childs.length; j--) { - this.removeChild(this.childs[j], notUpdateDom) - } - } else if (internalValue.type === 'object') { - // object - if (!this.childs) { - this.childs = [] - } - - for (i = 0; i < internalValue.childs.length; i++) { - childValue = internalValue.childs[i] - if (childValue !== undefined && !(childValue instanceof Function)) { - if (i < this.childs.length) { - // reuse existing child, keep its state - child = this.childs[i] - - delete child.index - child.setField(childValue.field, true) - child.setInternalValue(childValue.value) - } else { - // create a new child - child = new Node(this.editor, { - field: childValue.field, - internalValue: childValue.value - }) - visible = i < this.getMaxVisibleChilds() - this.appendChild(child, visible, notUpdateDom) - } - } - } - - // cleanup redundant childs - // we loop backward to prevent issues with shifting index numbers - for (j = this.childs.length; j >= internalValue.childs.length; j--) { - this.removeChild(this.childs[j], notUpdateDom) - } - } else { - // value - this.hideChilds() - - delete this.append - delete this.showMore - delete this.expanded - delete this.childs - - this.value = internalValue.value - } - - // recreate the DOM if switching from an object/array to auto/string or vice versa - // needed to recreated the expand button for example - if (Array.isArray(previousChilds) !== Array.isArray(this.childs)) { - this.recreateDom() - } - - this.updateDom({ updateIndexes: true }) - - this.previousValue = this.value // used only to check for changes in DOM vs JS model - } - - /** - * Remove the DOM of this node and it's childs and recreate it again - */ - recreateDom () { - if (this.dom && this.dom.tr && this.dom.tr.parentNode) { - const domAnchor = this._detachFromDom() - - this.clearDom() - - this._attachToDom(domAnchor) - } else { - this.clearDom() - } - } - - /** - * Get value. Value is a JSON structure - * @return {*} value - */ - getValue () { - if (this.type === 'array') { - const arr = [] - this.childs.forEach(child => { - arr.push(child.getValue()) - }) - return arr - } else if (this.type === 'object') { - const obj = {} - this.childs.forEach(child => { - obj[child.getField()] = child.getValue() - }) - return obj - } else { - if (this.value === undefined) { - this._getDomValue() - } - - return this.value - } - } - - /** - * Get internal value, a structure which maintains ordering and duplicates in objects - * @return {*} value - */ - getInternalValue () { - if (this.type === 'array') { - return { - type: this.type, - childs: this.childs.map(child => child.getInternalValue()) - } - } else if (this.type === 'object') { - return { - type: this.type, - childs: this.childs.map(child => ({ - field: child.getField(), - value: child.getInternalValue() - })) - } - } else { - if (this.value === undefined) { - this._getDomValue() - } - - return { - type: this.type, - value: this.value - } - } - } - - /** - * Get the nesting level of this node - * @return {Number} level - */ - getLevel () { - return (this.parent ? this.parent.getLevel() + 1 : 0) - } - - /** - * Get jsonpath of the current node - * @return {Node[]} Returns an array with nodes - */ - getNodePath () { - const path = this.parent ? this.parent.getNodePath() : [] - path.push(this) - return path - } - - /** - * Create a clone of a node - * The complete state of a clone is copied, including whether it is expanded or - * not. The DOM elements are not cloned. - * @return {Node} clone - */ - clone () { - const clone = new Node(this.editor) - clone.type = this.type - clone.field = this.field - clone.fieldInnerText = this.fieldInnerText - clone.fieldEditable = this.fieldEditable - clone.previousField = this.previousField - clone.value = this.value - clone.valueInnerText = this.valueInnerText - clone.previousValue = this.previousValue - clone.expanded = this.expanded - clone.visibleChilds = this.visibleChilds - - if (this.childs) { - // an object or array - const cloneChilds = [] - this.childs.forEach(child => { - const childClone = child.clone() - childClone.setParent(clone) - cloneChilds.push(childClone) - }) - clone.childs = cloneChilds - } else { - // a value - clone.childs = undefined - } - - return clone - } - - /** - * Expand this node and optionally its childs. - * @param {boolean} [recurse] Optional recursion, true by default. When - * true, all childs will be expanded recursively - */ - expand (recurse) { - if (!this.childs) { - return - } - - // set this node expanded - this.expanded = true - if (this.dom.expand) { - this.dom.expand.className = 'jsoneditor-button jsoneditor-expanded' - } - - this.showChilds() - - if (recurse !== false) { - this.childs.forEach(child => { - child.expand(recurse) - }) - } - - // update the css classes of table row, and fire onClassName etc - this.updateDom({ recurse: false }) - } - - /** - * Collapse this node and optionally its childs. - * @param {boolean} [recurse] Optional recursion, true by default. When - * true, all childs will be collapsed recursively - */ - collapse (recurse) { - if (!this.childs) { - return - } - - this.hideChilds() - - // collapse childs in case of recurse - if (recurse !== false) { - this.childs.forEach(child => { - child.collapse(recurse) - }) - } - - // make this node collapsed - if (this.dom.expand) { - this.dom.expand.className = 'jsoneditor-button jsoneditor-collapsed' - } - this.expanded = false - - // update the css classes of table row, and fire onClassName etc - this.updateDom({ recurse: false }) - } - - /** - * Recursively show all childs when they are expanded - */ - showChilds () { - const childs = this.childs - if (!childs) { - return - } - if (!this.expanded) { - return - } - - const tr = this.dom.tr - let nextTr - const table = tr ? tr.parentNode : undefined - if (table) { - // show row with append button - const append = this.getAppendDom() - if (!append.parentNode) { - nextTr = tr.nextSibling - if (nextTr) { - table.insertBefore(append, nextTr) - } else { - table.appendChild(append) - } - } - - // show childs - const iMax = Math.min(this.childs.length, this.visibleChilds) - nextTr = this._getNextTr() - for (let i = 0; i < iMax; i++) { - const child = this.childs[i] - if (!child.getDom().parentNode) { - table.insertBefore(child.getDom(), nextTr) - } - child.showChilds() - } - - // show "show more childs" if limited - const showMore = this.getShowMoreDom() - nextTr = this._getNextTr() - if (!showMore.parentNode) { - table.insertBefore(showMore, nextTr) - } - this.showMore.updateDom() // to update the counter - } - } - - _getNextTr () { - if (this.showMore && this.showMore.getDom().parentNode) { - return this.showMore.getDom() - } - - if (this.append && this.append.getDom().parentNode) { - return this.append.getDom() - } - } - - /** - * Hide the node with all its childs - * @param {{resetVisibleChilds: boolean}} [options] - */ - hide (options) { - const tr = this.dom.tr - const table = tr ? tr.parentNode : undefined - if (table) { - table.removeChild(tr) - } - - if (this.dom.popupAnchor) { - this.dom.popupAnchor.destroy() - } - - this.hideChilds(options) - } - - /** - * Recursively hide all childs - * @param {{resetVisibleChilds: boolean}} [options] - */ - hideChilds (options) { - const childs = this.childs - if (!childs) { - return - } - if (!this.expanded) { - return - } - - // hide append row - const append = this.getAppendDom() - if (append.parentNode) { - append.parentNode.removeChild(append) - } - - // hide childs - this.childs.forEach(child => { - child.hide() - }) - - // hide "show more" row - const showMore = this.getShowMoreDom() - if (showMore.parentNode) { - showMore.parentNode.removeChild(showMore) - } - - // reset max visible childs - if (!options || options.resetVisibleChilds) { - this.visibleChilds = this.getMaxVisibleChilds() - } - } - - /** - * set custom css classes on a node - */ - _updateCssClassName () { - if (this.dom.field && - this.editor && - this.editor.options && - typeof this.editor.options.onClassName === 'function' && - this.dom.tree) { - removeAllClassNames(this.dom.tree) - const addClasses = this.editor.options.onClassName({ path: this.getPath(), field: this.field, value: this.value }) || '' - addClassName(this.dom.tree, 'jsoneditor-values ' + addClasses) - } - } - - recursivelyUpdateCssClassesOnNodes () { - this._updateCssClassName() - if (Array.isArray(this.childs)) { - for (let i = 0; i < this.childs.length; i++) { - this.childs[i].recursivelyUpdateCssClassesOnNodes() - } - } - } - - /** - * Goes through the path from the node to the root and ensures that it is expanded - */ - expandTo () { - let currentNode = this.parent - while (currentNode) { - if (!currentNode.expanded) { - currentNode.expand() - } - currentNode = currentNode.parent - } - } - - /** - * Add a new child to the node. - * Only applicable when Node value is of type array or object - * @param {Node} node - * @param {boolean} [visible] If true (default), the child will be rendered - * @param {boolean} [updateDom] If true (default), the DOM of both parent - * node and appended node will be updated - * (child count, indexes) - */ - appendChild (node, visible, updateDom) { - if (this._hasChilds()) { - // adjust the link to the parent - node.setParent(this) - node.fieldEditable = (this.type === 'object') - if (this.type === 'array') { - node.index = this.childs.length - } - if (this.type === 'object' && node.field === undefined) { - // initialize field value if needed - node.setField('') - } - this.childs.push(node) - - if (this.expanded && visible !== false) { - // insert into the DOM, before the appendRow - const newTr = node.getDom() - const nextTr = this._getNextTr() - const table = nextTr ? nextTr.parentNode : undefined - if (nextTr && table) { - table.insertBefore(newTr, nextTr) - } - - node.showChilds() - - this.visibleChilds++ - } - - if (updateDom !== false) { - this.updateDom({ updateIndexes: true }) - node.updateDom({ recurse: true }) - } - } - } - - /** - * Move a node from its current parent to this node - * Only applicable when Node value is of type array or object - * @param {Node} node - * @param {Node} beforeNode - * @param {boolean} [updateDom] If true (default), the DOM of both parent - * node and appended node will be updated - * (child count, indexes) - */ - moveBefore (node, beforeNode, updateDom) { - if (this._hasChilds()) { - // create a temporary row, to prevent the scroll position from jumping - // when removing the node - const tbody = (this.dom.tr) ? this.dom.tr.parentNode : undefined - if (tbody) { - var trTemp = document.createElement('tr') - trTemp.style.height = tbody.clientHeight + 'px' - tbody.appendChild(trTemp) - } - - if (node.parent) { - node.parent.removeChild(node) - } - - if (beforeNode instanceof AppendNode || !beforeNode) { - // the this.childs.length + 1 is to reckon with the node that we're about to add - if (this.childs.length + 1 > this.visibleChilds) { - const lastVisibleNode = this.childs[this.visibleChilds - 1] - this.insertBefore(node, lastVisibleNode, updateDom) - } else { - const visible = true - this.appendChild(node, visible, updateDom) - } - } else { - this.insertBefore(node, beforeNode, updateDom) - } - - if (tbody) { - tbody.removeChild(trTemp) - } - } - } - - /** - * Insert a new child before a given node - * Only applicable when Node value is of type array or object - * @param {Node} node - * @param {Node} beforeNode - * @param {boolean} [updateDom] If true (default), the DOM of both parent - * node and appended node will be updated - * (child count, indexes) - */ - insertBefore (node, beforeNode, updateDom) { - if (this._hasChilds()) { - this.visibleChilds++ - - // initialize field value if needed - if (this.type === 'object' && node.field === undefined) { - node.setField('') - } - - if (beforeNode === this.append) { - // append to the child nodes - - // adjust the link to the parent - node.setParent(this) - node.fieldEditable = (this.type === 'object') - this.childs.push(node) - } else { - // insert before a child node - const index = this.childs.indexOf(beforeNode) - if (index === -1) { - throw new Error('Node not found') - } - - // adjust the link to the parent - node.setParent(this) - node.fieldEditable = (this.type === 'object') - this.childs.splice(index, 0, node) - } - - if (this.expanded) { - // insert into the DOM - const newTr = node.getDom() - const nextTr = beforeNode.getDom() - const table = nextTr ? nextTr.parentNode : undefined - if (nextTr && table) { - table.insertBefore(newTr, nextTr) - } - - node.showChilds() - this.showChilds() - } - - if (updateDom !== false) { - this.updateDom({ updateIndexes: true }) - node.updateDom({ recurse: true }) - } - } - } - - /** - * Insert a new child before a given node - * Only applicable when Node value is of type array or object - * @param {Node} node - * @param {Node} afterNode - */ - insertAfter (node, afterNode) { - if (this._hasChilds()) { - const index = this.childs.indexOf(afterNode) - const beforeNode = this.childs[index + 1] - if (beforeNode) { - this.insertBefore(node, beforeNode) - } else { - this.appendChild(node) - } - } - } - - /** - * Search in this node - * Searches are case insensitive. - * @param {String} text - * @param {Node[]} [results] Array where search results will be added - * used to count and limit the results whilst iterating - * @return {Node[]} results Array with nodes containing the search text - */ - search (text, results) { - if (!Array.isArray(results)) { - results = [] - } - let index - const search = text ? text.toLowerCase() : undefined - - // delete old search data - delete this.searchField - delete this.searchValue - - // search in field - if (this.field !== undefined && results.length <= this.MAX_SEARCH_RESULTS) { - const field = String(this.field).toLowerCase() - index = field.indexOf(search) - if (index !== -1) { - this.searchField = true - results.push({ - node: this, - elem: 'field' - }) - } - - // update dom - this._updateDomField() - } - - // search in value - if (this._hasChilds()) { - // array, object - - // search the nodes childs - if (this.childs) { - this.childs.forEach(child => { - child.search(text, results) - }) - } - } else { - // string, auto - if (this.value !== undefined && results.length <= this.MAX_SEARCH_RESULTS) { - const value = String(this.value).toLowerCase() - index = value.indexOf(search) - if (index !== -1) { - this.searchValue = true - results.push({ - node: this, - elem: 'value' - }) - } - - // update dom - this._updateDomValue() - } - } - - return results - } - - /** - * Move the scroll position such that this node is in the visible area. - * The node will not get the focus - * @param {function(boolean)} [callback] - */ - scrollTo (callback) { - this.expandPathToNode() - - if (this.dom.tr && this.dom.tr.parentNode) { - this.editor.scrollTo(this.dom.tr.offsetTop, callback) - } - } - - /** - * if the node is not visible, expand its parents - */ - expandPathToNode () { - let node = this - const recurse = false - while (node && node.parent) { - // expand visible childs of the parent if needed - const index = node.parent.type === 'array' - ? node.index - : node.parent.childs.indexOf(node) - while (node.parent.visibleChilds < index + 1) { - node.parent.visibleChilds += this.getMaxVisibleChilds() - } - - // expand the parent itself - node.parent.expand(recurse) - node = node.parent - } - } - - /** - * Set focus to this node - * @param {String} [elementName] The field name of the element to get the - * focus available values: 'drag', 'menu', - * 'expand', 'field', 'value' (default) - */ - focus (elementName) { - Node.focusElement = elementName - - if (this.dom.tr && this.dom.tr.parentNode) { - const dom = this.dom - - switch (elementName) { - case 'drag': - if (dom.drag) { - dom.drag.focus() - } else { - dom.menu.focus() - } - break - - case 'menu': - dom.menu.focus() - break - - case 'expand': - if (this._hasChilds()) { - dom.expand.focus() - } else if (dom.field && this.fieldEditable) { - dom.field.focus() - selectContentEditable(dom.field) - } else if (dom.value && !this._hasChilds()) { - dom.value.focus() - selectContentEditable(dom.value) - } else { - dom.menu.focus() - } - break - - case 'field': - if (dom.field && this.fieldEditable) { - dom.field.focus() - selectContentEditable(dom.field) - } else if (dom.value && !this._hasChilds()) { - dom.value.focus() - selectContentEditable(dom.value) - } else if (this._hasChilds()) { - dom.expand.focus() - } else { - dom.menu.focus() - } - break - - case 'value': - default: - if (dom.select) { - // enum select box - dom.select.focus() - } else if (dom.value && !this._hasChilds()) { - dom.value.focus() - selectContentEditable(dom.value) - } else if (dom.field && this.fieldEditable) { - dom.field.focus() - selectContentEditable(dom.field) - } else if (this._hasChilds()) { - dom.expand.focus() - } else { - dom.menu.focus() - } - break - } - } - } - - /** - * Check if given node is a child. The method will check recursively to find - * this node. - * @param {Node} node - * @return {boolean} containsNode - */ - containsNode (node) { - if (this === node) { - return true - } - - const childs = this.childs - if (childs) { - // TODO: use the js5 Array.some() here? - for (let i = 0, iMax = childs.length; i < iMax; i++) { - if (childs[i].containsNode(node)) { - return true - } - } - } - - return false - } - - /** - * Remove a child from the node. - * Only applicable when Node value is of type array or object - * @param {Node} node The child node to be removed; - * @param {boolean} [updateDom] If true (default), the DOM of the parent - * node will be updated (like child count) - * @return {Node | undefined} node The removed node on success, - * else undefined - */ - removeChild (node, updateDom) { - if (this.childs) { - const index = this.childs.indexOf(node) - - if (index !== -1) { - if (index < this.visibleChilds && this.expanded) { - this.visibleChilds-- - } - - node.hide() - - // delete old search results - delete node.searchField - delete node.searchValue - - const removedNode = this.childs.splice(index, 1)[0] - removedNode.parent = null - - if (updateDom !== false) { - this.updateDom({ updateIndexes: true }) - } - - return removedNode - } - } - - return undefined - } - - /** - * Remove a child node node from this node - * This method is equal to Node.removeChild, except that _remove fire an - * onChange event. - * @param {Node} node - * @private - */ - _remove (node) { - this.removeChild(node) - } - - /** - * Change the type of the value of this Node - * @param {String} newType - */ - changeType (newType) { - const oldType = this.type - - if (oldType === newType) { - // type is not changed - return - } - - if ((newType === 'string' || newType === 'auto') && - (oldType === 'string' || oldType === 'auto')) { - // this is an easy change - this.type = newType - } else { - // change from array to object, or from string/auto to object/array - const domAnchor = this._detachFromDom() - - // delete the old DOM - this.clearDom() - - // adjust the field and the value - this.type = newType - - // adjust childs - if (newType === 'object') { - if (!this.childs) { - this.childs = [] - } - - this.childs.forEach(child => { - child.clearDom() - delete child.index - child.fieldEditable = true - if (child.field === undefined) { - child.field = '' - } - }) - - if (oldType === 'string' || oldType === 'auto') { - this.expanded = true - } - } else if (newType === 'array') { - if (!this.childs) { - this.childs = [] - } - - this.childs.forEach((child, index) => { - child.clearDom() - child.fieldEditable = false - child.index = index - }) - - if (oldType === 'string' || oldType === 'auto') { - this.expanded = true - } - } else { - this.expanded = false - } - - this._attachToDom(domAnchor) - } - - if (newType === 'auto' || newType === 'string') { - // cast value to the correct type - if (newType === 'string') { - this.value = String(this.value) - } else { - this.value = parseString(String(this.value)) - } - - this.focus() - } - - this.updateDom({ updateIndexes: true }) - } - - /** - * Test whether the JSON contents of this node are deep equal to provided JSON object. - * @param {*} json - */ - deepEqual (json) { - let i - - if (this.type === 'array') { - if (!Array.isArray(json)) { - return false - } - - if (this.childs.length !== json.length) { - return false - } - - for (i = 0; i < this.childs.length; i++) { - if (!this.childs[i].deepEqual(json[i])) { - return false - } - } - } else if (this.type === 'object') { - if (typeof json !== 'object' || !json) { - return false - } - - // we reckon with the order of the properties too. - const props = Object.keys(json) - if (this.childs.length !== props.length) { - return false - } - for (i = 0; i < props.length; i++) { - const child = this.childs[i] - if (child.field !== props[i] || !child.deepEqual(json[child.field])) { - return false - } - } - } else { - if (this.value !== json) { - return false - } - } - - return true - } - - /** - * Retrieve value from DOM - * @private - */ - _getDomValue () { - this._clearValueError() - - if (this.dom.value && this.type !== 'array' && this.type !== 'object') { - this.valueInnerText = getInnerText(this.dom.value) - } - - if (this.valueInnerText !== undefined) { - try { - // retrieve the value - let value - if (this.type === 'string') { - value = this._unescapeHTML(this.valueInnerText) - } else { - const str = this._unescapeHTML(this.valueInnerText) - value = parseString(str) - } - if (value !== this.value) { - this.value = value - this._debouncedOnChangeValue() - } - } catch (err) { - // keep the previous value - this._setValueError(translate('cannotParseValueError')) - } - } - } - - /** - * Show a local error in case of invalid value - * @param {string} message - * @private - */ - _setValueError (message) { - this.valueError = { - message: message - } - this.updateError() - } - - _clearValueError () { - if (this.valueError) { - this.valueError = null - this.updateError() - } - } - - /** - * Show a local error in case of invalid or duplicate field - * @param {string} message - * @private - */ - _setFieldError (message) { - this.fieldError = { - message: message - } - this.updateError() - } - - _clearFieldError () { - if (this.fieldError) { - this.fieldError = null - this.updateError() - } - } - - /** - * Handle a changed value - * @private - */ - _onChangeValue () { - // get current selection, then override the range such that we can select - // the added/removed text on undo/redo - const oldSelection = this.editor.getDomSelection() - if (oldSelection.range) { - const undoDiff = textDiff(String(this.value), String(this.previousValue)) - oldSelection.range.startOffset = undoDiff.start - oldSelection.range.endOffset = undoDiff.end - } - const newSelection = this.editor.getDomSelection() - if (newSelection.range) { - const redoDiff = textDiff(String(this.previousValue), String(this.value)) - newSelection.range.startOffset = redoDiff.start - newSelection.range.endOffset = redoDiff.end - } - - this.editor._onAction('editValue', { - path: this.getInternalPath(), - oldValue: this.previousValue, - newValue: this.value, - oldSelection: oldSelection, - newSelection: newSelection - }) - - this.previousValue = this.value - } - - /** - * Handle a changed field - * @private - */ - _onChangeField () { - // get current selection, then override the range such that we can select - // the added/removed text on undo/redo - const oldSelection = this.editor.getDomSelection() - const previous = this.previousField || '' - if (oldSelection.range) { - const undoDiff = textDiff(this.field, previous) - oldSelection.range.startOffset = undoDiff.start - oldSelection.range.endOffset = undoDiff.end - } - const newSelection = this.editor.getDomSelection() - if (newSelection.range) { - const redoDiff = textDiff(previous, this.field) - newSelection.range.startOffset = redoDiff.start - newSelection.range.endOffset = redoDiff.end - } - - this.editor._onAction('editField', { - parentPath: this.parent.getInternalPath(), - index: this.getIndex(), - oldValue: this.previousField, - newValue: this.field, - oldSelection: oldSelection, - newSelection: newSelection - }) - - this.previousField = this.field - } - - /** - * Update dom value: - * - the text color of the value, depending on the type of the value - * - the height of the field, depending on the width - * - background color in case it is empty - * @private - */ - _updateDomValue () { - const domValue = this.dom.value - if (domValue) { - const classNames = ['jsoneditor-value'] - - // set text color depending on value type - const value = this.value - const valueType = (this.type === 'auto') ? getType(value) : this.type - const valueIsUrl = valueType === 'string' && isUrl(value) - classNames.push('jsoneditor-' + valueType) - if (valueIsUrl) { - classNames.push('jsoneditor-url') - } - - // visual styling when empty - const isEmpty = (String(this.value) === '' && this.type !== 'array' && this.type !== 'object') - if (isEmpty) { - classNames.push('jsoneditor-empty') - } - - // highlight when there is a search result - if (this.searchValueActive) { - classNames.push('jsoneditor-highlight-active') - } - if (this.searchValue) { - classNames.push('jsoneditor-highlight') - } - - domValue.className = classNames.join(' ') - - // update title - if (valueType === 'array' || valueType === 'object') { - const count = this.childs ? this.childs.length : 0 - domValue.title = this.type + ' containing ' + count + ' items' - } else if (valueIsUrl && this.editable.value) { - domValue.title = translate('openUrl') - } else { - domValue.title = '' - } - - // show checkbox when the value is a boolean - if (valueType === 'boolean' && this.editable.value) { - if (!this.dom.checkbox) { - this.dom.checkbox = document.createElement('input') - this.dom.checkbox.type = 'checkbox' - this.dom.tdCheckbox = document.createElement('td') - this.dom.tdCheckbox.className = 'jsoneditor-tree' - this.dom.tdCheckbox.appendChild(this.dom.checkbox) - - this.dom.tdValue.parentNode.insertBefore(this.dom.tdCheckbox, this.dom.tdValue) - } - - this.dom.checkbox.checked = this.value - } else { - // cleanup checkbox when displayed - if (this.dom.tdCheckbox) { - this.dom.tdCheckbox.parentNode.removeChild(this.dom.tdCheckbox) - delete this.dom.tdCheckbox - delete this.dom.checkbox - } - } - - // create select box when this node has an enum object - if (this.enum && this.editable.value) { - if (!this.dom.select) { - this.dom.select = document.createElement('select') - this.id = this.field + '_' + new Date().getUTCMilliseconds() - this.dom.select.id = this.id - this.dom.select.name = this.dom.select.id - - // Create the default empty option - this.dom.select.option = document.createElement('option') - this.dom.select.option.value = '' - this.dom.select.option.innerHTML = '--' - this.dom.select.appendChild(this.dom.select.option) - - // Iterate all enum values and add them as options - for (let i = 0; i < this.enum.length; i++) { - this.dom.select.option = document.createElement('option') - this.dom.select.option.value = this.enum[i] - this.dom.select.option.innerHTML = this.enum[i] - if (this.dom.select.option.value === this.value) { - this.dom.select.option.selected = true - } - this.dom.select.appendChild(this.dom.select.option) - } - - this.dom.tdSelect = document.createElement('td') - this.dom.tdSelect.className = 'jsoneditor-tree' - this.dom.tdSelect.appendChild(this.dom.select) - this.dom.tdValue.parentNode.insertBefore(this.dom.tdSelect, this.dom.tdValue) - } - - // If the enum is inside a composite type display - // both the simple input and the dropdown field - if (this.schema && ( - !hasOwnProperty(this.schema, 'oneOf') && - !hasOwnProperty(this.schema, 'anyOf') && - !hasOwnProperty(this.schema, 'allOf')) - ) { - this.valueFieldHTML = this.dom.tdValue.innerHTML - this.dom.tdValue.style.visibility = 'hidden' - this.dom.tdValue.innerHTML = '' - } else { - delete this.valueFieldHTML - } - } else { - // cleanup select box when displayed - if (this.dom.tdSelect) { - this.dom.tdSelect.parentNode.removeChild(this.dom.tdSelect) - delete this.dom.tdSelect - delete this.dom.select - this.dom.tdValue.innerHTML = this.valueFieldHTML - this.dom.tdValue.style.visibility = '' - delete this.valueFieldHTML - } - } - - // show color picker when value is a color - if (this.editable.value && - this.editor.options.colorPicker && - typeof value === 'string' && - isValidColor(value)) { - if (!this.dom.color) { - this.dom.color = document.createElement('div') - this.dom.color.className = 'jsoneditor-color' - - this.dom.tdColor = document.createElement('td') - this.dom.tdColor.className = 'jsoneditor-tree' - this.dom.tdColor.appendChild(this.dom.color) - - this.dom.tdValue.parentNode.insertBefore(this.dom.tdColor, this.dom.tdValue) - - // this is a bit hacky, overriding the text color like this. find a nicer solution - this.dom.value.style.color = '#1A1A1A' - } - - // update the color background - this.dom.color.style.backgroundColor = value - } else { - // cleanup color picker when displayed - this._deleteDomColor() - } - - // show date tag when value is a timestamp in milliseconds - if (this._showTimestampTag()) { - if (!this.dom.date) { - this.dom.date = document.createElement('div') - this.dom.date.className = 'jsoneditor-date' - this.dom.value.parentNode.appendChild(this.dom.date) - } - - let title = null - if (typeof this.editor.options.timestampFormat === 'function') { - title = this.editor.options.timestampFormat({ - field: this.field, - value: this.value, - path: this.getPath() - }) - } - if (!title) { - this.dom.date.innerHTML = new Date(value).toISOString() - } else { - while (this.dom.date.firstChild) { - this.dom.date.removeChild(this.dom.date.firstChild) - } - this.dom.date.appendChild(document.createTextNode(title)) - } - this.dom.date.title = new Date(value).toString() - } else { - // cleanup date tag - if (this.dom.date) { - this.dom.date.parentNode.removeChild(this.dom.date) - delete this.dom.date - } - } - - // strip formatting from the contents of the editable div - stripFormatting(domValue) - - this._updateDomDefault() - } - } - - _deleteDomColor () { - if (this.dom.color) { - this.dom.tdColor.parentNode.removeChild(this.dom.tdColor) - delete this.dom.tdColor - delete this.dom.color - - this.dom.value.style.color = '' - } - } - - /** - * Update dom field: - * - the text color of the field, depending on the text - * - the height of the field, depending on the width - * - background color in case it is empty - * @private - */ - _updateDomField () { - const domField = this.dom.field - if (domField) { - const tooltip = makeFieldTooltip(this.schema, this.editor.options.language) - if (tooltip) { - domField.title = tooltip - } - - // make backgound color lightgray when empty - const isEmpty = (String(this.field) === '' && this.parent.type !== 'array') - if (isEmpty) { - addClassName(domField, 'jsoneditor-empty') - } else { - removeClassName(domField, 'jsoneditor-empty') - } - - // highlight when there is a search result - if (this.searchFieldActive) { - addClassName(domField, 'jsoneditor-highlight-active') - } else { - removeClassName(domField, 'jsoneditor-highlight-active') - } - if (this.searchField) { - addClassName(domField, 'jsoneditor-highlight') - } else { - removeClassName(domField, 'jsoneditor-highlight') - } - - // strip formatting from the contents of the editable div - stripFormatting(domField) - } - } - - /** - * Retrieve field from DOM - * @param {boolean} [forceUnique] If true, the field name will be changed - * into a unique name in case it is a duplicate. - * @private - */ - _getDomField (forceUnique) { - this._clearFieldError() - - if (this.dom.field && this.fieldEditable) { - this.fieldInnerText = getInnerText(this.dom.field) - } - - if (this.fieldInnerText !== undefined) { - try { - let field = this._unescapeHTML(this.fieldInnerText) - - const existingFieldNames = this.parent.getFieldNames(this) - const isDuplicate = existingFieldNames.indexOf(field) !== -1 - - if (!isDuplicate) { - if (field !== this.field) { - this.field = field - this._debouncedOnChangeField() - } - } else { - if (forceUnique) { - // fix duplicate field: change it into a unique name - field = findUniqueName(field, existingFieldNames) - if (field !== this.field) { - this.field = field - - // TODO: don't debounce but resolve right away, and cancel current debounce - this._debouncedOnChangeField() - } - } else { - this._setFieldError(translate('duplicateFieldError')) - } - } - } catch (err) { - // keep the previous field value - this._setFieldError(translate('cannotParseFieldError')) - } - } - } - - /** - * Update the value of the schema default element in the DOM. - * @private - * @returns {undefined} - */ - _updateDomDefault () { - // Short-circuit if schema is missing, has no default, or if Node has children - if (!this.schema || this.schema.default === undefined || this._hasChilds()) { - return - } - - // select either enum dropdown (select) or input value - const inputElement = this.dom.select - ? this.dom.select - : this.dom.value - - if (!inputElement) { - return - } - - if (this.value === this.schema.default) { - inputElement.title = translate('default') - addClassName(inputElement, 'jsoneditor-is-default') - removeClassName(inputElement, 'jsoneditor-is-not-default') - } else { - inputElement.removeAttribute('title') - removeClassName(inputElement, 'jsoneditor-is-default') - addClassName(inputElement, 'jsoneditor-is-not-default') - } - } - - /** - * Test whether to show a timestamp tag or not - * @return {boolean} Returns true when the value is a timestamp - */ - _showTimestampTag () { - if (typeof this.value !== 'number') { - return false - } - - const timestampTag = this.editor.options.timestampTag - if (typeof timestampTag === 'function') { - const result = timestampTag({ - field: this.field, - value: this.value, - path: this.getPath() - }) - - if (typeof result === 'boolean') { - return result - } else { - return isTimestamp(this.field, this.value) - } - } else if (timestampTag === true) { - return isTimestamp(this.field, this.value) - } else { - return false - } - } - - /** - * Clear the dom of the node - */ - clearDom () { - // TODO: hide the node first? - // this.hide(); - // TODO: recursively clear dom? - - this.dom = {} - } - - /** - * Get the HTML DOM TR element of the node. - * The dom will be generated when not yet created - * @return {Element} tr HTML DOM TR Element - */ - getDom () { - const dom = this.dom - if (dom.tr) { - return dom.tr - } - - this._updateEditability() - - // create row - dom.tr = document.createElement('tr') - dom.tr.node = this - - if (this.editor.options.mode === 'tree') { // note: we take here the global setting - const tdDrag = document.createElement('td') - if (this.editable.field) { - // create draggable area - if (this.parent) { - const domDrag = document.createElement('button') - domDrag.type = 'button' - dom.drag = domDrag - domDrag.className = 'jsoneditor-button jsoneditor-dragarea' - domDrag.title = translate('drag') - tdDrag.appendChild(domDrag) - } - } - dom.tr.appendChild(tdDrag) - - // create context menu - const tdMenu = document.createElement('td') - const menu = document.createElement('button') - menu.type = 'button' - dom.menu = menu - menu.className = 'jsoneditor-button jsoneditor-contextmenu-button' - menu.title = translate('actionsMenu') - tdMenu.appendChild(dom.menu) - dom.tr.appendChild(tdMenu) - } - - // create tree and field - const tdField = document.createElement('td') - dom.tr.appendChild(tdField) - dom.tree = this._createDomTree() - tdField.appendChild(dom.tree) - - this.updateDom({ updateIndexes: true }) - - return dom.tr - } - - /** - * Test whether a Node is rendered and visible - * @returns {boolean} - */ - isVisible () { - return (this.dom && this.dom.tr && this.dom.tr.parentNode) || false - } - - /** - * Test if this node is a sescendant of an other node - * @param {Node} node - * @return {boolean} isDescendant - * @private - */ - isDescendantOf (node) { - let n = this.parent - while (n) { - if (n === node) { - return true - } - n = n.parent - } - - return false - } - - /** - * Create an editable field - * @return {Element} domField - * @private - */ - _createDomField () { - return document.createElement('div') - } - - /** - * Set highlighting for this node and all its childs. - * Only applied to the currently visible (expanded childs) - * @param {boolean} highlight - */ - setHighlight (highlight) { - if (this.dom.tr) { - if (highlight) { - addClassName(this.dom.tr, 'jsoneditor-highlight') - } else { - removeClassName(this.dom.tr, 'jsoneditor-highlight') - } - - if (this.append) { - this.append.setHighlight(highlight) - } - - if (this.childs) { - this.childs.forEach(child => { - child.setHighlight(highlight) - }) - } - } - } - - /** - * Select or deselect a node - * @param {boolean} selected - * @param {boolean} [isFirst] - */ - setSelected (selected, isFirst) { - this.selected = selected - - if (this.dom.tr) { - if (selected) { - addClassName(this.dom.tr, 'jsoneditor-selected') - } else { - removeClassName(this.dom.tr, 'jsoneditor-selected') - } - - if (isFirst) { - addClassName(this.dom.tr, 'jsoneditor-first') - } else { - removeClassName(this.dom.tr, 'jsoneditor-first') - } - - if (this.append) { - this.append.setSelected(selected) - } - - if (this.showMore) { - this.showMore.setSelected(selected) - } - - if (this.childs) { - this.childs.forEach(child => { - child.setSelected(selected) - }) - } - } - } - - /** - * Update the value of the node. Only primitive types are allowed, no Object - * or Array is allowed. - * @param {String | Number | Boolean | null} value - */ - updateValue (value) { - this.value = value - this.previousValue = value - this.valueError = undefined - this.updateDom() - } - - /** - * Update the field of the node. - * @param {String} field - */ - updateField (field) { - this.field = field - this.previousField = field - this.fieldError = undefined - this.updateDom() - } - - /** - * Update the HTML DOM, optionally recursing through the childs - * @param {Object} [options] Available parameters: - * {boolean} [recurse] If true, the - * DOM of the childs will be updated recursively. - * False by default. - * {boolean} [updateIndexes] If true, the childs - * indexes of the node will be updated too. False by - * default. - */ - updateDom (options) { - // update level indentation - const domTree = this.dom.tree - if (domTree) { - domTree.style.marginLeft = this.getLevel() * 24 + 'px' - } - - // apply field to DOM - const domField = this.dom.field - if (domField) { - if (this.fieldEditable) { - // parent is an object - domField.contentEditable = this.editable.field - domField.spellcheck = false - domField.className = 'jsoneditor-field' - } else { - // parent is an array this is the root node - domField.contentEditable = false - domField.className = 'jsoneditor-readonly' - } - - let fieldText - if (this.index !== undefined) { - fieldText = this.index - } else if (this.field !== undefined) { - fieldText = this.field - } else { - const schema = this.editor.options.schema - ? Node._findSchema(this.editor.options.schema, this.editor.options.schemaRefs || {}, this.getPath()) - : undefined - - if (schema && schema.title) { - fieldText = schema.title - } else if (this._hasChilds()) { - fieldText = this.type - } else { - fieldText = '' - } - } - domField.innerHTML = this._escapeHTML(fieldText) - - this._updateSchema() - } - - // apply value to DOM - const domValue = this.dom.value - if (domValue) { - if (this.type === 'array' || this.type === 'object') { - this.updateNodeName() - } else { - domValue.innerHTML = this._escapeHTML(this.value) - } - } - - // apply styling to the table row - const tr = this.dom.tr - if (tr) { - if (this.type === 'array' || this.type === 'object') { - addClassName(tr, 'jsoneditor-expandable') - - if (this.expanded) { - addClassName(tr, 'jsoneditor-expanded') - removeClassName(tr, 'jsoneditor-collapsed') - } else { - addClassName(tr, 'jsoneditor-collapsed') - removeClassName(tr, 'jsoneditor-expanded') - } - } else { - removeClassName(tr, 'jsoneditor-expandable') - removeClassName(tr, 'jsoneditor-expanded') - removeClassName(tr, 'jsoneditor-collapsed') - } - } - - // update field and value - this._updateDomField() - this._updateDomValue() - - // update childs indexes - if (options && options.updateIndexes === true) { - // updateIndexes is true or undefined - this._updateDomIndexes() - } - - // update childs recursively - if (options && options.recurse === true) { - if (this.childs) { - this.childs.forEach(child => { - child.updateDom(options) - }) - } - } - - // update rendering of error - if (this.error) { - this.updateError() - } - - // update row with append button - if (this.append) { - this.append.updateDom() - } - - // update "show more" text at the bottom of large arrays - if (this.showMore) { - this.showMore.updateDom() - } - - // fire onClassName - this._updateCssClassName() - } - - /** - * Locate the JSON schema of the node and check for any enum type - * @private - */ - _updateSchema () { - // Locating the schema of the node and checking for any enum type - if (this.editor && this.editor.options) { - // find the part of the json schema matching this nodes path - this.schema = this.editor.options.schema - // fix childSchema with $ref, and not display the select element on the child schema because of not found enum - ? Node._findSchema(this.editor.options.schema, this.editor.options.schemaRefs || {}, this.getPath()) - : null - if (this.schema) { - this.enum = Node._findEnum(this.schema) - } else { - delete this.enum - } - } - } - - /** - * Update the DOM of the childs of a node: update indexes and undefined field - * names. - * Only applicable when structure is an array or object - * @private - */ - _updateDomIndexes () { - const domValue = this.dom.value - const childs = this.childs - if (domValue && childs) { - if (this.type === 'array') { - childs.forEach((child, index) => { - child.index = index - const childField = child.dom.field - if (childField) { - childField.innerHTML = index - } - }) - } else if (this.type === 'object') { - childs.forEach(child => { - if (child.index !== undefined) { - delete child.index - - if (child.field === undefined) { - child.field = '' - } - } - }) - } - } - } - - /** - * Create an editable value - * @private - */ - _createDomValue () { - let domValue - - if (this.type === 'array') { - domValue = document.createElement('div') - domValue.innerHTML = '[...]' - } else if (this.type === 'object') { - domValue = document.createElement('div') - domValue.innerHTML = '{...}' - } else { - if (!this.editable.value && isUrl(this.value)) { - // create a link in case of read-only editor and value containing an url - domValue = document.createElement('a') - domValue.href = this.value - domValue.innerHTML = this._escapeHTML(this.value) - } else { - // create an editable or read-only div - domValue = document.createElement('div') - domValue.contentEditable = this.editable.value - domValue.spellcheck = false - domValue.innerHTML = this._escapeHTML(this.value) - } - } - - return domValue - } - - /** - * Create an expand/collapse button - * @return {Element} expand - * @private - */ - _createDomExpandButton () { - // create expand button - const expand = document.createElement('button') - expand.type = 'button' - if (this._hasChilds()) { - expand.className = this.expanded - ? 'jsoneditor-button jsoneditor-expanded' - : 'jsoneditor-button jsoneditor-collapsed' - expand.title = translate('expandTitle') - } else { - expand.className = 'jsoneditor-button jsoneditor-invisible' - expand.title = '' - } - - return expand - } - - /** - * Create a DOM tree element, containing the expand/collapse button - * @return {Element} domTree - * @private - */ - _createDomTree () { - const dom = this.dom - const domTree = document.createElement('table') - const tbody = document.createElement('tbody') - domTree.style.borderCollapse = 'collapse' // TODO: put in css - domTree.className = 'jsoneditor-values' - domTree.appendChild(tbody) - const tr = document.createElement('tr') - tbody.appendChild(tr) - - // create expand button - const tdExpand = document.createElement('td') - tdExpand.className = 'jsoneditor-tree' - tr.appendChild(tdExpand) - dom.expand = this._createDomExpandButton() - tdExpand.appendChild(dom.expand) - dom.tdExpand = tdExpand - - // create the field - const tdField = document.createElement('td') - tdField.className = 'jsoneditor-tree' - tr.appendChild(tdField) - dom.field = this._createDomField() - tdField.appendChild(dom.field) - dom.tdField = tdField - - // create a separator - const tdSeparator = document.createElement('td') - tdSeparator.className = 'jsoneditor-tree' - tr.appendChild(tdSeparator) - if (this.type !== 'object' && this.type !== 'array') { - tdSeparator.appendChild(document.createTextNode(':')) - tdSeparator.className = 'jsoneditor-separator' - } - dom.tdSeparator = tdSeparator - - // create the value - const tdValue = document.createElement('td') - tdValue.className = 'jsoneditor-tree' - tr.appendChild(tdValue) - dom.value = this._createDomValue() - tdValue.appendChild(dom.value) - dom.tdValue = tdValue - - return domTree - } - - /** - * Handle an event. The event is caught centrally by the editor - * @param {Event} event - */ - onEvent (event) { - const type = event.type - const target = event.target || event.srcElement - const dom = this.dom - const node = this - const expandable = this._hasChilds() - - if (typeof this.editor.options.onEvent === 'function') { - this._onEvent(event) - } - - // check if mouse is on menu or on dragarea. - // If so, highlight current row and its childs - if (target === dom.drag || target === dom.menu) { - if (type === 'mouseover') { - this.editor.highlighter.highlight(this) - } else if (type === 'mouseout') { - this.editor.highlighter.unhighlight() - } - } - - // context menu events - if (type === 'click' && target === dom.menu) { - const highlighter = node.editor.highlighter - highlighter.highlight(node) - highlighter.lock() - addClassName(dom.menu, 'jsoneditor-selected') - this.showContextMenu(dom.menu, () => { - removeClassName(dom.menu, 'jsoneditor-selected') - highlighter.unlock() - highlighter.unhighlight() - }) - } - - // expand events - if (type === 'click') { - if (target === dom.expand) { - if (expandable) { - const recurse = event.ctrlKey // with ctrl-key, expand/collapse all - this._onExpand(recurse) - } - } - } - - if (type === 'click' && (event.target === node.dom.tdColor || event.target === node.dom.color)) { - this._showColorPicker() - } - - // swap the value of a boolean when the checkbox displayed left is clicked - if (type === 'change' && target === dom.checkbox) { - this.dom.value.innerHTML = !this.value - this._getDomValue() - this._updateDomDefault() - } - - // update the value of the node based on the selected option - if (type === 'change' && target === dom.select) { - this.dom.value.innerHTML = dom.select.value - this._getDomValue() - this._updateDomValue() - } - - // value events - const domValue = dom.value - if (target === domValue) { - // noinspection FallthroughInSwitchStatementJS - switch (type) { - case 'blur': - case 'change': { - this._getDomValue() - this._clearValueError() - this._updateDomValue() - const escapedValue = this._escapeHTML(this.value) - if (domValue.innerHTML !== escapedValue) { - // only update if changed, else you lose the caret position when changing tabs for example - domValue.innerHTML = escapedValue - } - break - } - - case 'input': - // this._debouncedGetDomValue(true); // TODO - this._getDomValue() - this._updateDomValue() - break - - case 'keydown': - case 'mousedown': - // TODO: cleanup - this.editor.selection = this.editor.getDomSelection() - break - - case 'click': - if (event.ctrlKey && this.editable.value) { - // if read-only, we use the regular click behavior of an anchor - if (isUrl(this.value)) { - event.preventDefault() - window.open(this.value, '_blank') - } - } - break - - case 'keyup': - // this._debouncedGetDomValue(true); // TODO - this._getDomValue() - this._updateDomValue() - break - - case 'cut': - case 'paste': - setTimeout(() => { - node._getDomValue() - node._updateDomValue() - }, 1) - break - } - } - - // field events - const domField = dom.field - if (target === domField) { - switch (type) { - case 'blur': { - this._getDomField(true) - this._updateDomField() - const escapedField = this._escapeHTML(this.field) - if (domField.innerHTML !== escapedField) { - // only update if changed, else you lose the caret position when changing tabs for example - domField.innerHTML = escapedField - } - break - } - - case 'input': - this._getDomField() - this._updateSchema() - this._updateDomField() - this._updateDomValue() - break - - case 'keydown': - case 'mousedown': - this.editor.selection = this.editor.getDomSelection() - break - - case 'keyup': - this._getDomField() - this._updateDomField() - break - - case 'cut': - case 'paste': - setTimeout(() => { - node._getDomField() - node._updateDomField() - }, 1) - break - } - } - - // focus - // when clicked in whitespace left or right from the field or value, set focus - const domTree = dom.tree - if (domTree && target === domTree.parentNode && type === 'click' && !event.hasMoved) { - const left = (event.offsetX !== undefined) - ? (event.offsetX < (this.getLevel() + 1) * 24) - : (event.pageX < getAbsoluteLeft(dom.tdSeparator))// for FF - if (left || expandable) { - // node is expandable when it is an object or array - if (domField) { - setEndOfContentEditable(domField) - domField.focus() - } - } else { - if (domValue && !this.enum) { - setEndOfContentEditable(domValue) - domValue.focus() - } - } - } - if (((target === dom.tdExpand && !expandable) || target === dom.tdField || target === dom.tdSeparator) && - (type === 'click' && !event.hasMoved)) { - if (domField) { - setEndOfContentEditable(domField) - domField.focus() - } - } - - if (type === 'keydown') { - this.onKeyDown(event) - } - } - - /** - * Trigger external onEvent provided in options if node is a JSON field or - * value. - * Information provided depends on the element, value is only included if - * event occurs in a JSON value: - * {field: string, path: {string|number}[] [, value: string]} - * @param {Event} event - * @private - */ - _onEvent (event) { - const element = event.target - if (element === this.dom.field || element === this.dom.value) { - const info = { - field: this.getField(), - path: this.getPath() - } - // For leaf values, include value - if (!this._hasChilds() && element === this.dom.value) { - info.value = this.getValue() - } - this.editor.options.onEvent(info, event) - } - } - - /** - * Key down event handler - * @param {Event} event - */ - onKeyDown (event) { - const keynum = event.which || event.keyCode - const target = event.target || event.srcElement - const ctrlKey = event.ctrlKey - const shiftKey = event.shiftKey - const altKey = event.altKey - let handled = false - let prevNode, nextNode, nextDom, nextDom2 - const editable = this.editor.options.mode === 'tree' - let oldSelection - let oldNextNode - let oldParent - let oldIndexRedo - let newIndexRedo - let oldParentPathRedo - let newParentPathRedo - let nodes - let multiselection - const selectedNodes = this.editor.multiselection.nodes.length > 0 - ? this.editor.multiselection.nodes - : [this] - const firstNode = selectedNodes[0] - const lastNode = selectedNodes[selectedNodes.length - 1] - - // console.log(ctrlKey, keynum, event.charCode); // TODO: cleanup - if (keynum === 13) { // Enter - if (target === this.dom.value) { - if (!this.editable.value || event.ctrlKey) { - if (isUrl(this.value)) { - window.open(this.value, '_blank') - handled = true - } - } - } else if (target === this.dom.expand) { - const expandable = this._hasChilds() - if (expandable) { - const recurse = event.ctrlKey // with ctrl-key, expand/collapse all - this._onExpand(recurse) - target.focus() - handled = true - } - } - } else if (keynum === 68) { // D - if (ctrlKey && editable) { // Ctrl+D - Node.onDuplicate(selectedNodes) - handled = true - } - } else if (keynum === 69) { // E - if (ctrlKey) { // Ctrl+E and Ctrl+Shift+E - this._onExpand(shiftKey) // recurse = shiftKey - target.focus() // TODO: should restore focus in case of recursing expand (which takes DOM offline) - handled = true - } - } else if (keynum === 77 && editable) { // M - if (ctrlKey) { // Ctrl+M - this.showContextMenu(target) - handled = true - } - } else if (keynum === 46 && editable) { // Del - if (ctrlKey) { // Ctrl+Del - Node.onRemove(selectedNodes) - handled = true - } - } else if (keynum === 45 && editable) { // Ins - if (ctrlKey && !shiftKey) { // Ctrl+Ins - this._onInsertBefore() - handled = true - } else if (ctrlKey && shiftKey) { // Ctrl+Shift+Ins - this._onInsertAfter() - handled = true - } - } else if (keynum === 35) { // End - if (altKey) { // Alt+End - // find the last node - const endNode = this._lastNode() - if (endNode) { - endNode.focus(Node.focusElement || this._getElementName(target)) - } - handled = true - } - } else if (keynum === 36) { // Home - if (altKey) { // Alt+Home - // find the first node - const homeNode = this._firstNode() - if (homeNode) { - homeNode.focus(Node.focusElement || this._getElementName(target)) - } - handled = true - } - } else if (keynum === 37) { // Arrow Left - if (altKey && !shiftKey) { // Alt + Arrow Left - // move to left element - const prevElement = this._previousElement(target) - if (prevElement) { - this.focus(this._getElementName(prevElement)) - } - handled = true - } else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow left - if (lastNode.expanded) { - const appendDom = lastNode.getAppendDom() - nextDom = appendDom ? appendDom.nextSibling : undefined - } else { - var dom = lastNode.getDom() - nextDom = dom.nextSibling - } - if (nextDom) { - nextNode = Node.getNodeFromTarget(nextDom) - nextDom2 = nextDom.nextSibling - const nextNode2 = Node.getNodeFromTarget(nextDom2) - if (nextNode && nextNode instanceof AppendNode && - !(lastNode.parent.childs.length === 1) && - nextNode2 && nextNode2.parent) { - oldSelection = this.editor.getDomSelection() - oldParent = firstNode.parent - oldNextNode = oldParent.childs[lastNode.getIndex() + 1] || oldParent.append - oldIndexRedo = firstNode.getIndex() - newIndexRedo = nextNode2.getIndex() - oldParentPathRedo = oldParent.getInternalPath() - newParentPathRedo = nextNode2.parent.getInternalPath() - - selectedNodes.forEach(node => { - nextNode2.parent.moveBefore(node, nextNode2) - }) - this.focus(Node.focusElement || this._getElementName(target)) - - this.editor._onAction('moveNodes', { - count: selectedNodes.length, - fieldNames: selectedNodes.map(getField), - - oldParentPath: oldParent.getInternalPath(), - newParentPath: firstNode.parent.getInternalPath(), - oldIndex: oldNextNode.getIndex(), - newIndex: firstNode.getIndex(), - - oldIndexRedo: oldIndexRedo, - newIndexRedo: newIndexRedo, - oldParentPathRedo: oldParentPathRedo, - newParentPathRedo: newParentPathRedo, - - oldSelection: oldSelection, - newSelection: this.editor.getDomSelection() - }) - } - } - } - } else if (keynum === 38) { // Arrow Up - if (altKey && !shiftKey) { // Alt + Arrow Up - // find the previous node - prevNode = this._previousNode() - if (prevNode) { - this.editor.deselect(true) - prevNode.focus(Node.focusElement || this._getElementName(target)) - } - handled = true - } else if (!altKey && ctrlKey && shiftKey && editable) { // Ctrl + Shift + Arrow Up - // select multiple nodes - prevNode = this._previousNode() - if (prevNode) { - multiselection = this.editor.multiselection - multiselection.start = multiselection.start || this - multiselection.end = prevNode - nodes = this.editor._findTopLevelNodes(multiselection.start, multiselection.end) - - this.editor.select(nodes) - prevNode.focus('field') // select field as we know this always exists - } - handled = true - } else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Up - // find the previous node - prevNode = firstNode._previousNode() - if (prevNode && prevNode.parent) { - oldSelection = this.editor.getDomSelection() - oldParent = firstNode.parent - oldNextNode = oldParent.childs[lastNode.getIndex() + 1] || oldParent.append - oldIndexRedo = firstNode.getIndex() - newIndexRedo = prevNode.getIndex() - oldParentPathRedo = oldParent.getInternalPath() - newParentPathRedo = prevNode.parent.getInternalPath() - - selectedNodes.forEach(node => { - prevNode.parent.moveBefore(node, prevNode) - }) - this.focus(Node.focusElement || this._getElementName(target)) - - this.editor._onAction('moveNodes', { - count: selectedNodes.length, - fieldNames: selectedNodes.map(getField), - - oldParentPath: oldParent.getInternalPath(), - newParentPath: firstNode.parent.getInternalPath(), - oldIndex: oldNextNode.getIndex(), - newIndex: firstNode.getIndex(), - - oldIndexRedo: oldIndexRedo, - newIndexRedo: newIndexRedo, - oldParentPathRedo: oldParentPathRedo, - newParentPathRedo: newParentPathRedo, - - oldSelection: oldSelection, - newSelection: this.editor.getDomSelection() - }) - } - handled = true - } - } else if (keynum === 39) { // Arrow Right - if (altKey && !shiftKey) { // Alt + Arrow Right - // move to right element - const nextElement = this._nextElement(target) - if (nextElement) { - this.focus(this._getElementName(nextElement)) - } - handled = true - } else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Right - dom = firstNode.getDom() - const prevDom = dom.previousSibling - if (prevDom) { - prevNode = Node.getNodeFromTarget(prevDom) - if (prevNode && prevNode.parent && !prevNode.isVisible()) { - oldSelection = this.editor.getDomSelection() - oldParent = firstNode.parent - oldNextNode = oldParent.childs[lastNode.getIndex() + 1] || oldParent.append - oldIndexRedo = firstNode.getIndex() - newIndexRedo = prevNode.getIndex() - oldParentPathRedo = oldParent.getInternalPath() - newParentPathRedo = prevNode.parent.getInternalPath() - - selectedNodes.forEach(node => { - prevNode.parent.moveBefore(node, prevNode) - }) - this.focus(Node.focusElement || this._getElementName(target)) - - this.editor._onAction('moveNodes', { - count: selectedNodes.length, - fieldNames: selectedNodes.map(getField), - - oldParentPath: oldParent.getInternalPath(), - newParentPath: firstNode.parent.getInternalPath(), - oldIndex: oldNextNode.getIndex(), - newIndex: firstNode.getIndex(), - - oldIndexRedo: oldIndexRedo, - newIndexRedo: newIndexRedo, - oldParentPathRedo: oldParentPathRedo, - newParentPathRedo: newParentPathRedo, - - oldSelection: oldSelection, - newSelection: this.editor.getDomSelection() - }) - } - } - } - } else if (keynum === 40) { // Arrow Down - if (altKey && !shiftKey) { // Alt + Arrow Down - // find the next node - nextNode = this._nextNode() - if (nextNode) { - this.editor.deselect(true) - nextNode.focus(Node.focusElement || this._getElementName(target)) - } - handled = true - } else if (!altKey && ctrlKey && shiftKey && editable) { // Ctrl + Shift + Arrow Down - // select multiple nodes - nextNode = this._nextNode() - if (nextNode) { - multiselection = this.editor.multiselection - multiselection.start = multiselection.start || this - multiselection.end = nextNode - nodes = this.editor._findTopLevelNodes(multiselection.start, multiselection.end) - - this.editor.select(nodes) - nextNode.focus('field') // select field as we know this always exists - } - handled = true - } else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Down - // find the 2nd next node and move before that one - if (lastNode.expanded) { - nextNode = lastNode.append ? lastNode.append._nextNode() : undefined - } else { - nextNode = lastNode._nextNode() - } - - // when the next node is not visible, we've reached the "showMore" buttons - if (nextNode && !nextNode.isVisible()) { - nextNode = nextNode.parent.showMore - } - - if (nextNode && nextNode instanceof AppendNode) { - nextNode = lastNode - } - - const nextNode2 = nextNode && (nextNode._nextNode() || nextNode.parent.append) - if (nextNode2 && nextNode2.parent) { - oldSelection = this.editor.getDomSelection() - oldParent = firstNode.parent - oldNextNode = oldParent.childs[lastNode.getIndex() + 1] || oldParent.append - oldIndexRedo = firstNode.getIndex() - newIndexRedo = nextNode2.getIndex() - oldParentPathRedo = oldParent.getInternalPath() - newParentPathRedo = nextNode2.parent.getInternalPath() - - selectedNodes.forEach(node => { - nextNode2.parent.moveBefore(node, nextNode2) - }) - this.focus(Node.focusElement || this._getElementName(target)) - - this.editor._onAction('moveNodes', { - count: selectedNodes.length, - fieldNames: selectedNodes.map(getField), - oldParentPath: oldParent.getInternalPath(), - newParentPath: firstNode.parent.getInternalPath(), - oldParentPathRedo: oldParentPathRedo, - newParentPathRedo: newParentPathRedo, - oldIndexRedo: oldIndexRedo, - newIndexRedo: newIndexRedo, - oldIndex: oldNextNode.getIndex(), - newIndex: firstNode.getIndex(), - oldSelection: oldSelection, - newSelection: this.editor.getDomSelection() - }) - } - handled = true - } - } - - if (handled) { - event.preventDefault() - event.stopPropagation() - } - } - - /** - * Handle the expand event, when clicked on the expand button - * @param {boolean} recurse If true, child nodes will be expanded too - * @private - */ - _onExpand (recurse) { - if (recurse) { - // Take the table offline - var table = this.dom.tr.parentNode // TODO: not nice to access the main table like this - var frame = table.parentNode - var scrollTop = frame.scrollTop - frame.removeChild(table) - } - - if (this.expanded) { - this.collapse(recurse) - } else { - this.expand(recurse) - } - - if (recurse) { - // Put the table online again - frame.appendChild(table) - frame.scrollTop = scrollTop - } - } - - /** - * Open a color picker to select a new color - * @private - */ - _showColorPicker () { - if (typeof this.editor.options.onColorPicker === 'function' && this.dom.color) { - const node = this - - // force deleting current color picker (if any) - node._deleteDomColor() - node.updateDom() - - const colorAnchor = createAbsoluteAnchor(this.dom.color, this.editor.getPopupAnchor()) - - this.editor.options.onColorPicker(colorAnchor, this.value, function onChange (value) { - if (typeof value === 'string' && value !== node.value) { - // force recreating the color block, to cleanup any attached color picker - node._deleteDomColor() - - node.value = value - node.updateDom() - node._debouncedOnChangeValue() - } - }) - } - } - - /** - * Get all field names of an object - * @param {Node} [excludeNode] Optional node to be excluded from the returned field names - * @return {string[]} - */ - getFieldNames (excludeNode) { - if (this.type === 'object') { - return this.childs - .filter(child => child !== excludeNode) - .map(child => child.field) - } - - return [] - } - - /** - * Handle insert before event - * @param {String} [field] - * @param {*} [value] - * @param {String} [type] Can be 'auto', 'array', 'object', or 'string' - * @private - */ - _onInsertBefore (field, value, type) { - const oldSelection = this.editor.getDomSelection() - - const newNode = new Node(this.editor, { - field: (field !== undefined) ? field : '', - value: (value !== undefined) ? value : '', - type: type - }) - newNode.expand(true) - - const beforePath = this.getInternalPath() - - this.parent.insertBefore(newNode, this) - this.editor.highlighter.unhighlight() - newNode.focus('field') - const newSelection = this.editor.getDomSelection() - - this.editor._onAction('insertBeforeNodes', { - nodes: [newNode], - paths: [newNode.getInternalPath()], - beforePath: beforePath, - parentPath: this.parent.getInternalPath(), - oldSelection: oldSelection, - newSelection: newSelection - }) - } - - /** - * Handle insert after event - * @param {String} [field] - * @param {*} [value] - * @param {String} [type] Can be 'auto', 'array', 'object', or 'string' - * @private - */ - _onInsertAfter (field, value, type) { - const oldSelection = this.editor.getDomSelection() - - const newNode = new Node(this.editor, { - field: (field !== undefined) ? field : '', - value: (value !== undefined) ? value : '', - type: type - }) - newNode.expand(true) - this.parent.insertAfter(newNode, this) - this.editor.highlighter.unhighlight() - newNode.focus('field') - const newSelection = this.editor.getDomSelection() - - this.editor._onAction('insertAfterNodes', { - nodes: [newNode], - paths: [newNode.getInternalPath()], - afterPath: this.getInternalPath(), - parentPath: this.parent.getInternalPath(), - oldSelection: oldSelection, - newSelection: newSelection - }) - } - - /** - * Handle append event - * @param {String} [field] - * @param {*} [value] - * @param {String} [type] Can be 'auto', 'array', 'object', or 'string' - * @private - */ - _onAppend (field, value, type) { - const oldSelection = this.editor.getDomSelection() - - const newNode = new Node(this.editor, { - field: (field !== undefined) ? field : '', - value: (value !== undefined) ? value : '', - type: type - }) - newNode.expand(true) - this.parent.appendChild(newNode) - this.editor.highlighter.unhighlight() - newNode.focus('field') - const newSelection = this.editor.getDomSelection() - - this.editor._onAction('appendNodes', { - nodes: [newNode], - paths: [newNode.getInternalPath()], - parentPath: this.parent.getInternalPath(), - oldSelection: oldSelection, - newSelection: newSelection - }) - } - - /** - * Change the type of the node's value - * @param {String} newType - * @private - */ - _onChangeType (newType) { - const oldType = this.type - if (newType !== oldType) { - const oldSelection = this.editor.getDomSelection() - this.changeType(newType) - const newSelection = this.editor.getDomSelection() - - this.editor._onAction('changeType', { - path: this.getInternalPath(), - oldType: oldType, - newType: newType, - oldSelection: oldSelection, - newSelection: newSelection - }) - } - } - - /** - * Sort the child's of the node. Only applicable when the node has type 'object' - * or 'array'. - * @param {String[] | string} path Path of the child value to be compared - * @param {String} direction Sorting direction. Available values: "asc", "desc" - * @param {boolean} [triggerAction=true] If true (default), a user action will be - * triggered, creating an entry in history - * and invoking onChange. - * @private - */ - sort (path, direction, triggerAction = true) { - if (typeof path === 'string') { - path = parsePath(path) - } - - if (!this._hasChilds()) { - return - } - - this.hideChilds() // sorting is faster when the childs are not attached to the dom - - // copy the childs array (the old one will be kept for an undo action - const oldChilds = this.childs - this.childs = this.childs.concat() - - // sort the childs array - const order = (direction === 'desc') ? -1 : 1 - - if (this.type === 'object') { - this.childs.sort((a, b) => order * naturalSort(a.field, b.field)) - } else { // this.type === 'array' - this.childs.sort((a, b) => { - const nodeA = a.getNestedChild(path) - const nodeB = b.getNestedChild(path) - - if (!nodeA) { - return order - } - if (!nodeB) { - return -order - } - - const valueA = nodeA.value - const valueB = nodeB.value - - if (typeof valueA !== 'string' && typeof valueB !== 'string') { - // both values are a number, boolean, or null -> use simple, fast sorting - return valueA > valueB ? order : valueA < valueB ? -order : 0 - } - - return order * naturalSort(valueA, valueB) - }) - } - - // update the index numbering - this._updateDomIndexes() - - this.showChilds() - - if (triggerAction === true) { - this.editor._onAction('sort', { - path: this.getInternalPath(), - oldChilds: oldChilds, - newChilds: this.childs - }) - } - } - - /** - * Replace the value of the node, keep it's state - * @param {*} newValue - */ - update (newValue) { - const oldValue = this.getInternalValue() - - this.setValue(newValue) - - this.editor._onAction('transform', { - path: this.getInternalPath(), - oldValue: oldValue, - newValue: this.getInternalValue() - }) - } - - /** - * Remove this node from the DOM - * @returns {{table: Element, nextTr?: Element}} - * Returns the DOM elements that which be used to attach the node - * to the DOM again, see _attachToDom. - * @private - */ - _detachFromDom () { - const table = this.dom.tr ? this.dom.tr.parentNode : undefined - let lastTr - if (this.expanded) { - lastTr = this.getAppendDom() - } else { - lastTr = this.getDom() - } - const nextTr = (lastTr && lastTr.parentNode) ? lastTr.nextSibling : undefined - - this.hide({ resetVisibleChilds: false }) - - return { - table: table, - nextTr: nextTr - } - } - - /** - * Attach this node to the DOM again - * @param {{table: Element, nextTr?: Element}} domAnchor - * The DOM elements returned by _detachFromDom. - * @private - */ - _attachToDom (domAnchor) { - if (domAnchor.table) { - if (domAnchor.nextTr) { - domAnchor.table.insertBefore(this.getDom(), domAnchor.nextTr) - } else { - domAnchor.table.appendChild(this.getDom()) - } - } - - if (this.expanded) { - this.showChilds() - } - } - - /** - * Transform the node given a JMESPath query. - * @param {String} query JMESPath query to apply - * @private - */ - transform (query) { - if (!this._hasChilds()) { - return - } - - this.hideChilds() // sorting is faster when the childs are not attached to the dom - - try { - const oldInternalValue = this.getInternalValue() - - // apply the JMESPath query - const oldValue = this.getValue() - const newValue = this.editor.options.executeQuery(oldValue, query) - this.setValue(newValue) - - const newInternalValue = this.getInternalValue() - - this.editor._onAction('transform', { - path: this.getInternalPath(), - oldValue: oldInternalValue, - newValue: newInternalValue - }) - - this.showChilds() - } catch (err) { - this.showChilds() - - this.editor._onError(err) - } - } - - /** - * Make this object the root object of the ditor - */ - extract () { - this.editor.node.hideChilds() - this.hideChilds() - - try { - const oldInternalValue = this.editor.node.getInternalValue() - this.editor._setRoot(this) - const newInternalValue = this.editor.node.getInternalValue() - - this.editor._onAction('transform', { - path: this.editor.node.getInternalPath(), - oldValue: oldInternalValue, - newValue: newInternalValue - }) - } catch (err) { - this.editor._onError(err) - } finally { - this.updateDom({ recurse: true }) - this.showChilds() - } - } - - /** - * Get a nested child given a path with properties - * @param {String[]} path - * @returns {Node} - */ - getNestedChild (path) { - let i = 0 - let child = this - - while (child && i < path.length) { - child = child.findChildByProperty(path[i]) - i++ - } - - return child - } - - /** - * Find a child by property name - * @param {string} prop - * @return {Node | undefined} Returns the child node when found, or undefined otherwise - */ - findChildByProperty (prop) { - if (this.type !== 'object') { - return undefined - } - - return this.childs.find(child => child.field === prop) - } - - /** - * Create a table row with an append button. - * @return {HTMLElement | undefined} tr with the AppendNode contents - */ - getAppendDom () { - if (!this.append) { - this.append = new AppendNode(this.editor) - this.append.setParent(this) - } - return this.append.getDom() - } - - /** - * Create a table row with an showMore button and text - * @return {HTMLElement | undefined} tr with the AppendNode contents - */ - getShowMoreDom () { - if (!this.showMore) { - this.showMore = new ShowMoreNode(this.editor, this) - } - return this.showMore.getDom() - } - - /** - * Get the next sibling of current node - * @return {Node} nextSibling - */ - nextSibling () { - const index = this.parent.childs.indexOf(this) - return this.parent.childs[index + 1] || this.parent.append - } - - /** - * Get the previously rendered node - * @return {Node | null} previousNode - */ - _previousNode () { - let prevNode = null - const dom = this.getDom() - if (dom && dom.parentNode) { - // find the previous field - let prevDom = dom - do { - prevDom = prevDom.previousSibling - prevNode = Node.getNodeFromTarget(prevDom) - } - while (prevDom && prevNode && (prevNode instanceof AppendNode && !prevNode.isVisible())) - } - return prevNode - } - - /** - * Get the next rendered node - * @return {Node | null} nextNode - * @private - */ - _nextNode () { - let nextNode = null - const dom = this.getDom() - if (dom && dom.parentNode) { - // find the previous field - let nextDom = dom - do { - nextDom = nextDom.nextSibling - nextNode = Node.getNodeFromTarget(nextDom) - } - while (nextDom && nextNode && (nextNode instanceof AppendNode && !nextNode.isVisible())) - } - - return nextNode - } - - /** - * Get the first rendered node - * @return {Node | null} firstNode - * @private - */ - _firstNode () { - let firstNode = null - const dom = this.getDom() - if (dom && dom.parentNode) { - const firstDom = dom.parentNode.firstChild - firstNode = Node.getNodeFromTarget(firstDom) - } - - return firstNode - } - - /** - * Get the last rendered node - * @return {Node | null} lastNode - * @private - */ - _lastNode () { - let lastNode = null - const dom = this.getDom() - if (dom && dom.parentNode) { - let lastDom = dom.parentNode.lastChild - lastNode = Node.getNodeFromTarget(lastDom) - while (lastDom && lastNode && !lastNode.isVisible()) { - lastDom = lastDom.previousSibling - lastNode = Node.getNodeFromTarget(lastDom) - } - } - return lastNode - } - - /** - * Get the next element which can have focus. - * @param {Element} elem - * @return {Element | null} nextElem - * @private - */ - _previousElement (elem) { - const dom = this.dom - // noinspection FallthroughInSwitchStatementJS - switch (elem) { - case dom.value: - if (this.fieldEditable) { - return dom.field - } - // intentional fall through - case dom.field: - if (this._hasChilds()) { - return dom.expand - } - // intentional fall through - case dom.expand: - return dom.menu - case dom.menu: - if (dom.drag) { - return dom.drag - } - // intentional fall through - default: - return null - } - } - - /** - * Get the next element which can have focus. - * @param {Element} elem - * @return {Element | null} nextElem - * @private - */ - _nextElement (elem) { - const dom = this.dom - // noinspection FallthroughInSwitchStatementJS - switch (elem) { - case dom.drag: - return dom.menu - case dom.menu: - if (this._hasChilds()) { - return dom.expand - } - // intentional fall through - case dom.expand: - if (this.fieldEditable) { - return dom.field - } - // intentional fall through - case dom.field: - if (!this._hasChilds()) { - return dom.value - } - // intentional fall through - default: - return null - } - } - - /** - * Get the dom name of given element. returns null if not found. - * For example when element === dom.field, "field" is returned. - * @param {Element} element - * @return {String | null} elementName Available elements with name: 'drag', - * 'menu', 'expand', 'field', 'value' - * @private - */ - _getElementName (element) { - return Object.keys(this.dom) - .find(name => this.dom[name] === element) - } - - /** - * Test if this node has childs. This is the case when the node is an object - * or array. - * @return {boolean} hasChilds - * @private - */ - _hasChilds () { - return this.type === 'array' || this.type === 'object' - } - - addTemplates (menu, append) { - const node = this - const templates = node.editor.options.templates - if (templates == null) return - if (templates.length) { - // create a separator - menu.push({ - type: 'separator' - }) - } - const appendData = (name, data) => { - node._onAppend(name, data) - } - const insertData = (name, data) => { - node._onInsertBefore(name, data) - } - templates.forEach(function (template) { - menu.push({ - text: template.text, - className: (template.className || 'jsoneditor-type-object'), - title: template.title, - click: (append ? appendData.bind(this, template.field, template.value) : insertData.bind(this, template.field, template.value)) - }) - }) - } - - /** - * Show a contextmenu for this node - * @param {HTMLElement} anchor Anchor element to attach the context menu to - * as sibling. - * @param {function} [onClose] Callback method called when the context menu - * is being closed. - */ - showContextMenu (anchor, onClose) { - const node = this - let items = [] - - if (this.editable.value) { - items.push({ - text: translate('type'), - title: translate('typeTitle'), - className: 'jsoneditor-type-' + this.type, - submenu: [ - { - text: translate('auto'), - className: 'jsoneditor-type-auto' + - (this.type === 'auto' ? ' jsoneditor-selected' : ''), - title: translate('autoType'), - click: function () { - node._onChangeType('auto') - } - }, - { - text: translate('array'), - className: 'jsoneditor-type-array' + - (this.type === 'array' ? ' jsoneditor-selected' : ''), - title: translate('arrayType'), - click: function () { - node._onChangeType('array') - } - }, - { - text: translate('object'), - className: 'jsoneditor-type-object' + - (this.type === 'object' ? ' jsoneditor-selected' : ''), - title: translate('objectType'), - click: function () { - node._onChangeType('object') - } - }, - { - text: translate('string'), - className: 'jsoneditor-type-string' + - (this.type === 'string' ? ' jsoneditor-selected' : ''), - title: translate('stringType'), - click: function () { - node._onChangeType('string') - } - } - ] - }) - } - - if (this._hasChilds()) { - if (this.editor.options.enableSort) { - items.push({ - text: translate('sort'), - title: translate('sortTitle', { type: this.type }), - className: 'jsoneditor-sort-asc', - click: function () { - node.showSortModal() - } - }) - } - - if (this.editor.options.enableTransform) { - items.push({ - text: translate('transform'), - title: translate('transformTitle', { type: this.type }), - className: 'jsoneditor-transform', - click: function () { - node.showTransformModal() - } - }) - } - - if (this.parent) { - items.push({ - text: translate('extract'), - title: translate('extractTitle', { type: this.type }), - className: 'jsoneditor-extract', - click: function () { - node.extract() - } - }) - } - } - - if (this.parent && this.parent._hasChilds()) { - if (items.length) { - // create a separator - items.push({ - type: 'separator' - }) - } - - // create append button (for last child node only) - const childs = node.parent.childs - if (node === childs[childs.length - 1]) { - const appendSubmenu = [ - { - text: translate('auto'), - className: 'jsoneditor-type-auto', - title: translate('autoType'), - click: function () { - node._onAppend('', '', 'auto') - } - }, - { - text: translate('array'), - className: 'jsoneditor-type-array', - title: translate('arrayType'), - click: function () { - node._onAppend('', []) - } - }, - { - text: translate('object'), - className: 'jsoneditor-type-object', - title: translate('objectType'), - click: function () { - node._onAppend('', {}) - } - }, - { - text: translate('string'), - className: 'jsoneditor-type-string', - title: translate('stringType'), - click: function () { - node._onAppend('', '', 'string') - } - } - ] - node.addTemplates(appendSubmenu, true) - items.push({ - text: translate('appendText'), - title: translate('appendTitle'), - submenuTitle: translate('appendSubmenuTitle'), - className: 'jsoneditor-append', - click: function () { - node._onAppend('', '', 'auto') - }, - submenu: appendSubmenu - }) - } - - // create insert button - const insertSubmenu = [ - { - text: translate('auto'), - className: 'jsoneditor-type-auto', - title: translate('autoType'), - click: function () { - node._onInsertBefore('', '', 'auto') - } - }, - { - text: translate('array'), - className: 'jsoneditor-type-array', - title: translate('arrayType'), - click: function () { - node._onInsertBefore('', []) - } - }, - { - text: translate('object'), - className: 'jsoneditor-type-object', - title: translate('objectType'), - click: function () { - node._onInsertBefore('', {}) - } - }, - { - text: translate('string'), - className: 'jsoneditor-type-string', - title: translate('stringType'), - click: function () { - node._onInsertBefore('', '', 'string') - } - } - ] - node.addTemplates(insertSubmenu, false) - items.push({ - text: translate('insert'), - title: translate('insertTitle'), - submenuTitle: translate('insertSub'), - className: 'jsoneditor-insert', - click: function () { - node._onInsertBefore('', '', 'auto') - }, - submenu: insertSubmenu - }) - - if (this.editable.field) { - // create duplicate button - items.push({ - text: translate('duplicateText'), - title: translate('duplicateField'), - className: 'jsoneditor-duplicate', - click: function () { - Node.onDuplicate(node) - } - }) - - // create remove button - items.push({ - text: translate('removeText'), - title: translate('removeField'), - className: 'jsoneditor-remove', - click: function () { - Node.onRemove(node) - } - }) - } - } - - if (this.editor.options.onCreateMenu) { - const path = node.getPath() - - items = this.editor.options.onCreateMenu(items, { - type: 'single', - path: path, - paths: [path] - }) - } - - const menu = new ContextMenu(items, { close: onClose }) - menu.show(anchor, this.editor.getPopupAnchor()) - } - - /** - * Show sorting modal - */ - showSortModal () { - const node = this - const container = this.editor.options.modalAnchor || DEFAULT_MODAL_ANCHOR - const json = this.getValue() - - function onSort (sortedBy) { - const path = sortedBy.path - const pathArray = parsePath(path) - - node.sortedBy = sortedBy - node.sort(pathArray, sortedBy.direction) - } - - showSortModal(container, json, onSort, node.sortedBy) - } - - /** - * Show transform modal - */ - showTransformModal () { - const { modalAnchor, createQuery, executeQuery, queryDescription } = this.editor.options - const json = this.getValue() - - showTransformModal({ - anchor: modalAnchor || DEFAULT_MODAL_ANCHOR, - json, - queryDescription, // can be undefined - createQuery, - executeQuery, - onTransform: query => { this.transform(query) } - }) - } - - /** - * get the type of a value - * @param {*} value - * @return {String} type Can be 'object', 'array', 'string', 'auto' - * @private - */ - _getType (value) { - if (value instanceof Array) { - return 'array' - } - if (value instanceof Object) { - return 'object' - } - if (typeof (value) === 'string' && typeof (parseString(value)) !== 'string') { - return 'string' - } - - return 'auto' - } - - /** - * escape a text, such that it can be displayed safely in an HTML element - * @param {String} text - * @return {String} escapedText - * @private - */ - _escapeHTML (text) { - if (typeof text !== 'string') { - return String(text) - } else { - const htmlEscaped = String(text) - .replace(/&/g, '&') // must be replaced first! - .replace(//g, '>') - .replace(/ {2}/g, '  ') // replace double space with an nbsp and space - .replace(/^ /, ' ') // space at start - .replace(/ $/, ' ') // space at end - - const json = JSON.stringify(htmlEscaped) - let html = json.substring(1, json.length - 1) - if (this.editor.options.escapeUnicode === true) { - html = escapeUnicodeChars(html) - } - return html - } - } - - /** - * unescape a string. - * @param {String} escapedText - * @return {String} text - * @private - */ - _unescapeHTML (escapedText) { - const json = '"' + this._escapeJSON(escapedText) + '"' - const htmlEscaped = parse(json) - - return htmlEscaped - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/ |\u00A0/g, ' ') - .replace(/&/g, '&') // must be replaced last - } - - /** - * escape a text to make it a valid JSON string. The method will: - * - replace unescaped double quotes with '\"' - * - replace unescaped backslash with '\\' - * - replace returns with '\n' - * @param {String} text - * @return {String} escapedText - * @private - */ - _escapeJSON (text) { - // TODO: replace with some smart regex (only when a new solution is faster!) - let escaped = '' - let i = 0 - while (i < text.length) { - let c = text.charAt(i) - if (c === '\n') { - escaped += '\\n' - } else if (c === '\\') { - escaped += c - i++ - - c = text.charAt(i) - if (c === '' || '"\\/bfnrtu'.indexOf(c) === -1) { - escaped += '\\' // no valid escape character - } - escaped += c - } else if (c === '"') { - escaped += '\\"' - } else { - escaped += c - } - i++ - } - - return escaped - } - - /** - * update the object name according to the callback onNodeName - * @private - */ - updateNodeName () { - const count = this.childs ? this.childs.length : 0 - let nodeName - if (this.type === 'object' || this.type === 'array') { - if (this.editor.options.onNodeName) { - try { - nodeName = this.editor.options.onNodeName({ - path: this.getPath(), - size: count, - type: this.type - }) - } catch (err) { - console.error('Error in onNodeName callback: ', err) - } - } - - this.dom.value.innerHTML = (this.type === 'object') - ? ('{' + (nodeName || count) + '}') - : ('[' + (nodeName || count) + ']') - } - } - - /** - * update recursively the object's and its children's name. - * @private - */ - recursivelyUpdateNodeName () { - if (this.expanded) { - this.updateNodeName() - if (this.childs !== 'undefined') { - let i - for (i in this.childs) { - this.childs[i].recursivelyUpdateNodeName() - } - } - } - } -} - -// debounce interval for keyboard input in milliseconds -Node.prototype.DEBOUNCE_INTERVAL = 150 - -// search will stop iterating as soon as the max is reached -Node.prototype.MAX_SEARCH_RESULTS = 999 - -// default number of child nodes to display -const DEFAULT_MAX_VISIBLE_CHILDS = 100 - -// stores the element name currently having the focus -Node.focusElement = undefined - -/** - * Select all text in an editable div after a delay of 0 ms - * @param {Element} editableDiv - */ -Node.select = editableDiv => { - setTimeout(() => { - selectContentEditable(editableDiv) - }, 0) -} - -/** - * DragStart event, fired on mousedown on the dragarea at the left side of a Node - * @param {Node[] | Node} nodes - * @param {Event} event - */ -Node.onDragStart = (nodes, event) => { - if (!Array.isArray(nodes)) { - return Node.onDragStart([nodes], event) - } - if (nodes.length === 0) { - return - } - - const firstNode = nodes[0] - const lastNode = nodes[nodes.length - 1] - const parent = firstNode.parent - const draggedNode = Node.getNodeFromTarget(event.target) - const editor = firstNode.editor - - // in case of multiple selected nodes, offsetY prevents the selection from - // jumping when you start dragging one of the lower down nodes in the selection - const offsetY = getAbsoluteTop(draggedNode.dom.tr) - getAbsoluteTop(firstNode.dom.tr) - - if (!editor.mousemove) { - editor.mousemove = addEventListener(window, 'mousemove', event => { - Node.onDrag(nodes, event) - }) - } - - if (!editor.mouseup) { - editor.mouseup = addEventListener(window, 'mouseup', event => { - Node.onDragEnd(nodes, event) - }) - } - - editor.highlighter.lock() - editor.drag = { - oldCursor: document.body.style.cursor, - oldSelection: editor.getDomSelection(), - oldPaths: nodes.map(getInternalPath), - oldParent: parent, - oldNextNode: parent.childs[lastNode.getIndex() + 1] || parent.append, - oldParentPathRedo: parent.getInternalPath(), - oldIndexRedo: firstNode.getIndex(), - mouseX: event.pageX, - offsetY: offsetY, - level: firstNode.getLevel() - } - document.body.style.cursor = 'move' - - event.preventDefault() -} - -/** - * Drag event, fired when moving the mouse while dragging a Node - * @param {Node[] | Node} nodes - * @param {Event} event - */ -Node.onDrag = (nodes, event) => { - if (!Array.isArray(nodes)) { - return Node.onDrag([nodes], event) - } - if (nodes.length === 0) { - return - } - - // TODO: this method has grown too large. Split it in a number of methods - const editor = nodes[0].editor - const mouseY = event.pageY - editor.drag.offsetY - const mouseX = event.pageX - let trPrev, trNext, trFirst, trLast, trRoot - let nodePrev, nodeNext - let topPrev, topFirst, bottomNext, heightNext - let moved = false - - // TODO: add an ESC option, which resets to the original position - - // move up/down - const firstNode = nodes[0] - const trThis = firstNode.dom.tr - let topThis = getAbsoluteTop(trThis) - const heightThis = trThis.offsetHeight - if (mouseY < topThis) { - // move up - trPrev = trThis - do { - trPrev = trPrev.previousSibling - nodePrev = Node.getNodeFromTarget(trPrev) - topPrev = trPrev ? getAbsoluteTop(trPrev) : 0 - } - while (trPrev && mouseY < topPrev) - - if (nodePrev && !nodePrev.parent) { - nodePrev = undefined - } - - if (!nodePrev) { - // move to the first node - trRoot = trThis.parentNode.firstChild - trPrev = trRoot ? trRoot.nextSibling : undefined - nodePrev = Node.getNodeFromTarget(trPrev) - if (nodePrev === firstNode) { - nodePrev = undefined - } - } - - if (nodePrev && nodePrev.isVisible()) { - // check if mouseY is really inside the found node - trPrev = nodePrev.dom.tr - topPrev = trPrev ? getAbsoluteTop(trPrev) : 0 - if (mouseY > topPrev + heightThis) { - nodePrev = undefined - } - } - - if (nodePrev) { - nodes.forEach(node => { - nodePrev.parent.moveBefore(node, nodePrev) - }) - moved = true - } - } else { - // move down - const lastNode = nodes[nodes.length - 1] - trLast = (lastNode.expanded && lastNode.append) ? lastNode.append.getDom() : lastNode.dom.tr - trFirst = trLast ? trLast.nextSibling : undefined - if (trFirst) { - topFirst = getAbsoluteTop(trFirst) - trNext = trFirst - do { - nodeNext = Node.getNodeFromTarget(trNext) - if (trNext) { - bottomNext = trNext.nextSibling - ? getAbsoluteTop(trNext.nextSibling) : 0 - heightNext = trNext ? (bottomNext - topFirst) : 0 - - if (nodeNext && - nodeNext.parent.childs.length === nodes.length && - nodeNext.parent.childs[nodes.length - 1] === lastNode) { - // We are about to remove the last child of this parent, - // which will make the parents appendNode visible. - topThis += 27 - // TODO: dangerous to suppose the height of the appendNode a constant of 27 px. - } - - trNext = trNext.nextSibling - } - } - while (trNext && mouseY > topThis + heightNext) - - if (nodeNext && nodeNext.parent) { - // calculate the desired level - const diffX = (mouseX - editor.drag.mouseX) - const diffLevel = Math.round(diffX / 24 / 2) - const level = editor.drag.level + diffLevel // desired level - let levelNext = nodeNext.getLevel() // level to be - - // find the best fitting level (move upwards over the append nodes) - trPrev = nodeNext.dom.tr && nodeNext.dom.tr.previousSibling - while (levelNext < level && trPrev) { - nodePrev = Node.getNodeFromTarget(trPrev) - - const isDraggedNode = nodes.some(node => node === nodePrev || nodePrev.isDescendantOf(node)) - - if (isDraggedNode) { - // neglect the dragged nodes themselves and their childs - } else if (nodePrev instanceof AppendNode) { - const childs = nodePrev.parent.childs - if (childs.length !== nodes.length || childs[nodes.length - 1] !== lastNode) { - // non-visible append node of a list of childs - // consisting of not only this node (else the - // append node will change into a visible "empty" - // text when removing this node). - nodeNext = Node.getNodeFromTarget(trPrev) - levelNext = nodeNext.getLevel() - } else { - break - } - } else { - break - } - - trPrev = trPrev.previousSibling - } - - if (nodeNext instanceof AppendNode && !nodeNext.isVisible() && - nodeNext.parent.showMore.isVisible()) { - nodeNext = nodeNext._nextNode() - } - - // move the node when its position is changed - if (nodeNext && nodeNext.dom.tr && trLast.nextSibling !== nodeNext.dom.tr) { - nodes.forEach(node => { - nodeNext.parent.moveBefore(node, nodeNext) - }) - moved = true - } - } - } - } - - if (moved) { - // update the dragging parameters when moved - editor.drag.mouseX = mouseX - editor.drag.level = firstNode.getLevel() - } - - // auto scroll when hovering around the top of the editor - editor.startAutoScroll(mouseY) - - event.preventDefault() -} - -/** - * Drag event, fired on mouseup after having dragged a node - * @param {Node[] | Node} nodes - * @param {Event} event - */ -Node.onDragEnd = (nodes, event) => { - if (!Array.isArray(nodes)) { - return Node.onDrag([nodes], event) - } - if (nodes.length === 0) { - return - } - - const firstNode = nodes[0] - const editor = firstNode.editor - - // set focus to the context menu button of the first node - if (nodes[0]) { - nodes[0].dom.menu.focus() - } - - const oldParentPath = editor.drag.oldParent.getInternalPath() - const newParentPath = firstNode.parent.getInternalPath() - const sameParent = editor.drag.oldParent === firstNode.parent - const oldIndex = editor.drag.oldNextNode.getIndex() - const newIndex = firstNode.getIndex() - const oldParentPathRedo = editor.drag.oldParentPathRedo - - const oldIndexRedo = editor.drag.oldIndexRedo - const newIndexRedo = (sameParent && oldIndexRedo < newIndex) - ? (newIndex + nodes.length) - : newIndex - - if (!sameParent || oldIndexRedo !== newIndex) { - // only register this action if the node is actually moved to another place - editor._onAction('moveNodes', { - count: nodes.length, - fieldNames: nodes.map(getField), - - oldParentPath: oldParentPath, - newParentPath: newParentPath, - oldIndex: oldIndex, - newIndex: newIndex, - - oldIndexRedo: oldIndexRedo, - newIndexRedo: newIndexRedo, - oldParentPathRedo: oldParentPathRedo, - newParentPathRedo: null, // This is a hack, value will be filled in during undo - - oldSelection: editor.drag.oldSelection, - newSelection: editor.getDomSelection() - }) - } - - document.body.style.cursor = editor.drag.oldCursor - editor.highlighter.unlock() - nodes.forEach(node => { - node.updateDom() - - if (event.target !== node.dom.drag && event.target !== node.dom.menu) { - editor.highlighter.unhighlight() - } - }) - delete editor.drag - - if (editor.mousemove) { - removeEventListener(window, 'mousemove', editor.mousemove) - delete editor.mousemove - } - if (editor.mouseup) { - removeEventListener(window, 'mouseup', editor.mouseup) - delete editor.mouseup - } - - // Stop any running auto scroll - editor.stopAutoScroll() - - event.preventDefault() -} - -/** - * find an enum definition in a JSON schema, as property `enum` or inside - * one of the schemas composites (`oneOf`, `anyOf`, `allOf`) - * @param {Object} schema - * @return {Array | null} Returns the enum when found, null otherwise. - * @private - */ -Node._findEnum = schema => { - if (schema.enum) { - return schema.enum - } - - const composite = schema.oneOf || schema.anyOf || schema.allOf - if (composite) { - const match = composite.filter(entry => entry.enum) - if (match.length > 0) { - return match[0].enum - } - } - - return null -} - -/** - * Return the part of a JSON schema matching given path. - * @param {Object} schema - * @param {Object} schemaRefs - * @param {Array.} path - * @return {Object | null} - * @private - */ -Node._findSchema = (schema, schemaRefs, path) => { - let childSchema = schema - let foundSchema = childSchema - - let allSchemas = schema.oneOf || schema.anyOf || schema.allOf - if (!allSchemas) { - allSchemas = [schema] - } - - for (let j = 0; j < allSchemas.length; j++) { - childSchema = allSchemas[j] - - if ('$ref' in childSchema && typeof childSchema.$ref === 'string') { - childSchema = schemaRefs[childSchema.$ref] - if (childSchema) { - foundSchema = Node._findSchema(childSchema, schemaRefs, path) - } - } - - for (let i = 0; i < path.length && childSchema; i++) { - const nextPath = path.slice(i + 1, path.length) - const key = path[i] - - if (typeof key === 'string' && childSchema.patternProperties && !(childSchema.properties && key in childSchema.properties)) { - for (const prop in childSchema.patternProperties) { - if (key.match(prop)) { - foundSchema = Node._findSchema(childSchema.patternProperties[prop], schemaRefs, nextPath) - } - } - } else if (typeof key === 'string' && childSchema.properties) { - if (!(key in childSchema.properties)) { - foundSchema = null - } else { - childSchema = childSchema.properties[key] - if (childSchema) { - foundSchema = Node._findSchema(childSchema, schemaRefs, nextPath) - } - } - } else if (typeof key === 'number' && childSchema.items) { - childSchema = childSchema.items - if (childSchema) { - foundSchema = Node._findSchema(childSchema, schemaRefs, nextPath) - } - } - } - } - - // If the found schema is the input schema, the schema does not have the given path - if (foundSchema === schema && path.length > 0) { - return null - } - - return foundSchema -} - -/** - * Remove nodes - * @param {Node[] | Node} nodes - */ -Node.onRemove = nodes => { - if (!Array.isArray(nodes)) { - return Node.onRemove([nodes]) - } - - if (nodes && nodes.length > 0) { - const firstNode = nodes[0] - const parent = firstNode.parent - const editor = firstNode.editor - const firstIndex = firstNode.getIndex() - editor.highlighter.unhighlight() - - // adjust the focus - const oldSelection = editor.getDomSelection() - Node.blurNodes(nodes) - const newSelection = editor.getDomSelection() - - // store the paths before removing them (needed for history) - const paths = nodes.map(getInternalPath) - - // remove the nodes - nodes.forEach(node => { - node.parent._remove(node) - }) - - // store history action - editor._onAction('removeNodes', { - nodes: nodes, - paths: paths, - parentPath: parent.getInternalPath(), - index: firstIndex, - oldSelection: oldSelection, - newSelection: newSelection - }) - } -} - -/** - * Duplicate nodes - * duplicated nodes will be added right after the original nodes - * @param {Node[] | Node} nodes - */ -Node.onDuplicate = nodes => { - if (!Array.isArray(nodes)) { - return Node.onDuplicate([nodes]) - } - - if (nodes && nodes.length > 0) { - const lastNode = nodes[nodes.length - 1] - const parent = lastNode.parent - const editor = lastNode.editor - - editor.deselect(editor.multiselection.nodes) - - // duplicate the nodes - const oldSelection = editor.getDomSelection() - let afterNode = lastNode - const clones = nodes.map(node => { - const clone = node.clone() - if (node.parent.type === 'object') { - const existingFieldNames = node.parent.getFieldNames() - clone.field = findUniqueName(node.field, existingFieldNames) - } - parent.insertAfter(clone, afterNode) - afterNode = clone - return clone - }) - - // set selection to the duplicated nodes - if (nodes.length === 1) { - if (clones[0].parent.type === 'object') { - // when duplicating a single object property, - // set focus to the field and keep the original field name - clones[0].dom.field.innerHTML = nodes[0].field - clones[0].focus('field') - } else { - clones[0].focus() - } - } else { - editor.select(clones) - } - const newSelection = editor.getDomSelection() - - editor._onAction('duplicateNodes', { - paths: nodes.map(getInternalPath), - clonePaths: clones.map(getInternalPath), - afterPath: lastNode.getInternalPath(), - parentPath: parent.getInternalPath(), - oldSelection: oldSelection, - newSelection: newSelection - }) - } -} - -/** - * Find the node from an event target - * @param {HTMLElement} target - * @return {Node | undefined} node or undefined when not found - * @static - */ -Node.getNodeFromTarget = target => { - while (target) { - if (target.node) { - return target.node - } - target = target.parentNode - } - - return undefined -} - -/** - * Test whether target is a child of the color DOM of a node - * @param {HTMLElement} target - * @returns {boolean} - */ -Node.targetIsColorPicker = target => { - const node = Node.getNodeFromTarget(target) - - if (node) { - let parent = target && target.parentNode - while (parent) { - if (parent === node.dom.color) { - return true - } - parent = parent.parentNode - } - } - - return false -} - -/** - * Remove the focus of given nodes, and move the focus to the (a) node before, - * (b) the node after, or (c) the parent node. - * @param {Array. | Node} nodes - */ -Node.blurNodes = nodes => { - if (!Array.isArray(nodes)) { - Node.blurNodes([nodes]) - return - } - - const firstNode = nodes[0] - const parent = firstNode.parent - const firstIndex = firstNode.getIndex() - - if (parent.childs[firstIndex + nodes.length]) { - parent.childs[firstIndex + nodes.length].focus() - } else if (parent.childs[firstIndex - 1]) { - parent.childs[firstIndex - 1].focus() - } else { - parent.focus() - } -} - -// helper function to get the internal path of a node -function getInternalPath (node) { - return node.getInternalPath() -} - -// helper function to get the field of a node -function getField (node) { - return node.getField() -} - -function hasOwnProperty (object, key) { - return Object.prototype.hasOwnProperty.call(object, key) -} - -// TODO: find a nicer solution to resolve this circular dependency between Node and AppendNode -// idea: introduce properties .isAppendNode and .isNode and use that instead of instanceof AppendNode checks -const AppendNode = appendNodeFactory(Node) -const ShowMoreNode = showMoreNodeFactory(Node) diff --git a/src/js/NodeHistory.js b/src/js/NodeHistory.js deleted file mode 100644 index 5a6aee6..0000000 --- a/src/js/NodeHistory.js +++ /dev/null @@ -1,333 +0,0 @@ -'use strict' - -import { findUniqueName } from './util' - -/** - * @constructor History - * Store action history, enables undo and redo - * @param {JSONEditor} editor - */ -export class NodeHistory { - constructor (editor) { - this.editor = editor - this.history = [] - this.index = -1 - - this.clear() - - // helper function to find a Node from a path - function findNode (path) { - return editor.node.findNodeByInternalPath(path) - } - - // map with all supported actions - this.actions = { - editField: { - undo: function (params) { - const parentNode = findNode(params.parentPath) - const node = parentNode.childs[params.index] - node.updateField(params.oldValue) - }, - redo: function (params) { - const parentNode = findNode(params.parentPath) - const node = parentNode.childs[params.index] - node.updateField(params.newValue) - } - }, - editValue: { - undo: function (params) { - findNode(params.path).updateValue(params.oldValue) - }, - redo: function (params) { - findNode(params.path).updateValue(params.newValue) - } - }, - changeType: { - undo: function (params) { - findNode(params.path).changeType(params.oldType) - }, - redo: function (params) { - findNode(params.path).changeType(params.newType) - } - }, - - appendNodes: { - undo: function (params) { - const parentNode = findNode(params.parentPath) - params.paths.map(findNode).forEach(node => { - parentNode.removeChild(node) - }) - }, - redo: function (params) { - const parentNode = findNode(params.parentPath) - params.nodes.forEach(node => { - parentNode.appendChild(node) - }) - } - }, - insertBeforeNodes: { - undo: function (params) { - const parentNode = findNode(params.parentPath) - params.paths.map(findNode).forEach(node => { - parentNode.removeChild(node) - }) - }, - redo: function (params) { - const parentNode = findNode(params.parentPath) - const beforeNode = findNode(params.beforePath) - params.nodes.forEach(node => { - parentNode.insertBefore(node, beforeNode) - }) - } - }, - insertAfterNodes: { - undo: function (params) { - const parentNode = findNode(params.parentPath) - params.paths.map(findNode).forEach(node => { - parentNode.removeChild(node) - }) - }, - redo: function (params) { - const parentNode = findNode(params.parentPath) - let afterNode = findNode(params.afterPath) - params.nodes.forEach(node => { - parentNode.insertAfter(node, afterNode) - afterNode = node - }) - } - }, - removeNodes: { - undo: function (params) { - const parentNode = findNode(params.parentPath) - const beforeNode = parentNode.childs[params.index] || parentNode.append - params.nodes.forEach(node => { - parentNode.insertBefore(node, beforeNode) - }) - }, - redo: function (params) { - const parentNode = findNode(params.parentPath) - params.paths.map(findNode).forEach(node => { - parentNode.removeChild(node) - }) - } - }, - duplicateNodes: { - undo: function (params) { - const parentNode = findNode(params.parentPath) - params.clonePaths.map(findNode).forEach(node => { - parentNode.removeChild(node) - }) - }, - redo: function (params) { - const parentNode = findNode(params.parentPath) - let afterNode = findNode(params.afterPath) - const nodes = params.paths.map(findNode) - nodes.forEach(node => { - const clone = node.clone() - if (parentNode.type === 'object') { - const existingFieldNames = parentNode.getFieldNames() - clone.field = findUniqueName(node.field, existingFieldNames) - } - parentNode.insertAfter(clone, afterNode) - afterNode = clone - }) - } - }, - moveNodes: { - undo: function (params) { - const oldParentNode = findNode(params.oldParentPath) - const newParentNode = findNode(params.newParentPath) - const oldBeforeNode = oldParentNode.childs[params.oldIndex] || oldParentNode.append - - // first copy the nodes, then move them - const nodes = newParentNode.childs.slice(params.newIndex, params.newIndex + params.count) - - nodes.forEach((node, index) => { - node.field = params.fieldNames[index] - oldParentNode.moveBefore(node, oldBeforeNode) - }) - - // This is a hack to work around an issue that we don't know tha original - // path of the new parent after dragging, as the node is already moved at that time. - if (params.newParentPathRedo === null) { - params.newParentPathRedo = newParentNode.getInternalPath() - } - }, - redo: function (params) { - const oldParentNode = findNode(params.oldParentPathRedo) - const newParentNode = findNode(params.newParentPathRedo) - const newBeforeNode = newParentNode.childs[params.newIndexRedo] || newParentNode.append - - // first copy the nodes, then move them - const nodes = oldParentNode.childs.slice(params.oldIndexRedo, params.oldIndexRedo + params.count) - - nodes.forEach((node, index) => { - node.field = params.fieldNames[index] - newParentNode.moveBefore(node, newBeforeNode) - }) - } - }, - - sort: { - undo: function (params) { - const node = findNode(params.path) - node.hideChilds() - node.childs = params.oldChilds - node.updateDom({ updateIndexes: true }) - node.showChilds() - }, - redo: function (params) { - const node = findNode(params.path) - node.hideChilds() - node.childs = params.newChilds - node.updateDom({ updateIndexes: true }) - node.showChilds() - } - }, - - transform: { - undo: function (params) { - findNode(params.path).setInternalValue(params.oldValue) - - // TODO: would be nice to restore the state of the node and childs - }, - redo: function (params) { - findNode(params.path).setInternalValue(params.newValue) - - // TODO: would be nice to restore the state of the node and childs - } - } - - // TODO: restore the original caret position and selection with each undo - // TODO: implement history for actions "expand", "collapse", "scroll", "setDocument" - } - } - - /** - * The method onChange is executed when the History is changed, and can - * be overloaded. - */ - onChange () {} - - /** - * Add a new action to the history - * @param {String} action The executed action. Available actions: "editField", - * "editValue", "changeType", "appendNode", - * "removeNode", "duplicateNode", "moveNode" - * @param {Object} params Object containing parameters describing the change. - * The parameters in params depend on the action (for - * example for "editValue" the Node, old value, and new - * value are provided). params contains all information - * needed to undo or redo the action. - */ - add (action, params) { - this.index++ - this.history[this.index] = { - action: action, - params: params, - timestamp: new Date() - } - - // remove redo actions which are invalid now - if (this.index < this.history.length - 1) { - this.history.splice(this.index + 1, this.history.length - this.index - 1) - } - - // fire onchange event - this.onChange() - } - - /** - * Clear history - */ - clear () { - this.history = [] - this.index = -1 - - // fire onchange event - this.onChange() - } - - /** - * Check if there is an action available for undo - * @return {Boolean} canUndo - */ - canUndo () { - return (this.index >= 0) - } - - /** - * Check if there is an action available for redo - * @return {Boolean} canRedo - */ - canRedo () { - return (this.index < this.history.length - 1) - } - - /** - * Undo the last action - */ - undo () { - if (this.canUndo()) { - const obj = this.history[this.index] - if (obj) { - const action = this.actions[obj.action] - if (action && action.undo) { - action.undo(obj.params) - if (obj.params.oldSelection) { - try { - this.editor.setDomSelection(obj.params.oldSelection) - } catch (err) { - console.error(err) - } - } - } else { - console.error(new Error('unknown action "' + obj.action + '"')) - } - } - this.index-- - - // fire onchange event - this.onChange() - } - } - - /** - * Redo the last action - */ - redo () { - if (this.canRedo()) { - this.index++ - - const obj = this.history[this.index] - if (obj) { - const action = this.actions[obj.action] - if (action && action.redo) { - action.redo(obj.params) - if (obj.params.newSelection) { - try { - this.editor.setDomSelection(obj.params.newSelection) - } catch (err) { - console.error(err) - } - } - } else { - console.error(new Error('unknown action "' + obj.action + '"')) - } - } - - // fire onchange event - this.onChange() - } - } - - /** - * Destroy history - */ - destroy () { - this.editor = null - - this.history = [] - this.index = -1 - } -} diff --git a/src/js/SearchBox.js b/src/js/SearchBox.js deleted file mode 100644 index ec7e418..0000000 --- a/src/js/SearchBox.js +++ /dev/null @@ -1,325 +0,0 @@ -'use strict' -import { translate } from './i18n' - -/** - * @constructor SearchBox - * Create a search box in given HTML container - * @param {JSONEditor} editor The JSON Editor to attach to - * @param {Element} container HTML container element of where to - * create the search box - */ -export class SearchBox { - constructor (editor, container) { - const searchBox = this - - this.editor = editor - this.timeout = undefined - this.delay = 200 // ms - this.lastText = undefined - this.results = null - - this.dom = {} - this.dom.container = container - - const wrapper = document.createElement('div') - this.dom.wrapper = wrapper - wrapper.className = 'jsoneditor-search' - container.appendChild(wrapper) - - const results = document.createElement('div') - this.dom.results = results - results.className = 'jsoneditor-results' - wrapper.appendChild(results) - - const divInput = document.createElement('div') - this.dom.input = divInput - divInput.className = 'jsoneditor-frame' - divInput.title = translate('searchTitle') - wrapper.appendChild(divInput) - - const refreshSearch = document.createElement('button') - refreshSearch.type = 'button' - refreshSearch.className = 'jsoneditor-refresh' - divInput.appendChild(refreshSearch) - - const search = document.createElement('input') - search.type = 'text' - this.dom.search = search - search.oninput = event => { - searchBox._onDelayedSearch(event) - } - search.onchange = event => { - // For IE 9 - searchBox._onSearch() - } - search.onkeydown = event => { - searchBox._onKeyDown(event) - } - search.onkeyup = event => { - searchBox._onKeyUp(event) - } - refreshSearch.onclick = event => { - search.select() - } - - // TODO: ESC in FF restores the last input, is a FF bug, https://bugzilla.mozilla.org/show_bug.cgi?id=598819 - divInput.appendChild(search) - - const searchNext = document.createElement('button') - searchNext.type = 'button' - searchNext.title = translate('searchNextResultTitle') - searchNext.className = 'jsoneditor-next' - searchNext.onclick = () => { - searchBox.next() - } - - divInput.appendChild(searchNext) - - const searchPrevious = document.createElement('button') - searchPrevious.type = 'button' - searchPrevious.title = translate('searchPreviousResultTitle') - searchPrevious.className = 'jsoneditor-previous' - searchPrevious.onclick = () => { - searchBox.previous() - } - - divInput.appendChild(searchPrevious) - } - - /** - * Go to the next search result - * @param {boolean} [focus] If true, focus will be set to the next result - * focus is false by default. - */ - next (focus) { - if (this.results) { - let index = this.resultIndex !== null ? this.resultIndex + 1 : 0 - if (index > this.results.length - 1) { - index = 0 - } - this._setActiveResult(index, focus) - } - } - - /** - * Go to the prevous search result - * @param {boolean} [focus] If true, focus will be set to the next result - * focus is false by default. - */ - previous (focus) { - if (this.results) { - const max = this.results.length - 1 - let index = this.resultIndex !== null ? this.resultIndex - 1 : max - if (index < 0) { - index = max - } - this._setActiveResult(index, focus) - } - } - - /** - * Set new value for the current active result - * @param {Number} index - * @param {boolean} [focus] If true, focus will be set to the next result. - * focus is false by default. - * @private - */ - _setActiveResult (index, focus) { - // de-activate current active result - if (this.activeResult) { - const prevNode = this.activeResult.node - const prevElem = this.activeResult.elem - if (prevElem === 'field') { - delete prevNode.searchFieldActive - } else { - delete prevNode.searchValueActive - } - prevNode.updateDom() - } - - if (!this.results || !this.results[index]) { - // out of range, set to undefined - this.resultIndex = undefined - this.activeResult = undefined - return - } - - this.resultIndex = index - - // set new node active - const node = this.results[this.resultIndex].node - const elem = this.results[this.resultIndex].elem - if (elem === 'field') { - node.searchFieldActive = true - } else { - node.searchValueActive = true - } - this.activeResult = this.results[this.resultIndex] - node.updateDom() - - // TODO: not so nice that the focus is only set after the animation is finished - node.scrollTo(() => { - if (focus) { - node.focus(elem) - } - }) - } - - /** - * Cancel any running onDelayedSearch. - * @private - */ - _clearDelay () { - if (this.timeout !== undefined) { - clearTimeout(this.timeout) - delete this.timeout - } - } - - /** - * Start a timer to execute a search after a short delay. - * Used for reducing the number of searches while typing. - * @param {Event} event - * @private - */ - _onDelayedSearch (event) { - // execute the search after a short delay (reduces the number of - // search actions while typing in the search text box) - this._clearDelay() - const searchBox = this - this.timeout = setTimeout(event => { - searchBox._onSearch() - }, this.delay) - } - - /** - * Handle onSearch event - * @param {boolean} [forceSearch] If true, search will be executed again even - * when the search text is not changed. - * Default is false. - * @private - */ - _onSearch (forceSearch) { - this._clearDelay() - - const value = this.dom.search.value - const text = value.length > 0 ? value : undefined - if (text !== this.lastText || forceSearch) { - // only search again when changed - this.lastText = text - this.results = this.editor.search(text) - const MAX_SEARCH_RESULTS = this.results[0] - ? this.results[0].node.MAX_SEARCH_RESULTS - : Infinity - - // try to maintain the current active result if this is still part of the new search results - let activeResultIndex = 0 - if (this.activeResult) { - for (let i = 0; i < this.results.length; i++) { - if (this.results[i].node === this.activeResult.node) { - activeResultIndex = i - break - } - } - } - - this._setActiveResult(activeResultIndex, false) - - // display search results - if (text !== undefined) { - const resultCount = this.results.length - if (resultCount === 0) { - this.dom.results.innerHTML = 'no results' - } else if (resultCount === 1) { - this.dom.results.innerHTML = '1 result' - } else if (resultCount > MAX_SEARCH_RESULTS) { - this.dom.results.innerHTML = MAX_SEARCH_RESULTS + '+ results' - } else { - this.dom.results.innerHTML = resultCount + ' results' - } - } else { - this.dom.results.innerHTML = '' - } - } - } - - /** - * Handle onKeyDown event in the input box - * @param {Event} event - * @private - */ - _onKeyDown (event) { - const keynum = event.which - if (keynum === 27) { - // ESC - this.dom.search.value = '' // clear search - this._onSearch() - event.preventDefault() - event.stopPropagation() - } else if (keynum === 13) { - // Enter - if (event.ctrlKey) { - // force to search again - this._onSearch(true) - } else if (event.shiftKey) { - // move to the previous search result - this.previous() - } else { - // move to the next search result - this.next() - } - event.preventDefault() - event.stopPropagation() - } - } - - /** - * Handle onKeyUp event in the input box - * @param {Event} event - * @private - */ - _onKeyUp (event) { - const keynum = event.keyCode - if (keynum !== 27 && keynum !== 13) { - // !show and !Enter - this._onDelayedSearch(event) // For IE 9 - } - } - - /** - * Clear the search results - */ - clear () { - this.dom.search.value = '' - this._onSearch() - } - - /** - * Refresh searchResults if there is a search value - */ - forceSearch () { - this._onSearch(true) - } - - /** - * Test whether the search box value is empty - * @returns {boolean} Returns true when empty. - */ - isEmpty () { - return this.dom.search.value === '' - } - - /** - * Destroy the search box - */ - destroy () { - this.editor = null - this.dom.container.removeChild(this.dom.wrapper) - this.dom = null - - this.results = null - this.activeResult = null - - this._clearDelay() - } -} diff --git a/src/js/TreePath.js b/src/js/TreePath.js deleted file mode 100644 index 2fb9e3e..0000000 --- a/src/js/TreePath.js +++ /dev/null @@ -1,142 +0,0 @@ -'use strict' - -import { ContextMenu } from './ContextMenu' -import { translate } from './i18n' -import { addClassName, removeClassName } from './util' - -/** - * Creates a component that visualize path selection in tree based editors - * @param {HTMLElement} container - * @param {HTMLElement} root - * @constructor - */ -export class TreePath { - constructor (container, root) { - if (container) { - this.root = root - this.path = document.createElement('div') - this.path.className = 'jsoneditor-treepath' - this.path.setAttribute('tabindex', 0) - this.contentMenuClicked = false - container.appendChild(this.path) - this.reset() - } - } - - /** - * Reset component to initial status - */ - reset () { - this.path.innerHTML = translate('selectNode') - } - - /** - * Renders the component UI according to a given path objects - * @param {Array<{name: String, childs: Array}>} pathObjs a list of path objects - * - */ - setPath (pathObjs) { - const me = this - - this.path.innerHTML = '' - - if (pathObjs && pathObjs.length) { - pathObjs.forEach((pathObj, idx) => { - const pathEl = document.createElement('span') - let sepEl - pathEl.className = 'jsoneditor-treepath-element' - pathEl.innerText = pathObj.name - pathEl.onclick = _onSegmentClick.bind(me, pathObj) - - me.path.appendChild(pathEl) - - if (pathObj.children.length) { - sepEl = document.createElement('span') - sepEl.className = 'jsoneditor-treepath-seperator' - sepEl.innerHTML = '►' - - sepEl.onclick = () => { - me.contentMenuClicked = true - const items = [] - pathObj.children.forEach(child => { - items.push({ - text: child.name, - className: 'jsoneditor-type-modes' + (pathObjs[idx + 1] + 1 && pathObjs[idx + 1].name === child.name ? ' jsoneditor-selected' : ''), - click: _onContextMenuItemClick.bind(me, pathObj, child.name) - }) - }) - const menu = new ContextMenu(items) - menu.show(sepEl, me.root, true) - } - - me.path.appendChild(sepEl) - } - - if (idx === pathObjs.length - 1) { - const leftRectPos = (sepEl || pathEl).getBoundingClientRect().right - if (me.path.offsetWidth < leftRectPos) { - me.path.scrollLeft = leftRectPos - } - - if (me.path.scrollLeft) { - const showAllBtn = document.createElement('span') - showAllBtn.className = 'jsoneditor-treepath-show-all-btn' - showAllBtn.title = 'show all path' - showAllBtn.innerHTML = '...' - showAllBtn.onclick = _onShowAllClick.bind(me, pathObjs) - me.path.insertBefore(showAllBtn, me.path.firstChild) - } - } - }) - } - - function _onShowAllClick (pathObjs) { - me.contentMenuClicked = false - addClassName(me.path, 'show-all') - me.path.style.width = me.path.parentNode.getBoundingClientRect().width - 10 + 'px' - me.path.onblur = () => { - if (me.contentMenuClicked) { - me.contentMenuClicked = false - me.path.focus() - return - } - removeClassName(me.path, 'show-all') - me.path.onblur = undefined - me.path.style.width = '' - me.setPath(pathObjs) - } - } - - function _onSegmentClick (pathObj) { - if (this.selectionCallback) { - this.selectionCallback(pathObj) - } - } - - function _onContextMenuItemClick (pathObj, selection) { - if (this.contextMenuCallback) { - this.contextMenuCallback(pathObj, selection) - } - } - } - - /** - * set a callback function for selection of path section - * @param {Function} callback function to invoke when section is selected - */ - onSectionSelected (callback) { - if (typeof callback === 'function') { - this.selectionCallback = callback - } - } - - /** - * set a callback function for selection of path section - * @param {Function} callback function to invoke when section is selected - */ - onContextMenuItemSelected (callback) { - if (typeof callback === 'function') { - this.contextMenuCallback = callback - } - } -} diff --git a/src/js/ace/index.js b/src/js/ace/index.js deleted file mode 100644 index 0b02693..0000000 --- a/src/js/ace/index.js +++ /dev/null @@ -1,24 +0,0 @@ -let ace -if (window.ace) { - // use the already loaded instance of Ace - ace = window.ace -} else { - try { - // load Ace editor - ace = require('ace-builds/src-noconflict/ace') - - // load required Ace plugins - require('ace-builds/src-noconflict/mode-json') - require('ace-builds/src-noconflict/ext-searchbox') - - // embed Ace json worker - // https://github.com/ajaxorg/ace/issues/3913 - const jsonWorkerDataUrl = require('../generated/worker-json-data-url') - ace.config.setModuleUrl('ace/mode/json_worker', jsonWorkerDataUrl) - } catch (err) { - // failed to load Ace (can be minimalist bundle). - // No worries, the editor will fall back to plain text if needed. - } -} - -module.exports = ace diff --git a/src/js/ace/theme-jsoneditor.js b/src/js/ace/theme-jsoneditor.js deleted file mode 100644 index db8e662..0000000 --- a/src/js/ace/theme-jsoneditor.js +++ /dev/null @@ -1,144 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Distributed under the BSD license: - * - * Copyright (c) 2010, Ajax.org B.V. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Ajax.org B.V. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * ***** END LICENSE BLOCK ***** */ - -window.ace.define('ace/theme/jsoneditor', ['require', 'exports', 'module', 'ace/lib/dom'], (acequire, exports, module) => { - exports.isDark = false - exports.cssClass = 'ace-jsoneditor' - exports.cssText = `.ace-jsoneditor .ace_gutter { -background: #ebebeb; -color: #333 -} - -.ace-jsoneditor.ace_editor { -font-family: "dejavu sans mono", "droid sans mono", consolas, monaco, "lucida console", "courier new", courier, monospace, sans-serif; -line-height: 1.3; -background-color: #fff; -} -.ace-jsoneditor .ace_print-margin { -width: 1px; -background: #e8e8e8 -} -.ace-jsoneditor .ace_scroller { -background-color: #FFFFFF -} -.ace-jsoneditor .ace_text-layer { -color: gray -} -.ace-jsoneditor .ace_variable { -color: #1a1a1a -} -.ace-jsoneditor .ace_cursor { -border-left: 2px solid #000000 -} -.ace-jsoneditor .ace_overwrite-cursors .ace_cursor { -border-left: 0px; -border-bottom: 1px solid #000000 -} -.ace-jsoneditor .ace_marker-layer .ace_selection { -background: lightgray -} -.ace-jsoneditor.ace_multiselect .ace_selection.ace_start { -box-shadow: 0 0 3px 0px #FFFFFF; -border-radius: 2px -} -.ace-jsoneditor .ace_marker-layer .ace_step { -background: rgb(255, 255, 0) -} -.ace-jsoneditor .ace_marker-layer .ace_bracket { -margin: -1px 0 0 -1px; -border: 1px solid #BFBFBF -} -.ace-jsoneditor .ace_marker-layer .ace_active-line { -background: #FFFBD1 -} -.ace-jsoneditor .ace_gutter-active-line { -background-color : #dcdcdc -} -.ace-jsoneditor .ace_marker-layer .ace_selected-word { -border: 1px solid lightgray -} -.ace-jsoneditor .ace_invisible { -color: #BFBFBF -} -.ace-jsoneditor .ace_keyword, -.ace-jsoneditor .ace_meta, -.ace-jsoneditor .ace_support.ace_constant.ace_property-value { -color: #AF956F -} -.ace-jsoneditor .ace_keyword.ace_operator { -color: #484848 -} -.ace-jsoneditor .ace_keyword.ace_other.ace_unit { -color: #96DC5F -} -.ace-jsoneditor .ace_constant.ace_language { -color: darkorange -} -.ace-jsoneditor .ace_constant.ace_numeric { -color: red -} -.ace-jsoneditor .ace_constant.ace_character.ace_entity { -color: #BF78CC -} -.ace-jsoneditor .ace_invalid { -color: #FFFFFF; -background-color: #FF002A; -} -.ace-jsoneditor .ace_fold { -background-color: #AF956F; -border-color: #000000 -} -.ace-jsoneditor .ace_storage, -.ace-jsoneditor .ace_support.ace_class, -.ace-jsoneditor .ace_support.ace_function, -.ace-jsoneditor .ace_support.ace_other, -.ace-jsoneditor .ace_support.ace_type { -color: #C52727 -} -.ace-jsoneditor .ace_string { -color: green -} -.ace-jsoneditor .ace_comment { -color: #BCC8BA -} -.ace-jsoneditor .ace_entity.ace_name.ace_tag, -.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name { -color: #606060 -} -.ace-jsoneditor .ace_markup.ace_underline { -text-decoration: underline -} -.ace-jsoneditor .ace_indent-guide { -background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y -}` - - const dom = acequire('../lib/dom') - dom.importCssString(exports.cssText, exports.cssClass) -}) diff --git a/src/js/appendNodeFactory.js b/src/js/appendNodeFactory.js deleted file mode 100644 index 459d56d..0000000 --- a/src/js/appendNodeFactory.js +++ /dev/null @@ -1,251 +0,0 @@ -'use strict' - -import { ContextMenu } from './ContextMenu' -import { translate } from './i18n' -import { addClassName, removeClassName } from './util' - -/** - * A factory function to create an AppendNode, which depends on a Node - * @param {Node} Node - */ -export function appendNodeFactory (Node) { - /** - * @constructor AppendNode - * @extends Node - * @param {TreeEditor} editor - * Create a new AppendNode. This is a special node which is created at the - * end of the list with childs for an object or array - */ - function AppendNode (editor) { - /** @type {TreeEditor} */ - this.editor = editor - this.dom = {} - } - - AppendNode.prototype = new Node() - - /** - * Return a table row with an append button. - * @return {Element} dom TR element - */ - AppendNode.prototype.getDom = function () { - // TODO: implement a new solution for the append node - const dom = this.dom - - if (dom.tr) { - return dom.tr - } - - this._updateEditability() - - // a row for the append button - const trAppend = document.createElement('tr') - trAppend.className = 'jsoneditor-append' - trAppend.node = this - dom.tr = trAppend - - // TODO: consistent naming - - if (this.editor.options.mode === 'tree') { - // a cell for the dragarea column - dom.tdDrag = document.createElement('td') - - // create context menu - const tdMenu = document.createElement('td') - dom.tdMenu = tdMenu - const menu = document.createElement('button') - menu.type = 'button' - menu.className = 'jsoneditor-button jsoneditor-contextmenu-button' - menu.title = 'Click to open the actions menu (Ctrl+M)' - dom.menu = menu - tdMenu.appendChild(dom.menu) - } - - // a cell for the contents (showing text 'empty') - const tdAppend = document.createElement('td') - const domText = document.createElement('div') - domText.innerHTML = '(' + translate('empty') + ')' - domText.className = 'jsoneditor-readonly' - tdAppend.appendChild(domText) - dom.td = tdAppend - dom.text = domText - - this.updateDom() - - return trAppend - } - - /** - * Append node doesn't have a path - * @returns {null} - */ - AppendNode.prototype.getPath = () => null - - /** - * Append node doesn't have an index - * @returns {null} - */ - AppendNode.prototype.getIndex = () => null - - /** - * Update the HTML dom of the Node - */ - AppendNode.prototype.updateDom = function (options) { - const dom = this.dom - const tdAppend = dom.td - if (tdAppend) { - tdAppend.style.paddingLeft = (this.getLevel() * 24 + 26) + 'px' - // TODO: not so nice hard coded offset - } - - const domText = dom.text - if (domText) { - domText.innerHTML = '(' + translate('empty') + ' ' + this.parent.type + ')' - } - - // attach or detach the contents of the append node: - // hide when the parent has childs, show when the parent has no childs - const trAppend = dom.tr - if (!this.isVisible()) { - if (dom.tr.firstChild) { - if (dom.tdDrag) { - trAppend.removeChild(dom.tdDrag) - } - if (dom.tdMenu) { - trAppend.removeChild(dom.tdMenu) - } - trAppend.removeChild(tdAppend) - } - } else { - if (!dom.tr.firstChild) { - if (dom.tdDrag) { - trAppend.appendChild(dom.tdDrag) - } - if (dom.tdMenu) { - trAppend.appendChild(dom.tdMenu) - } - trAppend.appendChild(tdAppend) - } - } - } - - /** - * Check whether the AppendNode is currently visible. - * the AppendNode is visible when its parent has no childs (i.e. is empty). - * @return {boolean} isVisible - */ - AppendNode.prototype.isVisible = function () { - return (this.parent.childs.length === 0) - } - - /** - * Show a contextmenu for this node - * @param {HTMLElement} anchor The element to attach the menu to. - * @param {function} [onClose] Callback method called when the context menu - * is being closed. - */ - AppendNode.prototype.showContextMenu = function (anchor, onClose) { - const node = this - - const appendSubmenu = [ - { - text: translate('auto'), - className: 'jsoneditor-type-auto', - title: translate('autoType'), - click: function () { - node._onAppend('', '', 'auto') - } - }, - { - text: translate('array'), - className: 'jsoneditor-type-array', - title: translate('arrayType'), - click: function () { - node._onAppend('', []) - } - }, - { - text: translate('object'), - className: 'jsoneditor-type-object', - title: translate('objectType'), - click: function () { - node._onAppend('', {}) - } - }, - { - text: translate('string'), - className: 'jsoneditor-type-string', - title: translate('stringType'), - click: function () { - node._onAppend('', '', 'string') - } - } - ] - node.addTemplates(appendSubmenu, true) - let items = [ - // create append button - { - text: translate('appendText'), - title: translate('appendTitleAuto'), - submenuTitle: translate('appendSubmenuTitle'), - className: 'jsoneditor-insert', - click: function () { - node._onAppend('', '', 'auto') - }, - submenu: appendSubmenu - } - ] - - if (this.editor.options.onCreateMenu) { - const path = node.parent.getPath() - - items = this.editor.options.onCreateMenu(items, { - type: 'append', - path: path, - paths: [path] - }) - } - - const menu = new ContextMenu(items, { close: onClose }) - menu.show(anchor, this.editor.getPopupAnchor()) - } - - /** - * Handle an event. The event is caught centrally by the editor - * @param {Event} event - */ - AppendNode.prototype.onEvent = function (event) { - const type = event.type - const target = event.target || event.srcElement - const dom = this.dom - - // highlight the append nodes parent - const menu = dom.menu - if (target === menu) { - if (type === 'mouseover') { - this.editor.highlighter.highlight(this.parent) - } else if (type === 'mouseout') { - this.editor.highlighter.unhighlight() - } - } - - // context menu events - if (type === 'click' && target === dom.menu) { - const highlighter = this.editor.highlighter - highlighter.highlight(this.parent) - highlighter.lock() - addClassName(dom.menu, 'jsoneditor-selected') - this.showContextMenu(dom.menu, () => { - removeClassName(dom.menu, 'jsoneditor-selected') - highlighter.unlock() - highlighter.unhighlight() - }) - } - - if (type === 'keydown') { - this.onKeyDown(event) - } - } - - return AppendNode -} diff --git a/src/js/assets/jsonlint/README.md b/src/js/assets/jsonlint/README.md deleted file mode 100644 index ae26ff6..0000000 --- a/src/js/assets/jsonlint/README.md +++ /dev/null @@ -1,15 +0,0 @@ -The file jsonlint.js is copied from the following project: - -https://github.com/josdejong/jsonlint at 85a19d7 - -which is a fork of the (currently not maintained) project: - -https://github.com/zaach/jsonlint - -The forked project contains some fixes to allow the file to be bundled with -browserify. The file is copied in this project to prevent issues with linking -to a github project from package.json, which is for example not supported -by jspm. - -As soon as zaach/jsonlint is being maintained again we can push the fix -to the original library and use it as dependency again. diff --git a/src/js/assets/jsonlint/jsonlint.js b/src/js/assets/jsonlint/jsonlint.js deleted file mode 100644 index ae9b2f4..0000000 --- a/src/js/assets/jsonlint/jsonlint.js +++ /dev/null @@ -1,418 +0,0 @@ -/* Jison generated parser */ -var jsonlint = (function(){ -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"JSONString":3,"STRING":4,"JSONNumber":5,"NUMBER":6,"JSONNullLiteral":7,"NULL":8,"JSONBooleanLiteral":9,"TRUE":10,"FALSE":11,"JSONText":12,"JSONValue":13,"EOF":14,"JSONObject":15,"JSONArray":16,"{":17,"}":18,"JSONMemberList":19,"JSONMember":20,":":21,",":22,"[":23,"]":24,"JSONElementList":25,"$accept":0,"$end":1}, -terminals_: {2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"}, -productions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1: // replace escaped characters with actual character - this.$ = yytext.replace(/\\(\\|")/g, "$"+"1") - .replace(/\\n/g,'\n') - .replace(/\\r/g,'\r') - .replace(/\\t/g,'\t') - .replace(/\\v/g,'\v') - .replace(/\\f/g,'\f') - .replace(/\\b/g,'\b'); - -break; -case 2:this.$ = Number(yytext); -break; -case 3:this.$ = null; -break; -case 4:this.$ = true; -break; -case 5:this.$ = false; -break; -case 6:return this.$ = $$[$0-1]; -break; -case 13:this.$ = {}; -break; -case 14:this.$ = $$[$0-1]; -break; -case 15:this.$ = [$$[$0-2], $$[$0]]; -break; -case 16:this.$ = {}; this.$[$$[$0][0]] = $$[$0][1]; -break; -case 17:this.$ = $$[$0-2]; $$[$0-2][$$[$0][0]] = $$[$0][1]; -break; -case 18:this.$ = []; -break; -case 19:this.$ = $$[$0-1]; -break; -case 20:this.$ = [$$[$0]]; -break; -case 21:this.$ = $$[$0-2]; $$[$0-2].push($$[$0]); -break; -} -}, -table: [{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}], -defaultActions: {16:[2,6]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], // semantic value stack - lstack = [], // location stack - table = this.table, - yytext = '', - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - - //this.reductionCount = this.shiftCount = 0; - - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == 'undefined') - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - - if (typeof this.yy.parseError === 'function') - this.parseError = this.yy.parseError; - - function popStack (n) { - stack.length = stack.length - 2*n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - - function lex() { - var token; - token = self.lexer.lex() || 1; // $end = 1 - // if token isn't its numeric value, convert - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - } - - var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; - while (true) { - // retreive state number from top of stack - state = stack[stack.length-1]; - - // use default actions if available - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol == null) - symbol = lex(); - // read action for current state and first input - action = table[state] && table[state][symbol]; - } - - // handle parse error - _handle_error: - if (typeof action === 'undefined' || !action.length || !action[0]) { - - if (!recovering) { - // Report error - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'"+this.terminals_[p]+"'"); - } - var errStr = ''; - if (this.lexer.showPosition) { - errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; - } else { - errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + - (symbol == 1 /*EOF*/ ? "end of input" : - ("'"+(this.terminals_[symbol] || symbol)+"'")); - } - this.parseError(errStr, - {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - - // just recovered from another error - if (recovering == 3) { - if (symbol == EOF) { - throw new Error(errStr || 'Parsing halted.'); - } - - // discard current lookahead and grab another - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - symbol = lex(); - } - - // try to recover from error - while (1) { - // check for error recovery rule in this state - if ((TERROR.toString()) in table[state]) { - break; - } - if (state == 0) { - throw new Error(errStr || 'Parsing halted.'); - } - popStack(1); - state = stack[stack.length-1]; - } - - preErrorSymbol = symbol; // save the lookahead token - symbol = TERROR; // insert generic error symbol as new lookahead - state = stack[stack.length-1]; - action = table[state] && table[state][TERROR]; - recovering = 3; // allow 3 real symbols to be shifted before reporting a new error - } - - // this shouldn't happen, unless resolve defaults are off - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); - } - - switch (action[0]) { - - case 1: // shift - //this.shiftCount++; - - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); // push state - symbol = null; - if (!preErrorSymbol) { // normal execution/no error - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { // error just occurred, resume old lookahead f/ before error - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - - case 2: // reduce - //this.reductionCount++; - - len = this.productions_[action[1]][1]; - - // perform semantic action - yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 - // default location, uses first token for firsts, last for lasts - yyval._$ = { - first_line: lstack[lstack.length-(len||1)].first_line, - last_line: lstack[lstack.length-1].last_line, - first_column: lstack[lstack.length-(len||1)].first_column, - last_column: lstack[lstack.length-1].last_column - }; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - - if (typeof r !== 'undefined') { - return r; - } - - // pop off stack - if (len) { - stack = stack.slice(0,-1*len*2); - vstack = vstack.slice(0, -1*len); - lstack = lstack.slice(0, -1*len); - } - - stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) - vstack.push(yyval.$); - lstack.push(yyval._$); - // goto new state = table[STATE][NONTERMINAL] - newState = table[stack[stack.length-2]][stack[stack.length-1]]; - stack.push(newState); - break; - - case 3: // accept - return true; - } - - } - - return true; -}}; -/* Jison generated lexer */ -var lexer = (function(){ -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parseError) { - this.yy.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext+=ch; - this.yyleng++; - this.match+=ch; - this.matched+=ch; - var lines = ch.match(/\n/); - if (lines) this.yylineno++; - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - this._input = ch + this._input; - return this; - }, -more:function () { - this._more = true; - return this; - }, -less:function (n) { - this._input = this.match.slice(n) + this._input; - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - tempMatch, - index, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/\n.*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} - this.yytext += match[0]; - this.match += match[0]; - this.yyleng = this.yytext.length; - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; - } - if (this._input === "") { - return this.EOF; - } else { - this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0:/* skip whitespace */ -break; -case 1:return 6 -break; -case 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4 -break; -case 3:return 17 -break; -case 4:return 18 -break; -case 5:return 23 -break; -case 6:return 24 -break; -case 7:return 22 -break; -case 8:return 21 -break; -case 9:return 10 -break; -case 10:return 11 -break; -case 11:return 8 -break; -case 12:return 14 -break; -case 13:return 'INVALID' -break; -} -}; -lexer.rules = [/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/]; -lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}; - - -; -return lexer;})() -parser.lexer = lexer; -return parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { - exports.parser = jsonlint; - exports.parse = jsonlint.parse.bind(jsonlint); -} \ No newline at end of file diff --git a/src/js/assets/selectr/README.md b/src/js/assets/selectr/README.md deleted file mode 100644 index 637be8c..0000000 --- a/src/js/assets/selectr/README.md +++ /dev/null @@ -1,6 +0,0 @@ -This is a copy of the Selectr project - -https://github.com/Mobius1/Selectr - -Reason is that the project is not maintained and has some issues -loading it via `require` in a webpack project. diff --git a/src/js/assets/selectr/selectr.js b/src/js/assets/selectr/selectr.js deleted file mode 100644 index 7452cf8..0000000 --- a/src/js/assets/selectr/selectr.js +++ /dev/null @@ -1,2173 +0,0 @@ -/*! - * Selectr 2.4.0 - * https://github.com/Mobius1/Selectr - * - * Released under the MIT license - */ - -'use strict'; - -/** - * Default configuration options - * @type {Object} - */ -var defaultConfig = { - /** - * Emulates browser behaviour by selecting the first option by default - * @type {Boolean} - */ - defaultSelected: true, - - /** - * Sets the width of the container - * @type {String} - */ - width: "auto", - - /** - * Enables/ disables the container - * @type {Boolean} - */ - disabled: false, - - /** - * Enables / disables the search function - * @type {Boolean} - */ - searchable: true, - - /** - * Enable disable the clear button - * @type {Boolean} - */ - clearable: false, - - /** - * Sort the tags / multiselect options - * @type {Boolean} - */ - sortSelected: false, - - /** - * Allow deselecting of select-one options - * @type {Boolean} - */ - allowDeselect: false, - - /** - * Close the dropdown when scrolling (@AlexanderReiswich, #11) - * @type {Boolean} - */ - closeOnScroll: false, - - /** - * Allow the use of the native dropdown (@jonnyscholes, #14) - * @type {Boolean} - */ - nativeDropdown: false, - - /** - * Set the main placeholder - * @type {String} - */ - placeholder: "Select an option...", - - /** - * Allow the tagging feature - * @type {Boolean} - */ - taggable: false, - - /** - * Set the tag input placeholder (@labikmartin, #21, #22) - * @type {String} - */ - tagPlaceholder: "Enter a tag..." -}; - -/** - * Event Emitter - */ -var Events = function() {}; - -/** - * Event Prototype - * @type {Object} - */ -Events.prototype = { - /** - * Add custom event listener - * @param {String} event Event type - * @param {Function} func Callback - * @return {Void} - */ - on: function(event, func) { - this._events = this._events || {}; - this._events[event] = this._events[event] || []; - this._events[event].push(func); - }, - - /** - * Remove custom event listener - * @param {String} event Event type - * @param {Function} func Callback - * @return {Void} - */ - off: function(event, func) { - this._events = this._events || {}; - if (event in this._events === false) return; - this._events[event].splice(this._events[event].indexOf(func), 1); - }, - - /** - * Fire a custom event - * @param {String} event Event type - * @return {Void} - */ - emit: function(event /* , args... */ ) { - this._events = this._events || {}; - if (event in this._events === false) return; - for (var i = 0; i < this._events[event].length; i++) { - this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); - } - } -}; - -/** - * Event mixin - * @param {Object} obj - * @return {Object} - */ -Events.mixin = function(obj) { - var props = ['on', 'off', 'emit']; - for (var i = 0; i < props.length; i++) { - if (typeof obj === 'function') { - obj.prototype[props[i]] = Events.prototype[props[i]]; - } else { - obj[props[i]] = Events.prototype[props[i]]; - } - } - return obj; -}; - -/** - * Helpers - * @type {Object} - */ -var util = { - extend: function(src, props) { - props = props || {}; - var p; - for (p in src) { - if (src.hasOwnProperty(p)) { - if (!props.hasOwnProperty(p)) { - props[p] = src[p]; - } - } - } - return props; - }, - each: function(a, b, c) { - if ("[object Object]" === Object.prototype.toString.call(a)) { - for (var d in a) { - if (Object.prototype.hasOwnProperty.call(a, d)) { - b.call(c, d, a[d], a); - } - } - } else { - for (var e = 0, f = a.length; e < f; e++) { - b.call(c, e, a[e], a); - } - } - }, - createElement: function(e, a) { - var d = document, - el = d.createElement(e); - if (a && "[object Object]" === Object.prototype.toString.call(a)) { - var i; - for (i in a) - if (i in el) el[i] = a[i]; - else if ("html" === i) el.innerHTML = a[i]; - else if ("text" === i) { - var t = d.createTextNode(a[i]); - el.appendChild(t); - } else el.setAttribute(i, a[i]); - } - return el; - }, - hasClass: function(a, b) { - if (a) - return a.classList ? a.classList.contains(b) : !!a.className && !!a.className.match(new RegExp("(\\s|^)" + b + "(\\s|$)")); - }, - addClass: function(a, b) { - if (!util.hasClass(a, b)) { - if (a.classList) { - a.classList.add(b); - } else { - a.className = a.className.trim() + " " + b; - } - } - }, - removeClass: function(a, b) { - if (util.hasClass(a, b)) { - if (a.classList) { - a.classList.remove(b); - } else { - a.className = a.className.replace(new RegExp("(^|\\s)" + b.split(" ").join("|") + "(\\s|$)", "gi"), " "); - } - } - }, - closest: function(el, fn) { - return el && el !== document.body && (fn(el) ? el : util.closest(el.parentNode, fn)); - }, - isInt: function(val) { - return typeof val === 'number' && isFinite(val) && Math.floor(val) === val; - }, - debounce: function(a, b, c) { - var d; - return function() { - var e = this, - f = arguments, - g = function() { - d = null; - if (!c) a.apply(e, f); - }, - h = c && !d; - clearTimeout(d); - d = setTimeout(g, b); - if (h) { - a.apply(e, f); - } - }; - }, - rect: function(el, abs) { - var w = window; - var r = el.getBoundingClientRect(); - var x = abs ? w.pageXOffset : 0; - var y = abs ? w.pageYOffset : 0; - - return { - bottom: r.bottom + y, - height: r.height, - left: r.left + x, - right: r.right + x, - top: r.top + y, - width: r.width - }; - }, - includes: function(a, b) { - return a.indexOf(b) > -1; - }, - truncate: function(el) { - while (el.firstChild) { - el.removeChild(el.firstChild); - } - } -}; - - -function isset(obj, prop) { - return obj.hasOwnProperty(prop) && (obj[prop] === true || obj[prop].length); -} - -/** - * Append an item to the list - * @param {Object} item - * @param {Object} custom - * @return {Void} - */ -function appendItem(item, parent, custom) { - if (item.parentNode) { - if (!item.parentNode.parentNode) { - parent.appendChild(item.parentNode); - } - } else { - parent.appendChild(item); - } - - util.removeClass(item, "excluded"); - if (!custom) { - item.innerHTML = item.textContent; - } -} - -/** - * Render the item list - * @return {Void} - */ -var render = function() { - if (this.items.length) { - var f = document.createDocumentFragment(); - - if (this.config.pagination) { - var pages = this.pages.slice(0, this.pageIndex); - - util.each(pages, function(i, items) { - util.each(items, function(j, item) { - appendItem(item, f, this.customOption); - }, this); - }, this); - } else { - util.each(this.items, function(i, item) { - appendItem(item, f, this.customOption); - }, this); - } - - if (f.childElementCount) { - util.removeClass(this.items[this.navIndex], "active"); - this.navIndex = f.querySelector(".selectr-option").idx; - util.addClass(this.items[this.navIndex], "active"); - } - - this.tree.appendChild(f); - } -}; - -/** - * Dismiss / close the dropdown - * @param {obj} e - * @return {void} - */ -var dismiss = function(e) { - var target = e.target; - if (!this.container.contains(target) && (this.opened || util.hasClass(this.container, "notice"))) { - this.close(); - } -}; - -/** - * Build a list item from the HTMLOptionElement - * @param {int} i HTMLOptionElement index - * @param {HTMLOptionElement} option - * @param {bool} group Has parent optgroup - * @return {void} - */ -var createItem = function(option, data) { - data = data || option; - var content = this.customOption ? this.config.renderOption(data) : option.textContent; - var opt = util.createElement("li", { - class: "selectr-option", - html: content, - role: "treeitem", - "aria-selected": false - }); - - opt.idx = option.idx; - - this.items.push(opt); - - if (option.defaultSelected) { - this.defaultSelected.push(option.idx); - } - - if (option.disabled) { - opt.disabled = true; - util.addClass(opt, "disabled"); - } - - return opt; -}; - -/** - * Build the container - * @return {Void} - */ -var build = function() { - - this.requiresPagination = this.config.pagination && this.config.pagination > 0; - - // Set width - if (isset(this.config, "width")) { - if (util.isInt(this.config.width)) { - this.width = this.config.width + "px"; - } else { - if (this.config.width === "auto") { - this.width = "100%"; - } else if (util.includes(this.config.width, "%")) { - this.width = this.config.width; - } - } - } - - this.container = util.createElement("div", { - class: "selectr-container" - }); - - // Custom className - if (this.config.customClass) { - util.addClass(this.container, this.config.customClass); - } - - // Mobile device - if (this.mobileDevice) { - util.addClass(this.container, "selectr-mobile"); - } else { - util.addClass(this.container, "selectr-desktop"); - } - - // Hide the HTMLSelectElement and prevent focus - this.el.tabIndex = -1; - - // Native dropdown - if (this.config.nativeDropdown || this.mobileDevice) { - util.addClass(this.el, "selectr-visible"); - } else { - util.addClass(this.el, "selectr-hidden"); - } - - this.selected = util.createElement("div", { - class: "selectr-selected", - disabled: this.disabled, - tabIndex: 1, // enable tabIndex (#9) - "aria-expanded": false - }); - - this.label = util.createElement(this.el.multiple ? "ul" : "span", { - class: "selectr-label" - }); - - var dropdown = util.createElement("div", { - class: "selectr-options-container" - }); - - this.tree = util.createElement("ul", { - class: "selectr-options", - role: "tree", - "aria-hidden": true, - "aria-expanded": false - }); - - this.notice = util.createElement("div", { - class: "selectr-notice" - }); - - this.el.setAttribute("aria-hidden", true); - - if (this.disabled) { - this.el.disabled = true; - } - - if (this.el.multiple) { - util.addClass(this.label, "selectr-tags"); - util.addClass(this.container, "multiple"); - - // Collection of tags - this.tags = []; - - // Collection of selected values - this.selectedValues = this.getSelectedProperties('value'); - - // Collection of selected indexes - this.selectedIndexes = this.getSelectedProperties('idx'); - } - - this.selected.appendChild(this.label); - - if (this.config.clearable) { - this.selectClear = util.createElement("button", { - class: "selectr-clear", - type: "button" - }); - - this.container.appendChild(this.selectClear); - - util.addClass(this.container, "clearable"); - } - - if (this.config.taggable) { - var li = util.createElement('li', { - class: 'input-tag' - }); - this.input = util.createElement("input", { - class: "selectr-tag-input", - placeholder: this.config.tagPlaceholder, - tagIndex: 0, - autocomplete: "off", - autocorrect: "off", - autocapitalize: "off", - spellcheck: "false", - role: "textbox", - type: "search" - }); - - li.appendChild(this.input); - this.label.appendChild(li); - util.addClass(this.container, "taggable"); - - this.tagSeperators = [","]; - if (this.config.tagSeperators) { - this.tagSeperators = this.tagSeperators.concat(this.config.tagSeperators); - } - } - - if (this.config.searchable) { - this.input = util.createElement("input", { - class: "selectr-input", - tagIndex: -1, - autocomplete: "off", - autocorrect: "off", - autocapitalize: "off", - spellcheck: "false", - role: "textbox", - type: "search" - }); - this.inputClear = util.createElement("button", { - class: "selectr-input-clear", - type: "button" - }); - this.inputContainer = util.createElement("div", { - class: "selectr-input-container" - }); - - this.inputContainer.appendChild(this.input); - this.inputContainer.appendChild(this.inputClear); - dropdown.appendChild(this.inputContainer); - } - - dropdown.appendChild(this.notice); - dropdown.appendChild(this.tree); - - // List of items for the dropdown - this.items = []; - - // Establish options - this.options = []; - - // Check for options in the element - if (this.el.options.length) { - this.options = [].slice.call(this.el.options); - } - - // Element may have optgroups so - // iterate element.children instead of element.options - var group = false, - j = 0; - if (this.el.children.length) { - util.each(this.el.children, function(i, element) { - if (element.nodeName === "OPTGROUP") { - - group = util.createElement("ul", { - class: "selectr-optgroup", - role: "group", - html: "
  • " + element.label + "
  • " - }); - - util.each(element.children, function(x, el) { - el.idx = j; - group.appendChild(createItem.call(this, el, group)); - j++; - }, this); - } else { - element.idx = j; - createItem.call(this, element); - j++; - } - }, this); - } - - // Options defined by the data option - if (this.config.data && Array.isArray(this.config.data)) { - this.data = []; - var optgroup = false, - option; - - group = false; - j = 0; - - util.each(this.config.data, function(i, opt) { - // Check for group options - if (isset(opt, "children")) { - optgroup = util.createElement("optgroup", { - label: opt.text - }); - - group = util.createElement("ul", { - class: "selectr-optgroup", - role: "group", - html: "
  • " + opt.text + "
  • " - }); - - util.each(opt.children, function(x, data) { - option = new Option(data.text, data.value, false, data.hasOwnProperty("selected") && data.selected === true); - - option.disabled = isset(data, "disabled"); - - this.options.push(option); - - optgroup.appendChild(option); - - option.idx = j; - - group.appendChild(createItem.call(this, option, data)); - - this.data[j] = data; - - j++; - }, this); - } else { - option = new Option(opt.text, opt.value, false, opt.hasOwnProperty("selected") && opt.selected === true); - - option.disabled = isset(opt, "disabled"); - - this.options.push(option); - - option.idx = j; - - createItem.call(this, option, opt); - - this.data[j] = opt; - - j++; - } - }, this); - } - - this.setSelected(true); - - var first; - this.navIndex = 0; - for (var i = 0; i < this.items.length; i++) { - first = this.items[i]; - - if (!util.hasClass(first, "disabled")) { - - util.addClass(first, "active"); - this.navIndex = i; - break; - } - } - - // Check for pagination / infinite scroll - if (this.requiresPagination) { - this.pageIndex = 1; - - // Create the pages - this.paginate(); - } - - this.container.appendChild(this.selected); - this.container.appendChild(dropdown); - - this.placeEl = util.createElement("div", { - class: "selectr-placeholder" - }); - - // Set the placeholder - this.setPlaceholder(); - - this.selected.appendChild(this.placeEl); - - // Disable if required - if (this.disabled) { - this.disable(); - } - - this.el.parentNode.insertBefore(this.container, this.el); - this.container.appendChild(this.el); -}; - -/** - * Navigate through the dropdown - * @param {obj} e - * @return {void} - */ -var navigate = function(e) { - e = e || window.event; - - // Filter out the keys we don"t want - if (!this.items.length || !this.opened || !util.includes([13, 38, 40], e.which)) { - this.navigating = false; - return; - } - - e.preventDefault(); - - if (e.which === 13) { - - if (this.config.taggable && this.input.value.length > 0) { - return false; - } - - return this.change(this.navIndex); - } - - var direction, prevEl = this.items[this.navIndex]; - - switch (e.which) { - case 38: - direction = 0; - if (this.navIndex > 0) { - this.navIndex--; - } - break; - case 40: - direction = 1; - if (this.navIndex < this.items.length - 1) { - this.navIndex++; - } - } - - this.navigating = true; - - - // Instead of wasting memory holding a copy of this.items - // with disabled / excluded options omitted, skip them instead - while (util.hasClass(this.items[this.navIndex], "disabled") || util.hasClass(this.items[this.navIndex], "excluded")) { - if (direction) { - this.navIndex++; - } else { - this.navIndex--; - } - - if (this.searching) { - if (this.navIndex > this.tree.lastElementChild.idx) { - this.navIndex = this.tree.lastElementChild.idx; - break; - } else if (this.navIndex < this.tree.firstElementChild.idx) { - this.navIndex = this.tree.firstElementChild.idx; - break; - } - } - } - - // Autoscroll the dropdown during navigation - var r = util.rect(this.items[this.navIndex]); - - if (!direction) { - if (this.navIndex === 0) { - this.tree.scrollTop = 0; - } else if (r.top - this.optsRect.top < 0) { - this.tree.scrollTop = this.tree.scrollTop + (r.top - this.optsRect.top); - } - } else { - if (this.navIndex === 0) { - this.tree.scrollTop = 0; - } else if ((r.top + r.height) > (this.optsRect.top + this.optsRect.height)) { - this.tree.scrollTop = this.tree.scrollTop + ((r.top + r.height) - (this.optsRect.top + this.optsRect.height)); - } - - // Load another page if needed - if (this.navIndex === this.tree.childElementCount - 1 && this.requiresPagination) { - load.call(this); - } - } - - if (prevEl) { - util.removeClass(prevEl, "active"); - } - - util.addClass(this.items[this.navIndex], "active"); -}; - -/** - * Add a tag - * @param {HTMLElement} item - */ -var addTag = function(item) { - var that = this, - r; - - var docFrag = document.createDocumentFragment(); - var option = this.options[item.idx]; - var data = this.data ? this.data[item.idx] : option; - var content = this.customSelected ? this.config.renderSelection(data) : option.textContent; - - var tag = util.createElement("li", { - class: "selectr-tag", - html: content - }); - var btn = util.createElement("button", { - class: "selectr-tag-remove", - type: "button" - }); - - tag.appendChild(btn); - - // Set property to check against later - tag.idx = item.idx; - tag.tag = option.value; - - this.tags.push(tag); - - if (this.config.sortSelected) { - - var tags = this.tags.slice(); - - // Deal with values that contain numbers - r = function(val, arr) { - val.replace(/(\d+)|(\D+)/g, function(that, $1, $2) { - arr.push([$1 || Infinity, $2 || ""]); - }); - }; - - tags.sort(function(a, b) { - var x = [], - y = [], - ac, bc; - if (that.config.sortSelected === true) { - ac = a.tag; - bc = b.tag; - } else if (that.config.sortSelected === 'text') { - ac = a.textContent; - bc = b.textContent; - } - - r(ac, x); - r(bc, y); - - while (x.length && y.length) { - var ax = x.shift(); - var by = y.shift(); - var nn = (ax[0] - by[0]) || ax[1].localeCompare(by[1]); - if (nn) return nn; - } - - return x.length - y.length; - }); - - util.each(tags, function(i, tg) { - docFrag.appendChild(tg); - }); - - this.label.innerHTML = ""; - - } else { - docFrag.appendChild(tag); - } - - if (this.config.taggable) { - this.label.insertBefore(docFrag, this.input.parentNode); - } else { - this.label.appendChild(docFrag); - } -}; - -/** - * Remove a tag - * @param {HTMLElement} item - * @return {void} - */ -var removeTag = function(item) { - var tag = false; - - util.each(this.tags, function(i, t) { - if (t.idx === item.idx) { - tag = t; - } - }, this); - - if (tag) { - this.label.removeChild(tag); - this.tags.splice(this.tags.indexOf(tag), 1); - } -}; - -/** - * Load the next page of items - * @return {void} - */ -var load = function() { - var tree = this.tree; - var scrollTop = tree.scrollTop; - var scrollHeight = tree.scrollHeight; - var offsetHeight = tree.offsetHeight; - var atBottom = scrollTop >= (scrollHeight - offsetHeight); - - if ((atBottom && this.pageIndex < this.pages.length)) { - var f = document.createDocumentFragment(); - - util.each(this.pages[this.pageIndex], function(i, item) { - appendItem(item, f, this.customOption); - }, this); - - tree.appendChild(f); - - this.pageIndex++; - - this.emit("selectr.paginate", { - items: this.items.length, - total: this.data.length, - page: this.pageIndex, - pages: this.pages.length - }); - } -}; - -/** - * Clear a search - * @return {void} - */ -var clearSearch = function() { - if (this.config.searchable || this.config.taggable) { - this.input.value = null; - this.searching = false; - if (this.config.searchable) { - util.removeClass(this.inputContainer, "active"); - } - - if (util.hasClass(this.container, "notice")) { - util.removeClass(this.container, "notice"); - util.addClass(this.container, "open"); - this.input.focus(); - } - - util.each(this.items, function(i, item) { - // Items that didn't match need the class - // removing to make them visible again - util.removeClass(item, "excluded"); - // Remove the span element for underlining matched items - if (!this.customOption) { - item.innerHTML = item.textContent; - } - }, this); - } -}; - -/** - * Query matching for searches - * @param {string} query - * @param {HTMLOptionElement} option - * @return {bool} - */ -var match = function(query, option) { - var result = new RegExp(query, "i").exec(option.textContent); - if (result) { - return option.textContent.replace(result[0], "" + result[0] + ""); - } - return false; -}; - -// Main Lib -var Selectr = function(el, config) { - - config = config || {}; - - if (!el) { - throw new Error("You must supply either a HTMLSelectElement or a CSS3 selector string."); - } - - this.el = el; - - // CSS3 selector string - if (typeof el === "string") { - this.el = document.querySelector(el); - } - - if (this.el === null) { - throw new Error("The element you passed to Selectr can not be found."); - } - - if (this.el.nodeName.toLowerCase() !== "select") { - throw new Error("The element you passed to Selectr is not a HTMLSelectElement."); - } - - this.render(config); -}; - -/** - * Render the instance - * @param {object} config - * @return {void} - */ -Selectr.prototype.render = function(config) { - - if (this.rendered) return; - - // Merge defaults with user set config - this.config = util.extend(defaultConfig, config); - - // Store type - this.originalType = this.el.type; - - // Store tabIndex - this.originalIndex = this.el.tabIndex; - - // Store defaultSelected options for form reset - this.defaultSelected = []; - - // Store the original option count - this.originalOptionCount = this.el.options.length; - - if (this.config.multiple || this.config.taggable) { - this.el.multiple = true; - } - - // Disabled? - this.disabled = isset(this.config, "disabled"); - - this.opened = false; - - if (this.config.taggable) { - this.config.searchable = false; - } - - this.navigating = false; - - this.mobileDevice = false; - if (/Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent)) { - this.mobileDevice = true; - } - - this.customOption = this.config.hasOwnProperty("renderOption") && typeof this.config.renderOption === "function"; - this.customSelected = this.config.hasOwnProperty("renderSelection") && typeof this.config.renderSelection === "function"; - - // Enable event emitter - Events.mixin(this); - - build.call(this); - - this.bindEvents(); - - this.update(); - - this.optsRect = util.rect(this.tree); - - this.rendered = true; - - // Fixes macOS Safari bug #28 - if (!this.el.multiple) { - this.el.selectedIndex = this.selectedIndex; - } - - var that = this; - setTimeout(function() { - that.emit("selectr.init"); - }, 20); -}; - -Selectr.prototype.getSelected = function () { - var selected = this.el.querySelectorAll('option:checked'); - return selected; -}; - -Selectr.prototype.getSelectedProperties = function (prop) { - var selected = this.getSelected(); - var values = [].slice.call(selected) - .map(function(option) { return option[prop]; }) - .filter(function(i) { return i!==null && i!==undefined; }); - return values; -}; - -/** - * Attach the required event listeners - */ -Selectr.prototype.bindEvents = function() { - - var that = this; - - this.events = {}; - - this.events.dismiss = dismiss.bind(this); - this.events.navigate = navigate.bind(this); - this.events.reset = this.reset.bind(this); - - if (this.config.nativeDropdown || this.mobileDevice) { - - this.container.addEventListener("touchstart", function(e) { - if (e.changedTouches[0].target === that.el) { - that.toggle(); - } - }); - - if (this.config.nativeDropdown || this.mobileDevice) { - this.container.addEventListener("click", function(e) { - e.preventDefault(); // Jos: Added to prevent emitting clear directly after select - e.stopPropagation(); // Jos: Added to prevent emitting clear directly after select - - if (e.target === that.el) { - that.toggle(); - } - }); - } - - var getChangedOptions = function(last, current) { - var added=[], removed=last.slice(0); - var idx; - for (var i=0; i -1) - removed.splice(idx, 1); - else - added.push(current[i]); - } - return [added, removed]; - }; - - // Listen for the change on the native select - // and update accordingly - this.el.addEventListener("change", function(e) { - if (that.el.multiple) { - var indexes = that.getSelectedProperties('idx'); - var changes = getChangedOptions(that.selectedIndexes, indexes); - - util.each(changes[0], function(i, idx) { - that.select(idx); - }, that); - - util.each(changes[1], function(i, idx) { - that.deselect(idx); - }, that); - - } else { - if (that.el.selectedIndex > -1) { - that.select(that.el.selectedIndex); - } - } - }); - - } - - // Open the dropdown with Enter key if focused - if (this.config.nativeDropdown) { - this.container.addEventListener("keydown", function(e) { - if (e.key === "Enter" && that.selected === document.activeElement) { - // Show the native - that.toggle(); - - // Focus on the native multiselect - setTimeout(function() { - that.el.focus(); - }, 200); - } - }); - } - - // Non-native dropdown - this.selected.addEventListener("click", function(e) { - - if (!that.disabled) { - that.toggle(); - } - - e.preventDefault(); - e.stopPropagation(); // Jos: Added to prevent emitting clear directly after select - }); - - // Remove tag - this.label.addEventListener("click", function(e) { - if (util.hasClass(e.target, "selectr-tag-remove")) { - that.deselect(e.target.parentNode.idx); - } - }); - - // Clear input - if (this.selectClear) { - this.selectClear.addEventListener("click", this.clear.bind(this)); - } - - // Prevent text selection - this.tree.addEventListener("mousedown", function(e) { - e.preventDefault(); - }); - - // Select / deselect items - this.tree.addEventListener("click", function(e) { - e.preventDefault(); // Jos: Added to prevent emitting clear directly after select - e.stopPropagation(); // Jos: Added to prevent emitting clear directly after select - - var item = util.closest(e.target, function(el) { - return el && util.hasClass(el, "selectr-option"); - }); - - if (item) { - if (!util.hasClass(item, "disabled")) { - if (util.hasClass(item, "selected")) { - if (that.el.multiple || !that.el.multiple && that.config.allowDeselect) { - that.deselect(item.idx); - } - } else { - that.select(item.idx); - } - - if (that.opened && !that.el.multiple) { - that.close(); - } - } - } - }); - - // Mouseover list items - this.tree.addEventListener("mouseover", function(e) { - if (util.hasClass(e.target, "selectr-option")) { - if (!util.hasClass(e.target, "disabled")) { - util.removeClass(that.items[that.navIndex], "active"); - - util.addClass(e.target, "active"); - - that.navIndex = [].slice.call(that.items).indexOf(e.target); - } - } - }); - - // Searchable - if (this.config.searchable) { - // Show / hide the search input clear button - - this.input.addEventListener("focus", function(e) { - that.searching = true; - }); - - this.input.addEventListener("blur", function(e) { - that.searching = false; - }); - - this.input.addEventListener("keyup", function(e) { - that.search(); - - if (!that.config.taggable) { - // Show / hide the search input clear button - if (this.value.length) { - util.addClass(this.parentNode, "active"); - } else { - util.removeClass(this.parentNode, "active"); - } - } - }); - - // Clear the search input - this.inputClear.addEventListener("click", function(e) { - that.input.value = null; - clearSearch.call(that); - - if (!that.tree.childElementCount) { - render.call(that); - } - }); - } - - if (this.config.taggable) { - this.input.addEventListener("keyup", function(e) { - - that.search(); - - if (that.config.taggable && this.value.length) { - var val = this.value.trim(); - - if (e.which === 13 || util.includes(that.tagSeperators, e.key)) { - - util.each(that.tagSeperators, function(i, k) { - val = val.replace(k, ''); - }); - - var option = that.add({ - value: val, - text: val, - selected: true - }, true); - - if (!option) { - this.value = ''; - that.setMessage('That tag is already in use.'); - } else { - that.close(); - clearSearch.call(that); - } - } - } - }); - } - - this.update = util.debounce(function() { - // Optionally close dropdown on scroll / resize (#11) - if (that.opened && that.config.closeOnScroll) { - that.close(); - } - if (that.width) { - that.container.style.width = that.width; - } - that.invert(); - }, 50); - - if (this.requiresPagination) { - this.paginateItems = util.debounce(function() { - load.call(this); - }, 50); - - this.tree.addEventListener("scroll", this.paginateItems.bind(this)); - } - - // Dismiss when clicking outside the container - document.addEventListener("click", this.events.dismiss); - window.addEventListener("keydown", this.events.navigate); - - window.addEventListener("resize", this.update); - window.addEventListener("scroll", this.update); - - // Listen for form.reset() (@ambrooks, #13) - if (this.el.form) { - this.el.form.addEventListener("reset", this.events.reset); - } -}; - -/** - * Check for selected options - * @param {bool} reset - */ -Selectr.prototype.setSelected = function(reset) { - - // Select first option as with a native select-one element - #21, #24 - if (!this.config.data && !this.el.multiple && this.el.options.length) { - // Browser has selected the first option by default - if (this.el.selectedIndex === 0) { - if (!this.el.options[0].defaultSelected && !this.config.defaultSelected) { - this.el.selectedIndex = -1; - } - } - - this.selectedIndex = this.el.selectedIndex; - - if (this.selectedIndex > -1) { - this.select(this.selectedIndex); - } - } - - // If we're changing a select-one to select-multiple via the config - // and there are no selected options, the first option will be selected by the browser - // Let's prevent that here. - if (this.config.multiple && this.originalType === "select-one" && !this.config.data) { - if (this.el.options[0].selected && !this.el.options[0].defaultSelected) { - this.el.options[0].selected = false; - } - } - - util.each(this.options, function(i, option) { - if (option.selected && option.defaultSelected) { - this.select(option.idx); - } - }, this); - - if (this.config.selectedValue) { - this.setValue(this.config.selectedValue); - } - - if (this.config.data) { - - - if (!this.el.multiple && this.config.defaultSelected && this.el.selectedIndex < 0) { - this.select(0); - } - - var j = 0; - util.each(this.config.data, function(i, opt) { - // Check for group options - if (isset(opt, "children")) { - util.each(opt.children, function(x, item) { - if (item.hasOwnProperty("selected") && item.selected === true) { - this.select(j); - } - j++; - }, this); - } else { - if (opt.hasOwnProperty("selected") && opt.selected === true) { - this.select(j); - } - j++; - } - }, this); - } -}; - -/** - * Destroy the instance - * @return {void} - */ -Selectr.prototype.destroy = function() { - - if (!this.rendered) return; - - this.emit("selectr.destroy"); - - // Revert to select-single if programtically set to multiple - if (this.originalType === 'select-one') { - this.el.multiple = false; - } - - if (this.config.data) { - this.el.innerHTML = ""; - } - - // Remove the className from select element - util.removeClass(this.el, 'selectr-hidden'); - - // Remove reset listener from parent form - if (this.el.form) { - util.off(this.el.form, "reset", this.events.reset); - } - - // Remove event listeners attached to doc and win - util.off(document, "click", this.events.dismiss); - util.off(document, "keydown", this.events.navigate); - util.off(window, "resize", this.update); - util.off(window, "scroll", this.update); - - // Replace the container with the original select element - this.container.parentNode.replaceChild(this.el, this.container); - - this.rendered = false; -}; - -/** - * Change an options state - * @param {Number} index - * @return {void} - */ -Selectr.prototype.change = function(index) { - var item = this.items[index], - option = this.options[index]; - - if (option.disabled) { - return; - } - - if (option.selected && util.hasClass(item, "selected")) { - this.deselect(index); - } else { - this.select(index); - } - - if (this.opened && !this.el.multiple) { - this.close(); - } -}; - -/** - * Select an option - * @param {Number} index - * @return {void} - */ -Selectr.prototype.select = function(index) { - - var item = this.items[index], - options = [].slice.call(this.el.options), - option = this.options[index]; - - if (this.el.multiple) { - if (util.includes(this.selectedIndexes, index)) { - return false; - } - - if (this.config.maxSelections && this.tags.length === this.config.maxSelections) { - this.setMessage("A maximum of " + this.config.maxSelections + " items can be selected.", true); - return false; - } - - this.selectedValues.push(option.value); - this.selectedIndexes.push(index); - - addTag.call(this, item); - } else { - var data = this.data ? this.data[index] : option; - this.label.innerHTML = this.customSelected ? this.config.renderSelection(data) : option.textContent; - - this.selectedValue = option.value; - this.selectedIndex = index; - - util.each(this.options, function(i, o) { - var opt = this.items[i]; - - if (i !== index) { - if (opt) { - util.removeClass(opt, "selected"); - } - o.selected = false; - o.removeAttribute("selected"); - } - }, this); - } - - if (!util.includes(options, option)) { - this.el.add(option); - } - - item.setAttribute("aria-selected", true); - - util.addClass(item, "selected"); - util.addClass(this.container, "has-selected"); - - option.selected = true; - option.setAttribute("selected", ""); - - this.emit("selectr.change", option); - - this.emit("selectr.select", option); -}; - -/** - * Deselect an option - * @param {Number} index - * @return {void} - */ -Selectr.prototype.deselect = function(index, force) { - var item = this.items[index], - option = this.options[index]; - - if (this.el.multiple) { - var selIndex = this.selectedIndexes.indexOf(index); - this.selectedIndexes.splice(selIndex, 1); - - var valIndex = this.selectedValues.indexOf(option.value); - this.selectedValues.splice(valIndex, 1); - - removeTag.call(this, item); - - if (!this.tags.length) { - util.removeClass(this.container, "has-selected"); - } - } else { - - if (!force && !this.config.clearable && !this.config.allowDeselect) { - return false; - } - - this.label.innerHTML = ""; - this.selectedValue = null; - - this.el.selectedIndex = this.selectedIndex = -1; - - util.removeClass(this.container, "has-selected"); - } - - - this.items[index].setAttribute("aria-selected", false); - - util.removeClass(this.items[index], "selected"); - - option.selected = false; - - option.removeAttribute("selected"); - - this.emit("selectr.change", null); - - this.emit("selectr.deselect", option); -}; - -/** - * Programmatically set selected values - * @param {String|Array} value - A string or an array of strings - */ -Selectr.prototype.setValue = function(value) { - var isArray = Array.isArray(value); - - if (!isArray) { - value = value.toString().trim(); - } - - // Can't pass array to select-one - if (!this.el.multiple && isArray) { - return false; - } - - util.each(this.options, function(i, option) { - if (isArray && util.includes(value.toString(), option.value) || option.value === value) { - this.change(option.idx); - } - }, this); -}; - -/** - * Set the selected value(s) - * @param {bool} toObject Return only the raw values or an object - * @param {bool} toJson Return the object as a JSON string - * @return {mixed} Array or String - */ -Selectr.prototype.getValue = function(toObject, toJson) { - var value; - - if (this.el.multiple) { - if (toObject) { - if (this.selectedIndexes.length) { - value = {}; - value.values = []; - util.each(this.selectedIndexes, function(i, index) { - var option = this.options[index]; - value.values[i] = { - value: option.value, - text: option.textContent - }; - }, this); - } - } else { - value = this.selectedValues.slice(); - } - } else { - if (toObject) { - var option = this.options[this.selectedIndex]; - value = { - value: option.value, - text: option.textContent - }; - } else { - value = this.selectedValue; - } - } - - if (toObject && toJson) { - value = JSON.stringify(value); - } - - return value; -}; - -/** - * Add a new option or options - * @param {object} data - */ -Selectr.prototype.add = function(data, checkDuplicate) { - if (data) { - - this.data = this.data || []; - this.items = this.items || []; - this.options = this.options || []; - - if (Array.isArray(data)) { - // We have an array on items - util.each(data, function(i, obj) { - this.add(obj, checkDuplicate); - }, this); - } - // User passed a single object to the method - // or Selectr passed an object from an array - else if ("[object Object]" === Object.prototype.toString.call(data)) { - - if (checkDuplicate) { - var dupe = false; - - util.each(this.options, function(i, option) { - if (option.value.toLowerCase() === data.value.toLowerCase()) { - dupe = true; - } - }); - - if (dupe) { - return false; - } - } - - var option = util.createElement('option', data); - - this.data.push(data); - - // Add the new option to the list - this.options.push(option); - - // Add the index for later use - option.idx = this.options.length > 0 ? this.options.length - 1 : 0; - - // Create a new item - createItem.call(this, option); - - // Select the item if required - if (data.selected) { - this.select(option.idx); - } - - return option; - } - - // We may have had an empty select so update - // the placeholder to reflect the changes. - this.setPlaceholder(); - - // Recount the pages - if (this.config.pagination) { - this.paginate(); - } - - return true; - } -}; - -/** - * Remove an option or options - * @param {Mixed} o Array, integer (index) or string (value) - * @return {Void} - */ -Selectr.prototype.remove = function(o) { - var options = []; - if (Array.isArray(o)) { - util.each(o, function(i, opt) { - if (util.isInt(opt)) { - options.push(this.getOptionByIndex(opt)); - } else if (typeof o === "string") { - options.push(this.getOptionByValue(opt)); - } - }, this); - - } else if (util.isInt(o)) { - options.push(this.getOptionByIndex(o)); - } else if (typeof o === "string") { - options.push(this.getOptionByValue(o)); - } - - if (options.length) { - var index; - util.each(options, function(i, option) { - index = option.idx; - - // Remove the HTMLOptionElement - this.el.remove(option); - - // Remove the reference from the option array - this.options.splice(index, 1); - - // If the item has a parentNode (group element) it needs to be removed - // otherwise the render function will still append it to the dropdown - var parentNode = this.items[index].parentNode; - - if (parentNode) { - parentNode.removeChild(this.items[index]); - } - - // Remove reference from the items array - this.items.splice(index, 1); - - // Reset the indexes - util.each(this.options, function(i, opt) { - opt.idx = i; - this.items[i].idx = i; - }, this); - }, this); - - // We may have had an empty select now so update - // the placeholder to reflect the changes. - this.setPlaceholder(); - - // Recount the pages - if (this.config.pagination) { - this.paginate(); - } - } -}; - -/** - * Remove all options - */ -Selectr.prototype.removeAll = function() { - - // Clear any selected options - this.clear(true); - - // Remove the HTMLOptionElements - util.each(this.el.options, function(i, option) { - this.el.remove(option); - }, this); - - // Empty the dropdown - util.truncate(this.tree); - - // Reset variables - this.items = []; - this.options = []; - this.data = []; - - this.navIndex = 0; - - if (this.requiresPagination) { - this.requiresPagination = false; - - this.pageIndex = 1; - this.pages = []; - } - - // Update the placeholder - this.setPlaceholder(); -}; - -/** - * Perform a search - * @param {string} query The query string - */ -Selectr.prototype.search = function(string) { - - if (this.navigating) return; - - string = string || this.input.value; - - var f = document.createDocumentFragment(); - - // Remove message - this.removeMessage(); - - // Clear the dropdown - util.truncate(this.tree); - - if (string.length > 1) { - // Check the options for the matching string - util.each(this.options, function(i, option) { - var item = this.items[option.idx]; - var includes = util.includes(option.textContent.toLowerCase(), string.toLowerCase()); - - if (includes && !option.disabled) { - - appendItem(item, f, this.customOption); - - util.removeClass(item, "excluded"); - - // Underline the matching results - if (!this.customOption) { - item.innerHTML = match(string, option); - } - } else { - util.addClass(item, "excluded"); - } - }, this); - - - if (!f.childElementCount) { - if (!this.config.taggable) { - this.setMessage("no results."); - } - } else { - // Highlight top result (@binary-koan #26) - var prevEl = this.items[this.navIndex]; - var firstEl = f.firstElementChild; - - util.removeClass(prevEl, "active"); - - this.navIndex = firstEl.idx; - - util.addClass(firstEl, "active"); - } - - } else { - render.call(this); - } - - this.tree.appendChild(f); -}; - -/** - * Toggle the dropdown - * @return {void} - */ -Selectr.prototype.toggle = function() { - if (!this.disabled) { - if (this.opened) { - this.close(); - } else { - this.open(); - } - } -}; - -/** - * Open the dropdown - * @return {void} - */ -Selectr.prototype.open = function() { - - var that = this; - - if (!this.options.length) { - return false; - } - - if (!this.opened) { - this.emit("selectr.open"); - } - - this.opened = true; - - if (this.mobileDevice || this.config.nativeDropdown) { - util.addClass(this.container, "native-open"); - - if (this.config.data) { - // Dump the options into the select - // otherwise the native dropdown will be empty - util.each(this.options, function(i, option) { - this.el.add(option); - }, this); - } - - return; - } - - util.addClass(this.container, "open"); - - render.call(this); - - this.invert(); - - this.tree.scrollTop = 0; - - util.removeClass(this.container, "notice"); - - this.selected.setAttribute("aria-expanded", true); - - this.tree.setAttribute("aria-hidden", false); - this.tree.setAttribute("aria-expanded", true); - - if (this.config.searchable && !this.config.taggable) { - setTimeout(function() { - that.input.focus(); - // Allow tab focus - that.input.tabIndex = 0; - }, 10); - } -}; - -/** - * Close the dropdown - * @return {void} - */ -Selectr.prototype.close = function() { - - if (this.opened) { - this.emit("selectr.close"); - } - - this.opened = false; - - if (this.mobileDevice || this.config.nativeDropdown) { - util.removeClass(this.container, "native-open"); - return; - } - - var notice = util.hasClass(this.container, "notice"); - - if (this.config.searchable && !notice) { - this.input.blur(); - // Disable tab focus - this.input.tabIndex = -1; - this.searching = false; - } - - if (notice) { - util.removeClass(this.container, "notice"); - this.notice.textContent = ""; - } - - util.removeClass(this.container, "open"); - util.removeClass(this.container, "native-open"); - - this.selected.setAttribute("aria-expanded", false); - - this.tree.setAttribute("aria-hidden", true); - this.tree.setAttribute("aria-expanded", false); - - util.truncate(this.tree); - clearSearch.call(this); -}; - - -/** - * Enable the element - * @return {void} - */ -Selectr.prototype.enable = function() { - this.disabled = false; - this.el.disabled = false; - - this.selected.tabIndex = this.originalIndex; - - if (this.el.multiple) { - util.each(this.tags, function(i, t) { - t.lastElementChild.tabIndex = 0; - }); - } - - util.removeClass(this.container, "selectr-disabled"); -}; - -/** - * Disable the element - * @param {boolean} container Disable the container only (allow value submit with form) - * @return {void} - */ -Selectr.prototype.disable = function(container) { - if (!container) { - this.el.disabled = true; - } - - this.selected.tabIndex = -1; - - if (this.el.multiple) { - util.each(this.tags, function(i, t) { - t.lastElementChild.tabIndex = -1; - }); - } - - this.disabled = true; - util.addClass(this.container, "selectr-disabled"); -}; - - -/** - * Reset to initial state - * @return {void} - */ -Selectr.prototype.reset = function() { - if (!this.disabled) { - this.clear(); - - this.setSelected(true); - - util.each(this.defaultSelected, function(i, idx) { - this.select(idx); - }, this); - - this.emit("selectr.reset"); - } -}; - -/** - * Clear all selections - * @return {void} - */ -Selectr.prototype.clear = function(force) { - - if (this.el.multiple) { - // Loop over the selectedIndexes so we don't have to loop over all the options - // which can be costly if there are a lot of them - - if (this.selectedIndexes.length) { - // Copy the array or we'll get an error - var indexes = this.selectedIndexes.slice(); - - util.each(indexes, function(i, idx) { - this.deselect(idx); - }, this); - } - } else { - if (this.selectedIndex > -1) { - this.deselect(this.selectedIndex, force); - } - } - - this.emit("selectr.clear"); -}; - -/** - * Return serialised data - * @param {boolean} toJson - * @return {mixed} Returns either an object or JSON string - */ -Selectr.prototype.serialise = function(toJson) { - var data = []; - util.each(this.options, function(i, option) { - var obj = { - value: option.value, - text: option.textContent - }; - - if (option.selected) { - obj.selected = true; - } - if (option.disabled) { - obj.disabled = true; - } - data[i] = obj; - }); - - return toJson ? JSON.stringify(data) : data; -}; - -/** - * Localised version of serialise() method - */ -Selectr.prototype.serialize = function(toJson) { - return this.serialise(toJson); -}; - -/** - * Sets the placeholder - * @param {String} placeholder - */ -Selectr.prototype.setPlaceholder = function(placeholder) { - // Set the placeholder - placeholder = placeholder || this.config.placeholder || this.el.getAttribute("placeholder"); - - if (!this.options.length) { - placeholder = "No options available"; - } - - this.placeEl.innerHTML = placeholder; -}; - -/** - * Paginate the option list - * @return {Array} - */ -Selectr.prototype.paginate = function() { - if (this.items.length) { - var that = this; - - this.pages = this.items.map(function(v, i) { - return i % that.config.pagination === 0 ? that.items.slice(i, i + that.config.pagination) : null; - }).filter(function(pages) { - return pages; - }); - - return this.pages; - } -}; - -/** - * Display a message - * @param {String} message The message - */ -Selectr.prototype.setMessage = function(message, close) { - if (close) { - this.close(); - } - util.addClass(this.container, "notice"); - this.notice.textContent = message; -}; - -/** - * Dismiss the current message - */ -Selectr.prototype.removeMessage = function() { - util.removeClass(this.container, "notice"); - this.notice.innerHTML = ""; -}; - -/** - * Keep the dropdown within the window - * @return {void} - */ -Selectr.prototype.invert = function() { - var rt = util.rect(this.selected), - oh = this.tree.parentNode.offsetHeight, - wh = window.innerHeight, - doInvert = rt.top + rt.height + oh > wh; - - if (doInvert) { - util.addClass(this.container, "inverted"); - this.isInverted = true; - } else { - util.removeClass(this.container, "inverted"); - this.isInverted = false; - } - - this.optsRect = util.rect(this.tree); -}; - -/** - * Get an option via it's index - * @param {Integer} index The index of the HTMLOptionElement required - * @return {HTMLOptionElement} - */ -Selectr.prototype.getOptionByIndex = function(index) { - return this.options[index]; -}; - -/** - * Get an option via it's value - * @param {String} value The value of the HTMLOptionElement required - * @return {HTMLOptionElement} - */ -Selectr.prototype.getOptionByValue = function(value) { - var option = false; - - for (var i = 0, l = this.options.length; i < l; i++) { - if (this.options[i].value.trim() === value.toString().trim()) { - option = this.options[i]; - break; - } - } - - return option; -}; - -module.exports = Selectr; diff --git a/src/js/assets/selectr/selectr.scss b/src/js/assets/selectr/selectr.scss deleted file mode 100644 index 8615a28..0000000 --- a/src/js/assets/selectr/selectr.scss +++ /dev/null @@ -1,472 +0,0 @@ -/*! - * Selectr 2.4.0 - * https://github.com/Mobius1/Selectr - * - * Released under the MIT license - */ -.selectr-container { - position: relative; -} - -.selectr-container li { - list-style: none; -} - -.selectr-hidden { - position: absolute; - overflow: hidden; - clip: rect(0px, 0px, 0px, 0px); - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - border: 0 none; -} - -.selectr-visible { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0; - z-index: 11; -} - -.selectr-desktop.multiple .selectr-visible { - display: none; -} - -.selectr-desktop.multiple.native-open .selectr-visible { - top: 100%; - min-height: 200px !important; - height: auto; - opacity: 1; - display: block; -} - -.selectr-container.multiple.selectr-mobile .selectr-selected { - z-index: 0; -} - -.selectr-selected { - position: relative; - z-index: 1; - box-sizing: border-box; - width: 100%; - padding: 7px 28px 7px 14px; - cursor: pointer; - border: 1px solid $jse-grey; - border-radius: 3px; - background-color: $jse-white; -} - -.selectr-selected::before { - position: absolute; - top: 50%; - right: 10px; - width: 0; - height: 0; - content: ''; - -o-transform: rotate(0deg) translate3d(0px, -50%, 0px); - -ms-transform: rotate(0deg) translate3d(0px, -50%, 0px); - -moz-transform: rotate(0deg) translate3d(0px, -50%, 0px); - -webkit-transform: rotate(0deg) translate3d(0px, -50%, 0px); - transform: rotate(0deg) translate3d(0px, -50%, 0px); - border-width: 4px 4px 0 4px; - border-style: solid; - border-color: #6c7a86 transparent transparent; -} - -.selectr-container.open .selectr-selected::before, -.selectr-container.native-open .selectr-selected::before { - border-width: 0 4px 4px 4px; - border-style: solid; - border-color: transparent transparent #6c7a86; -} - -.selectr-label { - display: none; - overflow: hidden; - width: 100%; - white-space: nowrap; - text-overflow: ellipsis; -} - -.selectr-placeholder { - color: #6c7a86; -} - -.selectr-tags { - margin: 0; - padding: 0; - white-space: normal; -} - -.has-selected .selectr-tags { - margin: 0 0 -2px; -} - -.selectr-tag { - list-style: none; - position: relative; - float: left; - padding: 2px 25px 2px 8px; - margin: 0 2px 2px 0; - cursor: default; - color: $jse-white; - border: medium none; - border-radius: 10px; - background: #acb7bf none repeat scroll 0 0; -} - -.selectr-container.multiple.has-selected .selectr-selected { - padding: 5px 28px 5px 5px; -} - -.selectr-options-container { - position: absolute; - z-index: 10000; - top: calc(100% - 1px); - left: 0; - display: none; - box-sizing: border-box; - width: 100%; - border-width: 0 1px 1px; - border-style: solid; - border-color: transparent $jse-grey $jse-grey; - border-radius: 0 0 3px 3px; - background-color: $jse-white; -} - -.selectr-container.open .selectr-options-container { - display: block; -} - -.selectr-input-container { - position: relative; - display: none; -} - -.selectr-clear, -.selectr-input-clear, -.selectr-tag-remove { - position: absolute; - top: 50%; - right: 22px; - width: 20px; - height: 20px; - padding: 0; - cursor: pointer; - -o-transform: translate3d(0px, -50%, 0px); - -ms-transform: translate3d(0px, -50%, 0px); - -moz-transform: translate3d(0px, -50%, 0px); - -webkit-transform: translate3d(0px, -50%, 0px); - transform: translate3d(0px, -50%, 0px); - border: medium none; - background-color: transparent; - z-index: 11; -} - -.selectr-clear, -.selectr-input-clear { - display: none; -} - -.selectr-container.has-selected .selectr-clear, -.selectr-input-container.active .selectr-input-clear { - display: block; -} - -.selectr-selected .selectr-tag-remove { - right: 2px; -} - -.selectr-clear::before, -.selectr-clear::after, -.selectr-input-clear::before, -.selectr-input-clear::after, -.selectr-tag-remove::before, -.selectr-tag-remove::after { - position: absolute; - top: 5px; - left: 9px; - width: 2px; - height: 10px; - content: ' '; - background-color: #6c7a86; -} - -.selectr-tag-remove::before, -.selectr-tag-remove::after { - top: 4px; - width: 3px; - height: 12px; - background-color: $jse-white; -} - -.selectr-clear:before, -.selectr-input-clear::before, -.selectr-tag-remove::before { - -o-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); - transform: rotate(45deg); -} - -.selectr-clear:after, -.selectr-input-clear::after, -.selectr-tag-remove::after { - -o-transform: rotate(-45deg); - -ms-transform: rotate(-45deg); - -moz-transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); -} - -.selectr-input-container.active, -.selectr-input-container.active .selectr-clear { - display: block; -} - -.selectr-input { - top: 5px; - left: 5px; - box-sizing: border-box; - width: calc(100% - 30px); - margin: 10px 15px; - padding: 7px 30px 7px 9px; - border: 1px solid $jse-grey; - border-radius: 3px; -} - -.selectr-notice { - display: none; - box-sizing: border-box; - width: 100%; - padding: 8px 16px; - border-top: 1px solid $jse-grey; - border-radius: 0 0 3px 3px; - background-color: $jse-white; -} - -.selectr-container.notice .selectr-notice { - display: block; -} - -.selectr-container.notice .selectr-selected { - border-radius: 3px 3px 0 0; -} - -.selectr-options { - position: relative; - top: calc(100% + 2px); - display: none; - overflow-x: auto; - overflow-y: scroll; - max-height: 200px; - margin: 0; - padding: 0; -} - -.selectr-container.open .selectr-options, -.selectr-container.open .selectr-input-container, -.selectr-container.notice .selectr-options-container { - display: block; -} - -.selectr-option { - position: relative; - display: block; - padding: 5px 20px; - list-style: outside none none; - cursor: pointer; - font-weight: normal; -} - -.selectr-options.optgroups > .selectr-option { - padding-left: 25px; -} - -.selectr-optgroup { - font-weight: bold; - padding: 0; -} - -.selectr-optgroup--label { - font-weight: bold; - margin-top: 10px; - padding: 5px 15px; -} - -.selectr-match { - text-decoration: underline; -} - -.selectr-option.selected { - background-color: #ddd; -} - -.selectr-option.active { - color: $jse-white; - background-color: #5897fb; -} - -.selectr-option.disabled { - opacity: 0.4; -} - -.selectr-option.excluded { - display: none; -} - -.selectr-container.open .selectr-selected { - border-color: $jse-grey $jse-grey transparent $jse-grey; - border-radius: 3px 3px 0 0; -} - -.selectr-container.open .selectr-selected::after { - -o-transform: rotate(180deg) translate3d(0px, 50%, 0px); - -ms-transform: rotate(180deg) translate3d(0px, 50%, 0px); - -moz-transform: rotate(180deg) translate3d(0px, 50%, 0px); - -webkit-transform: rotate(180deg) translate3d(0px, 50%, 0px); - transform: rotate(180deg) translate3d(0px, 50%, 0px); -} - -.selectr-disabled { - opacity: .6; -} - -.selectr-empty, -.has-selected .selectr-placeholder { - display: none; -} - -.has-selected .selectr-label { - display: block; -} - -/* TAGGABLE */ -.taggable .selectr-selected { - padding: 4px 28px 4px 4px; -} - -.taggable .selectr-selected::after { - display: table; - content: " "; - clear: both; -} - -.taggable .selectr-label { - width: auto; -} - -.taggable .selectr-tags { - float: left; - display: block; -} - -.taggable .selectr-placeholder { - display: none; -} - -.input-tag { - float: left; - min-width: 90px; - width: auto; -} - -.selectr-tag-input { - border: medium none; - padding: 3px 10px; - width: 100%; - font-family: inherit; - font-weight: inherit; - font-size: inherit; -} - -.selectr-input-container.loading::after { - position: absolute; - top: 50%; - right: 20px; - width: 20px; - height: 20px; - content: ''; - -o-transform: translate3d(0px, -50%, 0px); - -ms-transform: translate3d(0px, -50%, 0px); - -moz-transform: translate3d(0px, -50%, 0px); - -webkit-transform: translate3d(0px, -50%, 0px); - transform: translate3d(0px, -50%, 0px); - - -o-transform-origin: 50% 0 0; - -ms-transform-origin: 50% 0 0; - -moz-transform-origin: 50% 0 0; - -webkit-transform-origin: 50% 0 0; - transform-origin: 50% 0 0; - - -moz-animation: 500ms linear 0s normal forwards infinite running spin; - -webkit-animation: 500ms linear 0s normal forwards infinite running spin; - animation: 500ms linear 0s normal forwards infinite running spin; - border-width: 3px; - border-style: solid; - border-color: #aaa #ddd #ddd; - border-radius: 50%; -} - -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg) translate3d(0px, -50%, 0px); - transform: rotate(0deg) translate3d(0px, -50%, 0px); - } - 100% { - -webkit-transform: rotate(360deg) translate3d(0px, -50%, 0px); - transform: rotate(360deg) translate3d(0px, -50%, 0px); - } -} -@keyframes spin { - 0% { - -webkit-transform: rotate(0deg) translate3d(0px, -50%, 0px); - transform: rotate(0deg) translate3d(0px, -50%, 0px); - } - 100% { - -webkit-transform: rotate(360deg) translate3d(0px, -50%, 0px); - transform: rotate(360deg) translate3d(0px, -50%, 0px); - } -} -.selectr-container.open.inverted .selectr-selected { - border-color: transparent $jse-grey $jse-grey; - border-radius: 0 0 3px 3px; -} - -.selectr-container.inverted .selectr-options-container { - border-width: 1px 1px 0; - border-color: $jse-grey $jse-grey transparent; - border-radius: 3px 3px 0 0; - background-color: $jse-white; -} - -.selectr-container.inverted .selectr-options-container { - top: auto; - bottom: calc(100% - 1px); -} - -.selectr-container ::-webkit-input-placeholder { - color: #6c7a86; - opacity: 1; -} - -.selectr-container ::-moz-placeholder { - color: #6c7a86; - opacity: 1; -} - -.selectr-container :-ms-input-placeholder { - color: #6c7a86; - opacity: 1; -} - -.selectr-container ::placeholder { - color: #6c7a86; - opacity: 1; -} diff --git a/src/js/autocomplete.js b/src/js/autocomplete.js deleted file mode 100644 index ada0663..0000000 --- a/src/js/autocomplete.js +++ /dev/null @@ -1,381 +0,0 @@ -'use strict' - -const defaultFilterFunction = { - start: function (token, match, config) { - return match.indexOf(token) === 0 - }, - contain: function (token, match, config) { - return match.indexOf(token) > -1 - } -} - -export function autocomplete (config) { - config = config || {} - config.filter = config.filter || 'start' - config.trigger = config.trigger || 'keydown' - config.confirmKeys = config.confirmKeys || [39, 35, 9] // right, end, tab - config.caseSensitive = config.caseSensitive || false // autocomplete case sensitive - - let fontSize = '' - let fontFamily = '' - - const wrapper = document.createElement('div') - wrapper.style.position = 'relative' - wrapper.style.outline = '0' - wrapper.style.border = '0' - wrapper.style.margin = '0' - wrapper.style.padding = '0' - - const dropDown = document.createElement('div') - dropDown.className = 'autocomplete dropdown' - dropDown.style.position = 'absolute' - dropDown.style.visibility = 'hidden' - - let spacer - let leftSide // <-- it will contain the leftSide part of the textfield (the bit that was already autocompleted) - const createDropDownController = (elem, rs) => { - let rows = [] - let ix = 0 - let oldIndex = -1 - - // TODO: move this styling in JS to SCSS - const onMouseOver = function () { this.style.backgroundColor = '#ddd' } - const onMouseOut = function () { this.style.backgroundColor = '' } - const onMouseDown = function () { p.hide(); p.onmouseselection(this.__hint, p.rs) } - - var p = { - rs: rs, - hide: function () { - elem.style.visibility = 'hidden' - // rs.hideDropDown(); - }, - refresh: function (token, array) { - elem.style.visibility = 'hidden' - ix = 0 - elem.innerHTML = '' - const vph = (window.innerHeight || document.documentElement.clientHeight) - const rect = elem.parentNode.getBoundingClientRect() - const distanceToTop = rect.top - 6 // heuristic give 6px - const distanceToBottom = vph - rect.bottom - 6 // distance from the browser border. - - rows = [] - const filterFn = typeof config.filter === 'function' ? config.filter : defaultFilterFunction[config.filter] - - const filtered = !filterFn ? [] : array.filter(match => filterFn(config.caseSensitive ? token : token.toLowerCase(), config.caseSensitive ? match : match.toLowerCase(), config)) - - rows = filtered.map(row => { - const divRow = document.createElement('div') - divRow.className = 'item' - // divRow.style.color = config.color; - divRow.onmouseover = onMouseOver - divRow.onmouseout = onMouseOut - divRow.onmousedown = onMouseDown - divRow.__hint = row - divRow.innerHTML = row.substring(0, token.length) + '' + row.substring(token.length) + '' - elem.appendChild(divRow) - return divRow - }) - - if (rows.length === 0) { - return // nothing to show. - } - if (rows.length === 1 && ((token.toLowerCase() === rows[0].__hint.toLowerCase() && !config.caseSensitive) || - (token === rows[0].__hint && config.caseSensitive))) { - return // do not show the dropDown if it has only one element which matches what we have just displayed. - } - - if (rows.length < 2) return - p.highlight(0) - - if (distanceToTop > distanceToBottom * 3) { // Heuristic (only when the distance to the to top is 4 times more than distance to the bottom - elem.style.maxHeight = distanceToTop + 'px' // we display the dropDown on the top of the input text - elem.style.top = '' - elem.style.bottom = '100%' - } else { - elem.style.top = '100%' - elem.style.bottom = '' - elem.style.maxHeight = distanceToBottom + 'px' - } - elem.style.visibility = 'visible' - }, - highlight: function (index) { - if (oldIndex !== -1 && rows[oldIndex]) { - rows[oldIndex].className = 'item' - } - rows[index].className = 'item hover' - oldIndex = index - }, - move: function (step) { // moves the selection either up or down (unless it's not possible) step is either +1 or -1. - if (elem.style.visibility === 'hidden') return '' // nothing to move if there is no dropDown. (this happens if the user hits escape and then down or up) - if (ix + step === -1 || ix + step === rows.length) return rows[ix].__hint // NO CIRCULAR SCROLLING. - ix += step - p.highlight(ix) - return rows[ix].__hint// txtShadow.value = uRows[uIndex].__hint ; - }, - onmouseselection: function () { } // it will be overwritten. - } - return p - } - - function setEndOfContenteditable (contentEditableElement) { - let range, selection - if (document.createRange) { - // Firefox, Chrome, Opera, Safari, IE 9+ - range = document.createRange()// Create a range (a range is a like the selection but invisible) - range.selectNodeContents(contentEditableElement)// Select the entire contents of the element with the range - range.collapse(false)// collapse the range to the end point. false means collapse to end rather than the start - selection = window.getSelection()// get the selection object (allows you to change selection) - selection.removeAllRanges()// remove any selections already made - selection.addRange(range)// make the range you have just created the visible selection - } else if (document.selection) { - // IE 8 and lower - range = document.body.createTextRange()// Create a range (a range is a like the selection but invisible) - range.moveToElementText(contentEditableElement)// Select the entire contents of the element with the range - range.collapse(false)// collapse the range to the end point. false means collapse to end rather than the start - range.select()// Select the range (make it the visible selection - } - } - - function calculateWidthForText (text) { - if (spacer === undefined) { // on first call only. - spacer = document.createElement('span') - spacer.style.visibility = 'hidden' - spacer.style.position = 'fixed' - spacer.style.outline = '0' - spacer.style.margin = '0' - spacer.style.padding = '0' - spacer.style.border = '0' - spacer.style.left = '0' - spacer.style.whiteSpace = 'pre' - spacer.style.fontSize = fontSize - spacer.style.fontFamily = fontFamily - spacer.style.fontWeight = 'normal' - document.body.appendChild(spacer) - } - - // Used to encode an HTML string into a plain text. - // taken from http://stackoverflow.com/questions/1219860/javascript-jquery-html-encoding - spacer.innerHTML = String(text).replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>') - return spacer.getBoundingClientRect().right - } - - const rs = { - onArrowDown: function () { }, // defaults to no action. - onArrowUp: function () { }, // defaults to no action. - onEnter: function () { }, // defaults to no action. - onTab: function () { }, // defaults to no action. - startFrom: 0, - options: [], - element: null, - elementHint: null, - elementStyle: null, - wrapper: wrapper, // Only to allow easy access to the HTML elements to the final user (possibly for minor customizations) - show: function (element, startPos, options) { - this.startFrom = startPos - this.wrapper.remove() - if (this.elementHint) { - this.elementHint.remove() - this.elementHint = null - } - - if (fontSize === '') { - fontSize = window.getComputedStyle(element).getPropertyValue('font-size') - } - if (fontFamily === '') { - fontFamily = window.getComputedStyle(element).getPropertyValue('font-family') - } - - dropDown.style.marginLeft = '0' - dropDown.style.marginTop = element.getBoundingClientRect().height + 'px' - this.options = options.map(String) - - if (this.element !== element) { - this.element = element - this.elementStyle = { - zIndex: this.element.style.zIndex, - position: this.element.style.position, - backgroundColor: this.element.style.backgroundColor, - borderColor: this.element.style.borderColor - } - } - - this.element.style.zIndex = 3 - this.element.style.position = 'relative' - this.element.style.backgroundColor = 'transparent' - this.element.style.borderColor = 'transparent' - - this.elementHint = element.cloneNode() - this.elementHint.className = 'autocomplete hint' - this.elementHint.style.zIndex = 2 - this.elementHint.style.position = 'absolute' - this.elementHint.onfocus = () => { this.element.focus() } - - if (this.element.addEventListener) { - this.element.removeEventListener('keydown', keyDownHandler) - this.element.addEventListener('keydown', keyDownHandler, false) - this.element.removeEventListener('blur', onBlurHandler) - this.element.addEventListener('blur', onBlurHandler, false) - } - - wrapper.appendChild(this.elementHint) - wrapper.appendChild(dropDown) - element.parentElement.appendChild(wrapper) - - this.repaint(element) - }, - setText: function (text) { - this.element.innerText = text - }, - getText: function () { - return this.element.innerText - }, - hideDropDown: function () { - this.wrapper.remove() - if (this.elementHint) { - this.elementHint.remove() - this.elementHint = null - dropDownController.hide() - this.element.style.zIndex = this.elementStyle.zIndex - this.element.style.position = this.elementStyle.position - this.element.style.backgroundColor = this.elementStyle.backgroundColor - this.element.style.borderColor = this.elementStyle.borderColor - } - }, - repaint: function (element) { - let text = element.innerText - text = text.replace('\n', '') - - const optionsLength = this.options.length - - // breaking text in leftSide and token. - - const token = text.substring(this.startFrom) - leftSide = text.substring(0, this.startFrom) - - for (let i = 0; i < optionsLength; i++) { - const opt = this.options[i] - if ((!config.caseSensitive && opt.toLowerCase().indexOf(token.toLowerCase()) === 0) || - (config.caseSensitive && opt.indexOf(token) === 0)) { // <-- how about upperCase vs. lowercase - this.elementHint.innerText = leftSide + token + opt.substring(token.length) - this.elementHint.realInnerText = leftSide + opt - break - } - } - // moving the dropDown and refreshing it. - dropDown.style.left = calculateWidthForText(leftSide) + 'px' - dropDownController.refresh(token, this.options) - this.elementHint.style.width = calculateWidthForText(this.elementHint.innerText) + 10 + 'px' - const wasDropDownHidden = (dropDown.style.visibility === 'hidden') - if (!wasDropDownHidden) { this.elementHint.style.width = calculateWidthForText(this.elementHint.innerText) + dropDown.clientWidth + 'px' } - } - } - - var dropDownController = createDropDownController(dropDown, rs) - - var keyDownHandler = function (e) { - // console.log("Keydown:" + e.keyCode); - e = e || window.event - const keyCode = e.keyCode - - if (this.elementHint == null) return - - if (keyCode === 33) { return } // page up (do nothing) - if (keyCode === 34) { return } // page down (do nothing); - - if (keyCode === 27) { // escape - rs.hideDropDown() - rs.element.focus() - e.preventDefault() - e.stopPropagation() - return - } - - let text = this.element.innerText - text = text.replace('\n', '') - - if (config.confirmKeys.indexOf(keyCode) >= 0) { // (autocomplete triggered) - if (keyCode === 9) { - if (this.elementHint.innerText.length === 0) { - rs.onTab() - } - } - if (this.elementHint.innerText.length > 0) { // if there is a hint - if (this.element.innerText !== this.elementHint.realInnerText) { - this.element.innerText = this.elementHint.realInnerText - rs.hideDropDown() - setEndOfContenteditable(this.element) - if (keyCode === 9) { - rs.element.focus() - e.preventDefault() - e.stopPropagation() - } - } - } - return - } - - if (keyCode === 13) { // enter (autocomplete triggered) - if (this.elementHint.innerText.length === 0) { // if there is a hint - rs.onEnter() - } else { - const wasDropDownHidden = (dropDown.style.visibility === 'hidden') - dropDownController.hide() - - if (wasDropDownHidden) { - rs.hideDropDown() - rs.element.focus() - rs.onEnter() - return - } - - this.element.innerText = this.elementHint.realInnerText - rs.hideDropDown() - setEndOfContenteditable(this.element) - e.preventDefault() - e.stopPropagation() - } - return - } - - if (keyCode === 40) { // down - const token = text.substring(this.startFrom) - const m = dropDownController.move(+1) - if (m === '') { rs.onArrowDown() } - this.elementHint.innerText = leftSide + token + m.substring(token.length) - this.elementHint.realInnerText = leftSide + m - e.preventDefault() - e.stopPropagation() - return - } - - if (keyCode === 38) { // up - const token = text.substring(this.startFrom) - const m = dropDownController.move(-1) - if (m === '') { rs.onArrowUp() } - this.elementHint.innerText = leftSide + token + m.substring(token.length) - this.elementHint.realInnerText = leftSide + m - e.preventDefault() - e.stopPropagation() - } - }.bind(rs) - - var onBlurHandler = e => { - rs.hideDropDown() - // console.log("Lost focus."); - } - - dropDownController.onmouseselection = (text, rs) => { - rs.element.innerText = rs.elementHint.innerText = leftSide + text - rs.hideDropDown() - window.setTimeout(() => { - rs.element.focus() - setEndOfContenteditable(rs.element) - }, 1) - } - - return rs -} diff --git a/src/js/constants.js b/src/js/constants.js deleted file mode 100644 index ef4ab3e..0000000 --- a/src/js/constants.js +++ /dev/null @@ -1,5 +0,0 @@ - -export const DEFAULT_MODAL_ANCHOR = document.body -export const SIZE_LARGE = 10 * 1024 * 1024 // 10 MB -export const MAX_PREVIEW_CHARACTERS = 20000 -export const PREVIEW_HISTORY_LIMIT = 2 * 1024 * 1024 * 1024 // 2 GB diff --git a/src/js/createAbsoluteAnchor.js b/src/js/createAbsoluteAnchor.js deleted file mode 100644 index 3963fb6..0000000 --- a/src/js/createAbsoluteAnchor.js +++ /dev/null @@ -1,99 +0,0 @@ -import { isChildOf, removeEventListener, addEventListener } from './util' - -/** - * Create an anchor element absolutely positioned in the `parent` - * element. - * @param {HTMLElement} anchor - * @param {HTMLElement} parent - * @param {function(HTMLElement)} [onDestroy] Callback when the anchor is destroyed - * @param {boolean} [destroyOnMouseOut=false] If true, anchor will be removed on mouse out - * @returns {HTMLElement} - */ -export function createAbsoluteAnchor (anchor, parent, onDestroy, destroyOnMouseOut = false) { - const root = getRootNode(anchor) - const eventListeners = {} - - const anchorRect = anchor.getBoundingClientRect() - const parentRect = parent.getBoundingClientRect() - - const absoluteAnchor = document.createElement('div') - absoluteAnchor.className = 'jsoneditor-anchor' - absoluteAnchor.style.position = 'absolute' - absoluteAnchor.style.left = (anchorRect.left - parentRect.left) + 'px' - absoluteAnchor.style.top = (anchorRect.top - parentRect.top) + 'px' - absoluteAnchor.style.width = (anchorRect.width - 2) + 'px' - absoluteAnchor.style.height = (anchorRect.height - 2) + 'px' - absoluteAnchor.style.boxSizing = 'border-box' - parent.appendChild(absoluteAnchor) - - function destroy () { - // remove temporary absolutely positioned anchor - if (absoluteAnchor && absoluteAnchor.parentNode) { - absoluteAnchor.parentNode.removeChild(absoluteAnchor) - - // remove all event listeners - // all event listeners are supposed to be attached to document. - for (const name in eventListeners) { - if (hasOwnProperty(eventListeners, name)) { - const fn = eventListeners[name] - if (fn) { - removeEventListener(root, name, fn) - } - delete eventListeners[name] - } - } - - if (typeof onDestroy === 'function') { - onDestroy(anchor) - } - } - } - - function isOutside (target) { - return (target !== absoluteAnchor) && !isChildOf(target, absoluteAnchor) - } - - // create and attach event listeners - function destroyIfOutside (event) { - if (isOutside(event.target)) { - destroy() - } - } - - eventListeners.mousedown = addEventListener(root, 'mousedown', destroyIfOutside) - eventListeners.mousewheel = addEventListener(root, 'mousewheel', destroyIfOutside) - - if (destroyOnMouseOut) { - let destroyTimer = null - - absoluteAnchor.onmouseover = () => { - clearTimeout(destroyTimer) - destroyTimer = null - } - - absoluteAnchor.onmouseout = () => { - if (!destroyTimer) { - destroyTimer = setTimeout(destroy, 200) - } - } - } - - absoluteAnchor.destroy = destroy - - return absoluteAnchor -} - -/** - * Node.getRootNode shim - * @param {HTMLElement} node node to check - * @return {HTMLElement} node's rootNode or `window` if there is ShadowDOM is not supported. - */ -function getRootNode (node) { - return (typeof node.getRootNode === 'function') - ? node.getRootNode() - : window -} - -function hasOwnProperty (object, key) { - return Object.prototype.hasOwnProperty.call(object, key) -} diff --git a/src/js/generated/.gitignore b/src/js/generated/.gitignore deleted file mode 100644 index f59ec20..0000000 --- a/src/js/generated/.gitignore +++ /dev/null @@ -1 +0,0 @@ -* \ No newline at end of file diff --git a/src/js/header.js b/src/js/header.js deleted file mode 100644 index c4f36da..0000000 --- a/src/js/header.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - * jsoneditor.js - * - * @brief - * JSONEditor is a web-based tool to view, edit, format, and validate JSON. - * It has various modes such as a tree editor, a code editor, and a plain text - * editor. - * - * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+ - * - * @license - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * Copyright (c) 2011-2020 Jos de Jong, http://jsoneditoronline.org - * - * @author Jos de Jong, - * @version @@version - * @date @@date - */ diff --git a/src/js/i18n.js b/src/js/i18n.js deleted file mode 100644 index 0a65ea0..0000000 --- a/src/js/i18n.js +++ /dev/null @@ -1,598 +0,0 @@ -'use strict' - -/* eslint-disable no-template-curly-in-string */ - -import './polyfills' - -const _locales = ['en', 'pt-BR', 'zh-CN', 'tr', 'ja', 'fr-FR'] -const _defs = { - en: { - array: 'Array', - auto: 'Auto', - appendText: 'Append', - appendTitle: 'Append a new field with type \'auto\' after this field (Ctrl+Shift+Ins)', - appendSubmenuTitle: 'Select the type of the field to be appended', - appendTitleAuto: 'Append a new field with type \'auto\' (Ctrl+Shift+Ins)', - ascending: 'Ascending', - ascendingTitle: 'Sort the childs of this ${type} in ascending order', - actionsMenu: 'Click to open the actions menu (Ctrl+M)', - cannotParseFieldError: 'Cannot parse field into JSON', - cannotParseValueError: 'Cannot parse value into JSON', - collapseAll: 'Collapse all fields', - compactTitle: 'Compact JSON data, remove all whitespaces (Ctrl+Shift+\\)', - descending: 'Descending', - descendingTitle: 'Sort the childs of this ${type} in descending order', - drag: 'Drag to move this field (Alt+Shift+Arrows)', - duplicateKey: 'duplicate key', - duplicateText: 'Duplicate', - duplicateTitle: 'Duplicate selected fields (Ctrl+D)', - duplicateField: 'Duplicate this field (Ctrl+D)', - duplicateFieldError: 'Duplicate field name', - empty: 'empty', - expandAll: 'Expand all fields', - expandTitle: 'Click to expand/collapse this field (Ctrl+E). \n' + - 'Ctrl+Click to expand/collapse including all childs.', - formatTitle: 'Format JSON data, with proper indentation and line feeds (Ctrl+\\)', - insert: 'Insert', - insertTitle: 'Insert a new field with type \'auto\' before this field (Ctrl+Ins)', - insertSub: 'Select the type of the field to be inserted', - object: 'Object', - ok: 'Ok', - redo: 'Redo (Ctrl+Shift+Z)', - removeText: 'Remove', - removeTitle: 'Remove selected fields (Ctrl+Del)', - removeField: 'Remove this field (Ctrl+Del)', - repairTitle: 'Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.', - searchTitle: 'Search fields and values', - searchNextResultTitle: 'Next result (Enter)', - searchPreviousResultTitle: 'Previous result (Shift + Enter)', - selectNode: 'Select a node...', - showAll: 'show all', - showMore: 'show more', - showMoreStatus: 'displaying ${visibleChilds} of ${totalChilds} items.', - sort: 'Sort', - sortTitle: 'Sort the childs of this ${type}', - sortTitleShort: 'Sort contents', - sortFieldLabel: 'Field:', - sortDirectionLabel: 'Direction:', - sortFieldTitle: 'Select the nested field by which to sort the array or object', - sortAscending: 'Ascending', - sortAscendingTitle: 'Sort the selected field in ascending order', - sortDescending: 'Descending', - sortDescendingTitle: 'Sort the selected field in descending order', - string: 'String', - transform: 'Transform', - transformTitle: 'Filter, sort, or transform the childs of this ${type}', - transformTitleShort: 'Filter, sort, or transform contents', - extract: 'Extract', - extractTitle: 'Extract this ${type}', - transformQueryTitle: 'Enter a JMESPath query', - transformWizardLabel: 'Wizard', - transformWizardFilter: 'Filter', - transformWizardSortBy: 'Sort by', - transformWizardSelectFields: 'Select fields', - transformQueryLabel: 'Query', - transformPreviewLabel: 'Preview', - type: 'Type', - typeTitle: 'Change the type of this field', - openUrl: 'Ctrl+Click or Ctrl+Enter to open url in new window', - undo: 'Undo last action (Ctrl+Z)', - validationCannotMove: 'Cannot move a field into a child of itself', - autoType: 'Field type "auto". ' + - 'The field type is automatically determined from the value ' + - 'and can be a string, number, boolean, or null.', - objectType: 'Field type "object". ' + - 'An object contains an unordered set of key/value pairs.', - arrayType: 'Field type "array". ' + - 'An array contains an ordered collection of values.', - stringType: 'Field type "string". ' + - 'Field type is not determined from the value, ' + - 'but always returned as string.', - modeEditorTitle: 'Switch Editor Mode', - modeCodeText: 'Code', - modeCodeTitle: 'Switch to code highlighter', - modeFormText: 'Form', - modeFormTitle: 'Switch to form editor', - modeTextText: 'Text', - modeTextTitle: 'Switch to plain text editor', - modeTreeText: 'Tree', - modeTreeTitle: 'Switch to tree editor', - modeViewText: 'View', - modeViewTitle: 'Switch to tree view', - modePreviewText: 'Preview', - modePreviewTitle: 'Switch to preview mode', - examples: 'Examples', - default: 'Default' - }, - 'zh-CN': { - array: '数组', - auto: '自动', - appendText: '追加', - appendTitle: '在此字段后追加一个类型为“auto”的新字段 (Ctrl+Shift+Ins)', - appendSubmenuTitle: '选择要追加的字段类型', - appendTitleAuto: '追加类型为“auto”的新字段 (Ctrl+Shift+Ins)', - ascending: '升序', - ascendingTitle: '升序排列${type}的子节点', - actionsMenu: '点击打开动作菜单(Ctrl+M)', - cannotParseFieldError: '无法将字段解析为JSON', - cannotParseValueError: '无法将值解析为JSON', - collapseAll: '缩进所有字段', - compactTitle: '压缩JSON数据,删除所有空格 (Ctrl+Shift+\\)', - descending: '降序', - descendingTitle: '降序排列${type}的子节点', - drag: '拖拽移动该节点(Alt+Shift+Arrows)', - duplicateKey: '重复键', - duplicateText: '复制', - duplicateTitle: '复制选中字段(Ctrl+D)', - duplicateField: '复制该字段(Ctrl+D)', - duplicateFieldError: '重复的字段名称', - empty: '清空', - expandAll: '展开所有字段', - expandTitle: '点击 展开/收缩 该字段(Ctrl+E). \n' + - 'Ctrl+Click 展开/收缩 包含所有子节点.', - formatTitle: '使用适当的缩进和换行符格式化JSON数据 (Ctrl+\\)', - insert: '插入', - insertTitle: '在此字段前插入类型为“auto”的新字段 (Ctrl+Ins)', - insertSub: '选择要插入的字段类型', - object: '对象', - ok: 'Ok', - redo: '重做 (Ctrl+Shift+Z)', - removeText: '移除', - removeTitle: '移除选中字段 (Ctrl+Del)', - removeField: '移除该字段 (Ctrl+Del)', - repairTitle: '修复JSON:修复引号和转义符,删除注释和JSONP表示法,将JavaScript对象转换为JSON。', - selectNode: '选择一个节点...', - showAll: '展示全部', - showMore: '展示更多', - showMoreStatus: '显示${totalChilds}的${visibleChilds}项目.', - sort: '排序', - sortTitle: '排序${type}的子节点', - sortTitleShort: '内容排序', - sortFieldLabel: '字段:', - sortDirectionLabel: '方向:', - sortFieldTitle: '选择用于对数组或对象排序的嵌套字段', - sortAscending: '升序排序', - sortAscendingTitle: '按照该字段升序排序', - sortDescending: '降序排序', - sortDescendingTitle: '按照该字段降序排序', - string: '字符串', - transform: '变换', - transformTitle: '筛选,排序,或者转换${type}的子节点', - transformTitleShort: '筛选,排序,或者转换内容', - extract: '提取', - extractTitle: '提取这个 ${type}', - transformQueryTitle: '输入JMESPath查询', - transformWizardLabel: '向导', - transformWizardFilter: '筛选', - transformWizardSortBy: '排序', - transformWizardSelectFields: '选择字段', - transformQueryLabel: '查询', - transformPreviewLabel: '预览', - type: '类型', - typeTitle: '更改字段类型', - openUrl: 'Ctrl+Click 或者 Ctrl+Enter 在新窗口打开链接', - undo: '撤销上次动作 (Ctrl+Z)', - validationCannotMove: '无法将字段移入其子节点', - autoType: '字段类型 "auto". ' + - '字段类型由值自动确定 ' + - '可以为 string,number,boolean,或者 null.', - objectType: '字段类型 "object". ' + - '对象包含一组无序的键/值对.', - arrayType: '字段类型 "array". ' + - '数组包含值的有序集合.', - stringType: '字段类型 "string". ' + - '字段类型由值自动确定,' + - '但始终作为字符串返回.', - modeCodeText: '代码', - modeCodeTitle: '切换至代码高亮', - modeFormText: '表单', - modeFormTitle: '切换至表单编辑', - modeTextText: '文本', - modeTextTitle: '切换至文本编辑', - modeTreeText: '树', - modeTreeTitle: '切换至树编辑', - modeViewText: '视图', - modeViewTitle: '切换至树视图', - modePreviewText: '预览', - modePreviewTitle: '切换至预览模式', - examples: '例子', - default: '缺省' - }, - 'pt-BR': { - array: 'Lista', - auto: 'Automatico', - appendText: 'Adicionar', - appendTitle: 'Adicionar novo campo com tipo \'auto\' depois deste campo (Ctrl+Shift+Ins)', - appendSubmenuTitle: 'Selecione o tipo do campo a ser adicionado', - appendTitleAuto: 'Adicionar novo campo com tipo \'auto\' (Ctrl+Shift+Ins)', - ascending: 'Ascendente', - ascendingTitle: 'Organizar filhor do tipo ${type} em crescente', - actionsMenu: 'Clique para abrir o menu de ações (Ctrl+M)', - cannotParseFieldError: 'Não é possível analisar o campo no JSON', - cannotParseValueError: 'Não é possível analisar o valor em JSON', - collapseAll: 'Fechar todos campos', - compactTitle: 'Dados JSON compactos, remova todos os espaços em branco (Ctrl+Shift+\\)', - descending: 'Descendente', - descendingTitle: 'Organizar o filhos do tipo ${type} em decrescente', - duplicateKey: 'chave duplicada', - drag: 'Arraste para mover este campo (Alt+Shift+Arrows)', - duplicateText: 'Duplicar', - duplicateTitle: 'Duplicar campos selecionados (Ctrl+D)', - duplicateField: 'Duplicar este campo (Ctrl+D)', - duplicateFieldError: 'Nome do campo duplicado', - empty: 'vazio', - expandAll: 'Expandir todos campos', - expandTitle: 'Clique para expandir/encolher este campo (Ctrl+E). \n' + - 'Ctrl+Click para expandir/encolher incluindo todos os filhos.', - formatTitle: 'Formate dados JSON, com recuo e feeds de linha adequados (Ctrl+\\)', - insert: 'Inserir', - insertTitle: 'Inserir um novo campo do tipo \'auto\' antes deste campo (Ctrl+Ins)', - insertSub: 'Selecionar o tipo de campo a ser inserido', - object: 'Objeto', - ok: 'Ok', - redo: 'Refazer (Ctrl+Shift+Z)', - removeText: 'Remover', - removeTitle: 'Remover campos selecionados (Ctrl+Del)', - removeField: 'Remover este campo (Ctrl+Del)', - repairTitle: 'Repare JSON: corrija aspas e caracteres de escape, remova comentários e notação JSONP, transforme objetos JavaScript em JSON.', - selectNode: 'Selecione um nódulo...', - showAll: 'mostrar todos', - showMore: 'mostrar mais', - showMoreStatus: 'exibindo ${visibleChilds} de ${totalChilds} itens.', - sort: 'Organizar', - sortTitle: 'Organizar os filhos deste ${type}', - sortTitleShort: 'Organizar os filhos', - sortFieldLabel: 'Campo:', - sortDirectionLabel: 'Direção:', - sortFieldTitle: 'Selecione um campo filho pelo qual ordenar o array ou objeto', - sortAscending: 'Ascendente', - sortAscendingTitle: 'Ordenar o campo selecionado por ordem ascendente', - sortDescending: 'Descendente', - sortDescendingTitle: 'Ordenar o campo selecionado por ordem descendente', - string: 'Texto', - transform: 'Transformar', - transformTitle: 'Filtrar, ordenar ou transformar os filhos deste ${type}', - transformTitleShort: 'Filtrar, ordenar ou transformar conteúdos', - transformQueryTitle: 'Insira uma expressão JMESPath', - transformWizardLabel: 'Assistente', - transformWizardFilter: 'Filtro', - transformWizardSortBy: 'Ordenar por', - transformWizardSelectFields: 'Selecionar campos', - transformQueryLabel: 'Expressão', - transformPreviewLabel: 'Visualizar', - type: 'Tipo', - typeTitle: 'Mudar o tipo deste campo', - openUrl: 'Ctrl+Click ou Ctrl+Enter para abrir link em nova janela', - undo: 'Desfazer último ação (Ctrl+Z)', - validationCannotMove: 'Não pode mover um campo como filho dele mesmo', - autoType: 'Campo do tipo "auto". ' + - 'O tipo do campo é determinao automaticamente a partir do seu valor ' + - 'e pode ser texto, número, verdade/falso ou nulo.', - objectType: 'Campo do tipo "objeto". ' + - 'Um objeto contém uma lista de pares com chave e valor.', - arrayType: 'Campo do tipo "lista". ' + - 'Uma lista contem uma coleção de valores ordenados.', - stringType: 'Campo do tipo "string". ' + - 'Campo do tipo nao é determinado através do seu valor, ' + - 'mas sempre retornara um texto.', - examples: 'Exemplos', - default: 'Revelia' - }, - tr: { - array: 'Dizin', - auto: 'Otomatik', - appendText: 'Ekle', - appendTitle: 'Bu alanın altına \'otomatik\' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)', - appendSubmenuTitle: 'Eklenecek alanın tipini seç', - appendTitleAuto: '\'Otomatik\' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)', - ascending: 'Artan', - ascendingTitle: '${type}\'ın alt tiplerini artan düzende sırala', - actionsMenu: 'Aksiyon menüsünü açmak için tıklayın (Ctrl+M)', - collapseAll: 'Tüm alanları kapat', - descending: 'Azalan', - descendingTitle: '${type}\'ın alt tiplerini azalan düzende sırala', - drag: 'Bu alanı taşımak için sürükleyin (Alt+Shift+Arrows)', - duplicateKey: 'Var olan anahtar', - duplicateText: 'Aşağıya kopyala', - duplicateTitle: 'Seçili alanlardan bir daha oluştur (Ctrl+D)', - duplicateField: 'Bu alandan bir daha oluştur (Ctrl+D)', - duplicateFieldError: 'Duplicate field name', - cannotParseFieldError: 'Alan JSON\'a ayrıştırılamıyor', - cannotParseValueError: 'JSON\'a değer ayrıştırılamıyor', - empty: 'boş', - expandAll: 'Tüm alanları aç', - expandTitle: 'Bu alanı açmak/kapatmak için tıkla (Ctrl+E). \n' + - 'Alt alanlarda dahil tüm alanları açmak için Ctrl+Click ', - insert: 'Ekle', - insertTitle: 'Bu alanın üstüne \'otomatik\' tipinde yeni bir alan ekle (Ctrl+Ins)', - insertSub: 'Araya eklenecek alanın tipini seç', - object: 'Nesne', - ok: 'Tamam', - redo: 'Yeniden yap (Ctrl+Shift+Z)', - removeText: 'Kaldır', - removeTitle: 'Seçilen alanları kaldır (Ctrl+Del)', - removeField: 'Bu alanı kaldır (Ctrl+Del)', - selectNode: 'Bir nesne seç...', - showAll: 'tümünü göster', - showMore: 'daha fazla göster', - showMoreStatus: '${totalChilds} alanın ${visibleChilds} alt alanları gösteriliyor', - sort: 'Sırala', - sortTitle: '${type}\'ın alt alanlarını sırala', - sortTitleShort: 'İçerikleri sırala', - sortFieldLabel: 'Alan:', - sortDirectionLabel: 'Yön:', - sortFieldTitle: 'Diziyi veya nesneyi sıralamak için iç içe geçmiş alanı seçin', - sortAscending: 'Artan', - sortAscendingTitle: 'Seçili alanı artan düzende sırala', - sortDescending: 'Azalan', - sortDescendingTitle: 'Seçili alanı azalan düzende sırala', - string: 'Karakter Dizisi', - transform: 'Dönüştür', - transformTitle: '${type}\'ın alt alanlarını filtrele, sırala veya dönüştür', - transformTitleShort: 'İçerikleri filterele, sırala veya dönüştür', - transformQueryTitle: 'JMESPath sorgusu gir', - transformWizardLabel: 'Sihirbaz', - transformWizardFilter: 'Filtre', - transformWizardSortBy: 'Sırala', - transformWizardSelectFields: 'Alanları seç', - transformQueryLabel: 'Sorgu', - transformPreviewLabel: 'Önizleme', - type: 'Tip', - typeTitle: 'Bu alanın tipini değiştir', - openUrl: 'URL\'i yeni bir pencerede açmak için Ctrl+Click veya Ctrl+Enter', - undo: 'Son değişikliği geri al (Ctrl+Z)', - validationCannotMove: 'Alt alan olarak taşınamıyor', - autoType: 'Alan tipi "otomatik". ' + - 'Alan türü otomatik olarak değerden belirlenir' + - 've bir dize, sayı, boolean veya null olabilir.', - objectType: 'Alan tipi "nesne". ' + - 'Bir nesne, sıralanmamış bir anahtar / değer çifti kümesi içerir.', - arrayType: 'Alan tipi "dizi". ' + - 'Bir dizi, düzenli değerler koleksiyonu içerir.', - stringType: 'Alan tipi "karakter dizisi". ' + - 'Alan türü değerden belirlenmez,' + - 'ancak her zaman karakter dizisi olarak döndürülür.', - modeCodeText: 'Kod', - modeCodeTitle: 'Kod vurgulayıcıya geç', - modeFormText: 'Form', - modeFormTitle: 'Form düzenleyiciye geç', - modeTextText: 'Metin', - modeTextTitle: 'Düz metin düzenleyiciye geç', - modeTreeText: 'Ağaç', - modeTreeTitle: 'Ağaç düzenleyiciye geç', - modeViewText: 'Görünüm', - modeViewTitle: 'Ağaç görünümüne geç', - examples: 'Örnekler', - default: 'Varsayılan' - }, - ja: { - array: '配列', - auto: 'オート', - appendText: '追加', - appendTitle: '次のフィールドに"オート"のフィールドを追加 (Ctrl+Shift+Ins)', - appendSubmenuTitle: '追加するフィールドの型を選択してください', - appendTitleAuto: '"オート"のフィールドを追加 (Ctrl+Shift+Ins)', - ascending: '昇順', - ascendingTitle: '${type}の子要素を昇順に並べ替え', - actionsMenu: 'クリックしてアクションメニューを開く (Ctrl+M)', - collapseAll: 'すべてを折りたたむ', - descending: '降順', - descendingTitle: '${type}の子要素を降順に並べ替え', - drag: 'ドラッグして選択中のフィールドを移動 (Alt+Shift+Arrows)', - duplicateKey: '複製キー', - duplicateText: '複製', - duplicateTitle: '選択中のフィールドを複製 (Ctrl+D)', - duplicateField: '選択中のフィールドを複製 (Ctrl+D)', - duplicateFieldError: 'フィールド名が重複しています', - cannotParseFieldError: 'JSONのフィールドを解析できません', - cannotParseValueError: 'JSONの値を解析できません', - empty: '空', - expandAll: 'すべてを展開', - expandTitle: 'クリックしてフィールドを展開/折りたたむ (Ctrl+E). \n' + - 'Ctrl+Click ですべての子要素を展開/折りたたむ', - insert: '挿入', - insertTitle: '選択中のフィールドの前に新しいフィールドを挿入 (Ctrl+Ins)', - insertSub: '挿入するフィールドの型を選択', - object: 'オブジェクト', - ok: '実行', - redo: 'やり直す (Ctrl+Shift+Z)', - removeText: '削除', - removeTitle: '選択中のフィールドを削除 (Ctrl+Del)', - removeField: '選択中のフィールドを削除 (Ctrl+Del)', - selectNode: 'ノードを選択...', - showAll: 'すべてを表示', - showMore: 'もっと見る', - showMoreStatus: '${totalChilds}個のアイテムのうち ${visibleChilds}個を表示しています。', - sort: '並べ替え', - sortTitle: '${type}の子要素を並べ替え', - sortTitleShort: '並べ替え', - sortFieldLabel: 'フィールド:', - sortDirectionLabel: '順序:', - sortFieldTitle: '配列またはオブジェクトを並び替えるためのフィールドを選択', - sortAscending: '昇順', - sortAscendingTitle: '選択中のフィールドを昇順に並び替え', - sortDescending: '降順', - sortDescendingTitle: '選択中のフィールドを降順に並び替え', - string: '文字列', - transform: '変換', - transformTitle: '${type}の子要素をフィルター・並び替え・変換する', - transformTitleShort: '内容をフィルター・並び替え・変換する', - extract: '抽出', - extractTitle: '${type}を抽出', - transformQueryTitle: 'JMESPathクエリを入力', - transformWizardLabel: 'ウィザード', - transformWizardFilter: 'フィルター', - transformWizardSortBy: '並び替え', - transformWizardSelectFields: 'フィールドを選択', - transformQueryLabel: 'クエリ', - transformPreviewLabel: 'プレビュー', - type: '型', - typeTitle: '選択中のフィールドの型を変更', - openUrl: 'Ctrl+Click または Ctrl+Enter で 新規ウィンドウでURLを開く', - undo: '元に戻す (Ctrl+Z)', - validationCannotMove: '子要素に移動できません ', - autoType: 'オート: ' + - 'フィールドの型は値から自動的に決定されます。 ' + - '(文字列・数値・ブール・null)', - objectType: 'オブジェクト: ' + - 'オブジェクトは順序が決まっていないキーと値のペア組み合わせです。', - arrayType: '配列: ' + - '配列は順序が決まっている値の集合体です。', - stringType: '文字列: ' + - 'フィールド型は値から決定されませんが、' + - '常に文字列として返されます。', - modeCodeText: 'コードモード', - modeCodeTitle: 'ハイライトモードに切り替え', - modeFormText: 'フォームモード', - modeFormTitle: 'フォームモードに切り替え', - modeTextText: 'テキストモード', - modeTextTitle: 'テキストモードに切り替え', - modeTreeText: 'ツリーモード', - modeTreeTitle: 'ツリーモードに切り替え', - modeViewText: 'ビューモード', - modeViewTitle: 'ビューモードに切り替え', - modePreviewText: 'プレビュー', - modePreviewTitle: 'プレビューに切り替え', - examples: '例', - default: 'デフォルト' - }, - 'fr-FR': { - array: 'Liste', - auto: 'Auto', - appendText: 'Ajouter', - appendTitle: 'Ajouter un champ de type \'auto\' après ce champ (Ctrl+Shift+Ins)', - appendSubmenuTitle: 'Sélectionner le type du champ à ajouter', - appendTitleAuto: 'Ajouter un champ de type \'auto\' (Ctrl+Shift+Ins)', - ascending: 'Ascendant', - ascendingTitle: 'Trier les enfants de ce ${type} par ordre ascendant', - actionsMenu: 'Ouvrir le menu des actions (Ctrl+M)', - collapseAll: 'Regrouper', - descending: 'Descendant', - descendingTitle: 'Trier les enfants de ce ${type} par ordre descendant', - drag: 'Déplacer (Alt+Shift+Arrows)', - duplicateKey: 'Dupliquer la clé', - duplicateText: 'Dupliquer', - duplicateTitle: 'Dupliquer les champs sélectionnés (Ctrl+D)', - duplicateField: 'Dupliquer ce champ (Ctrl+D)', - duplicateFieldError: 'Dupliquer le nom de champ', - cannotParseFieldError: 'Champ impossible à parser en JSON', - cannotParseValueError: 'Valeur impossible à parser en JSON', - empty: 'vide', - expandAll: 'Étendre', - expandTitle: 'Étendre/regrouper ce champ (Ctrl+E). \n' + - 'Ctrl+Click pour étendre/regrouper avec tous les champs.', - insert: 'Insérer', - insertTitle: 'Insérer un champ de type \'auto\' avant ce champ (Ctrl+Ins)', - insertSub: 'Sélectionner le type de champ à insérer', - object: 'Objet', - ok: 'Ok', - redo: 'Rejouer (Ctrl+Shift+Z)', - removeText: 'Supprimer', - removeTitle: 'Supprimer les champs sélectionnés (Ctrl+Del)', - removeField: 'Supprimer ce champ (Ctrl+Del)', - searchTitle: 'Rechercher champs et valeurs', - searchNextResultTitle: 'Résultat suivant (Enter)', - searchPreviousResultTitle: 'Résultat précédent (Shift + Enter)', - selectNode: 'Sélectionner un nœud...', - showAll: 'voir tout', - showMore: 'voir plus', - showMoreStatus: '${visibleChilds} éléments affichés de ${totalChilds}.', - sort: 'Trier', - sortTitle: 'Trier les champs de ce ${type}', - sortTitleShort: 'Trier', - sortFieldLabel: 'Champ:', - sortDirectionLabel: 'Direction:', - sortFieldTitle: 'Sélectionner les champs permettant de trier les listes et objet', - sortAscending: 'Ascendant', - sortAscendingTitle: 'Trier les champs sélectionnés par ordre ascendant', - sortDescending: 'Descendant', - sortDescendingTitle: 'Trier les champs sélectionnés par ordre descendant', - string: 'Chaîne', - transform: 'Transformer', - transformTitle: 'Filtrer, trier, or transformer les enfants de ce ${type}', - transformTitleShort: 'Filtrer, trier ou transformer le contenu', - extract: 'Extraire', - extractTitle: 'Extraire ce ${type}', - transformQueryTitle: 'Saisir une requête JMESPath', - transformWizardLabel: 'Assistant', - transformWizardFilter: 'Filtrer', - transformWizardSortBy: 'Trier par', - transformWizardSelectFields: 'Sélectionner les champs', - transformQueryLabel: 'Requête', - transformPreviewLabel: 'Prévisualisation', - type: 'Type', - typeTitle: 'Changer le type de ce champ', - openUrl: 'Ctrl+Click ou Ctrl+Enter pour ouvrir l\'url dans une autre fenêtre', - undo: 'Annuler la dernière action (Ctrl+Z)', - validationCannotMove: 'Cannot move a field into a child of itself', - autoType: 'Champe de type "auto". ' + - 'Ce type de champ est automatiquement déterminé en fonction de la valeur ' + - 'et peut être de type "chaîne", "nombre", "booléen" ou null.', - objectType: 'Champ de type "objet". ' + - 'Un objet contient un ensemble non ordonné de paires clé/valeur.', - arrayType: 'Champ de type "liste". ' + - 'Une liste contient une collection ordonnée de valeurs.', - stringType: 'Champ de type "chaîne". ' + - 'Ce type de champ n\'est pas déterminé en fonction de la valeur, ' + - 'mais retourne systématiquement une chaîne de caractères.', - modeEditorTitle: 'Changer mode d\'édition', - modeCodeText: 'Code', - modeCodeTitle: 'Activer surlignage code', - modeFormText: 'Formulaire', - modeFormTitle: 'Activer formulaire', - modeTextText: 'Texte', - modeTextTitle: 'Activer éditeur texte', - modeTreeText: 'Arbre', - modeTreeTitle: 'Activer éditeur arbre', - modeViewText: 'Lecture seule', - modeViewTitle: 'Activer vue arbre', - modePreviewText: 'Prévisualisation', - modePreviewTitle: 'Activer mode prévisualiser', - examples: 'Exemples', - default: 'Défaut' - } -} - -const _defaultLang = 'en' -const userLang = typeof navigator !== 'undefined' - ? navigator.language || navigator.userLanguage - : undefined -let _lang = _locales.find(l => l === userLang) || _defaultLang - -export function setLanguage (lang) { - if (!lang) { - return - } - const langFound = _locales.find(l => l === lang) - if (langFound) { - _lang = langFound - } else { - console.error('Language not found') - } -} - -export function setLanguages (languages) { - if (!languages) { - return - } - for (const language in languages) { - const langFound = _locales.find(l => l === language) - if (!langFound) { - _locales.push(language) - } - _defs[language] = Object.assign({}, _defs[_defaultLang], _defs[language], languages[language]) - } -} - -export function translate (key, data, lang) { - if (!lang) { - lang = _lang - } - let text = _defs[lang][key] || _defs[_defaultLang][key] || key - if (data) { - for (const dataKey in data) { - text = text.replace('${' + dataKey + '}', data[dataKey]) - } - } - return text -} diff --git a/src/js/jmespathQuery.js b/src/js/jmespathQuery.js deleted file mode 100644 index a9f6b23..0000000 --- a/src/js/jmespathQuery.js +++ /dev/null @@ -1,75 +0,0 @@ -import jmespath from 'jmespath' -import { get, parsePath, parseString } from './util' - -/** - * Build a JMESPath query based on query options coming from the wizard - * @param {JSON} json The JSON document for which to build the query. - * Used for context information like determining - * the type of values (string or number) - * @param {QueryOptions} queryOptions - * @return {string} Returns a query (as string) - */ -export function createQuery (json, queryOptions) { - const { sort, filter, projection } = queryOptions - let query = '' - - if (filter) { - const examplePath = filter.field !== '@' - ? ['0'].concat(parsePath('.' + filter.field)) - : ['0'] - const exampleValue = get(json, examplePath) - const value1 = typeof exampleValue === 'string' - ? filter.value - : parseString(filter.value) - - query += '[? ' + - filter.field + ' ' + - filter.relation + ' ' + - '`' + JSON.stringify(value1) + '`' + - ']' - } else { - query += Array.isArray(json) - ? '[*]' - : '@' - } - - if (sort) { - if (sort.direction === 'desc') { - query += ' | reverse(sort_by(@, &' + sort.field + '))' - } else { - query += ' | sort_by(@, &' + sort.field + ')' - } - } - - if (projection) { - if (query[query.length - 1] !== ']') { - query += ' | [*]' - } - - if (projection.fields.length === 1) { - query += '.' + projection.fields[0] - } else if (projection.fields.length > 1) { - query += '.{' + - projection.fields.map(value => { - const parts = value.split('.') - const last = parts[parts.length - 1] - return last + ': ' + value - }).join(', ') + - '}' - } else { // values.length === 0 - // ignore - } - } - - return query -} - -/** - * Execute a JMESPath query - * @param {JSON} json - * @param {string} query - * @return {JSON} Returns the transformed JSON - */ -export function executeQuery (json, query) { - return jmespath.search(json, query) -} diff --git a/src/js/jsonUtils.js b/src/js/jsonUtils.js deleted file mode 100644 index f6d2a29..0000000 --- a/src/js/jsonUtils.js +++ /dev/null @@ -1,197 +0,0 @@ -'use strict' - -/** - * Convert part of a JSON object to a JSON string. - * Use case is to stringify a small part of a large JSON object so you can see - * a preview. - * - * @param {*} value - * The value to convert to a JSON string. - * - * @param {number | string | null} [space] - * A String or Number object that's used to insert white space into the output - * JSON string for readability purposes. If this is a Number, it indicates the - * number of space characters to use as white space; this number is capped at 10 - * if it's larger than that. Values less than 1 indicate that no space should be - * used. If this is a String, the string (or the first 10 characters of the string, - * if it's longer than that) is used as white space. If this parameter is not - * provided (or is null), no white space is used. - * - * @param {number} [limit] Maximum size of the string output. - * - * @returns {string | undefined} Returns the string representation of the JSON object. - */ -export function stringifyPartial (value, space, limit) { - let _space // undefined by default - if (typeof space === 'number') { - if (space > 10) { - _space = repeat(' ', 10) - } else if (space >= 1) { - _space = repeat(' ', space) - } - // else ignore - } else if (typeof space === 'string' && space !== '') { - _space = space - } - - const output = stringifyValue(value, _space, '', limit) - - return output.length > limit - ? (slice(output, limit) + '...') - : output -} - -/** - * Stringify a value - * @param {*} value - * @param {string} space - * @param {string} indent - * @param {number} limit - * @return {string | undefined} - */ -function stringifyValue (value, space, indent, limit) { - // boolean, null, number, string, or date - if (typeof value === 'boolean' || value instanceof Boolean || - value === null || - typeof value === 'number' || value instanceof Number || - typeof value === 'string' || value instanceof String || - value instanceof Date) { - return JSON.stringify(value) - } - - // array - if (Array.isArray(value)) { - return stringifyArray(value, space, indent, limit) - } - - // object (test lastly!) - if (value && typeof value === 'object') { - return stringifyObject(value, space, indent, limit) - } - - return undefined -} - -/** - * Stringify an array - * @param {Array} array - * @param {string} space - * @param {string} indent - * @param {number} limit - * @return {string} - */ -function stringifyArray (array, space, indent, limit) { - const childIndent = space ? (indent + space) : undefined - let str = space ? '[\n' : '[' - - for (let i = 0; i < array.length; i++) { - const item = array[i] - - if (space) { - str += childIndent - } - - if (typeof item !== 'undefined' && typeof item !== 'function') { - str += stringifyValue(item, space, childIndent, limit) - } else { - str += 'null' - } - - if (i < array.length - 1) { - str += space ? ',\n' : ',' - } - - // stop as soon as we're exceeding the limit - if (str.length > limit) { - return str + '...' - } - } - - str += space ? ('\n' + indent + ']') : ']' - return str -} - -/** - * Stringify an object - * @param {Object} object - * @param {string} space - * @param {string} indent - * @param {number} limit - * @return {string} - */ -function stringifyObject (object, space, indent, limit) { - const childIndent = space ? (indent + space) : undefined - let first = true - let str = space ? '{\n' : '{' - - if (typeof object.toJSON === 'function') { - return stringifyValue(object.toJSON(), space, indent, limit) - } - - for (const key in object) { - if (hasOwnProperty(object, key)) { - const value = object[key] - - if (first) { - first = false - } else { - str += space ? ',\n' : ',' - } - - str += space - ? (childIndent + '"' + key + '": ') - : ('"' + key + '":') - - str += stringifyValue(value, space, childIndent, limit) - - // stop as soon as we're exceeding the limit - if (str.length > limit) { - return str + '...' - } - } - } - - str += space ? ('\n' + indent + '}') : '}' - return str -} - -/** - * Repeat a string a number of times. - * Simple linear solution, we only need up to 10 iterations in practice - * @param {string} text - * @param {number} times - * @return {string} - */ -function repeat (text, times) { - let res = '' - while (times-- > 0) { - res += text - } - return res -} - -/** - * Limit the length of text - * @param {string} text - * @param {number} [limit] - * @return {string} - */ -function slice (text, limit) { - return typeof limit === 'number' - ? text.slice(0, limit) - : text -} - -/** - * Test whether some text contains a JSON array, i.e. the first - * non-white space character is a [ - * @param {string} jsonText - * @return {boolean} - */ -export function containsArray (jsonText) { - return /^\s*\[/.test(jsonText) -} - -function hasOwnProperty (object, key) { - return Object.prototype.hasOwnProperty.call(object, key) -} diff --git a/src/js/polyfills.js b/src/js/polyfills.js deleted file mode 100644 index 0c59ac2..0000000 --- a/src/js/polyfills.js +++ /dev/null @@ -1,54 +0,0 @@ - -if (typeof Element !== 'undefined') { - // Polyfill for array remove - (() => { - function polyfill (item) { - if ('remove' in item) { - return - } - Object.defineProperty(item, 'remove', { - configurable: true, - enumerable: true, - writable: true, - value: function remove () { - if (this.parentNode !== undefined) { this.parentNode.removeChild(this) } - } - }) - } - - if (typeof window.Element !== 'undefined') { polyfill(window.Element.prototype) } - if (typeof window.CharacterData !== 'undefined') { polyfill(window.CharacterData.prototype) } - if (typeof window.DocumentType !== 'undefined') { polyfill(window.DocumentType.prototype) } - })() -} - -// simple polyfill for Array.findIndex -if (!Array.prototype.findIndex) { - // eslint-disable-next-line no-extend-native - Array.prototype.findIndex = function (predicate) { - for (let i = 0; i < this.length; i++) { - const element = this[i] - if (predicate.call(this, element, i, this)) { - return i - } - } - return -1 - } -} - -// Polyfill for Array.find -if (!Array.prototype.find) { - // eslint-disable-next-line no-extend-native - Array.prototype.find = function (predicate) { - const i = this.findIndex(predicate) - return this[i] - } -} - -// Polyfill for String.trim -if (!String.prototype.trim) { - // eslint-disable-next-line no-extend-native - String.prototype.trim = function () { - return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '') - } -} diff --git a/src/js/previewmode.js b/src/js/previewmode.js deleted file mode 100644 index 0c3f79d..0000000 --- a/src/js/previewmode.js +++ /dev/null @@ -1,689 +0,0 @@ -'use strict' - -import { setLanguage, setLanguages, translate } from './i18n' -import { ModeSwitcher } from './ModeSwitcher' -import { ErrorTable } from './ErrorTable' -import { showSortModal } from './showSortModal' -import { showTransformModal } from './showTransformModal' -import { textModeMixins } from './textmode' -import { DEFAULT_MODAL_ANCHOR, MAX_PREVIEW_CHARACTERS, PREVIEW_HISTORY_LIMIT, SIZE_LARGE } from './constants' -import { FocusTracker } from './FocusTracker' -import { - addClassName, - debounce, - escapeUnicodeChars, - formatSize, - isObject, - limitCharacters, - parse, - removeClassName, - repair, - sort, - sortObjectKeys -} from './util' -import { History } from './History' -import { createQuery, executeQuery } from './jmespathQuery' - -const textmode = textModeMixins[0].mixin - -// create a mixin with the functions for text mode -const previewmode = {} - -/** - * Create a JSON document preview, suitable for processing of large documents - * @param {Element} container - * @param {Object} [options] Object with options. See docs for details. - * @private - */ -previewmode.create = function (container, options = {}) { - if (typeof options.statusBar === 'undefined') { - options.statusBar = true - } - - // setting default for previewmode - options.mainMenuBar = options.mainMenuBar !== false - options.enableSort = options.enableSort !== false - options.enableTransform = options.enableTransform !== false - options.createQuery = options.createQuery || createQuery - options.executeQuery = options.executeQuery || executeQuery - - this.options = options - - // indentation - if (typeof options.indentation === 'number') { - this.indentation = Number(options.indentation) - } else { - this.indentation = 2 // number of spaces - } - - // language - setLanguages(this.options.languages) - setLanguage(this.options.language) - - // determine mode - this.mode = 'preview' - - const me = this - this.container = container - this.dom = {} - - this.json = undefined - this.text = '' - - // TODO: JSON Schema support - - // create a debounced validate function - this._debouncedValidate = debounce(this.validate.bind(this), this.DEBOUNCE_INTERVAL) - - this.width = container.clientWidth - this.height = container.clientHeight - - this.frame = document.createElement('div') - this.frame.className = 'jsoneditor jsoneditor-mode-preview' - this.frame.onclick = event => { - // prevent default submit action when the editor is located inside a form - event.preventDefault() - } - - // setting the FocusTracker on 'this.frame' to track the editor's focus event - const focusTrackerConfig = { - target: this.frame, - onFocus: this.options.onFocus || null, - onBlur: this.options.onBlur || null - } - - this.frameFocusTracker = new FocusTracker(focusTrackerConfig) - - this.content = document.createElement('div') - this.content.className = 'jsoneditor-outer' - - this.dom.busy = document.createElement('div') - this.dom.busy.className = 'jsoneditor-busy' - this.dom.busyContent = document.createElement('span') - this.dom.busyContent.innerHTML = 'busy...' - this.dom.busy.appendChild(this.dom.busyContent) - this.content.appendChild(this.dom.busy) - - this.dom.previewContent = document.createElement('pre') - this.dom.previewContent.className = 'jsoneditor-preview' - this.dom.previewText = document.createTextNode('') - this.dom.previewContent.appendChild(this.dom.previewText) - this.content.appendChild(this.dom.previewContent) - - if (this.options.mainMenuBar) { - addClassName(this.content, 'has-main-menu-bar') - - // create menu - this.menu = document.createElement('div') - this.menu.className = 'jsoneditor-menu' - this.frame.appendChild(this.menu) - - // create format button - const buttonFormat = document.createElement('button') - buttonFormat.type = 'button' - buttonFormat.className = 'jsoneditor-format' - buttonFormat.title = translate('formatTitle') - this.menu.appendChild(buttonFormat) - buttonFormat.onclick = function handleFormat () { - me.executeWithBusyMessage(() => { - try { - me.format() - } catch (err) { - me._onError(err) - } - }, 'formatting...') - } - - // create compact button - const buttonCompact = document.createElement('button') - buttonCompact.type = 'button' - buttonCompact.className = 'jsoneditor-compact' - buttonCompact.title = translate('compactTitle') - this.menu.appendChild(buttonCompact) - buttonCompact.onclick = function handleCompact () { - me.executeWithBusyMessage(() => { - try { - me.compact() - } catch (err) { - me._onError(err) - } - }, 'compacting...') - } - - // create sort button - if (this.options.enableSort) { - const sort = document.createElement('button') - sort.type = 'button' - sort.className = 'jsoneditor-sort' - sort.title = translate('sortTitleShort') - sort.onclick = () => { - me._showSortModal() - } - this.menu.appendChild(sort) - } - - // create transform button - if (this.options.enableTransform) { - const transform = document.createElement('button') - transform.type = 'button' - transform.title = translate('transformTitleShort') - transform.className = 'jsoneditor-transform' - transform.onclick = () => { - me._showTransformModal() - } - this.dom.transform = transform - this.menu.appendChild(transform) - } - - // create repair button - const buttonRepair = document.createElement('button') - buttonRepair.type = 'button' - buttonRepair.className = 'jsoneditor-repair' - buttonRepair.title = translate('repairTitle') - this.menu.appendChild(buttonRepair) - buttonRepair.onclick = () => { - if (me.json === undefined) { // only repair if we don't have valid JSON - me.executeWithBusyMessage(() => { - try { - me.repair() - } catch (err) { - me._onError(err) - } - }, 'repairing...') - } - } - - // create history and undo/redo buttons - if (this.options.history !== false) { // default option value is true - const onHistoryChange = () => { - me.dom.undo.disabled = !me.history.canUndo() - me.dom.redo.disabled = !me.history.canRedo() - } - - const calculateItemSize = item => // times two to account for the json object - item.text.length * 2 - - this.history = new History(onHistoryChange, calculateItemSize, PREVIEW_HISTORY_LIMIT) - - // create undo button - const undo = document.createElement('button') - undo.type = 'button' - undo.className = 'jsoneditor-undo jsoneditor-separator' - undo.title = translate('undo') - undo.onclick = () => { - const action = me.history.undo() - if (action) { - me._applyHistory(action) - } - } - this.menu.appendChild(undo) - this.dom.undo = undo - - // create redo button - const redo = document.createElement('button') - redo.type = 'button' - redo.className = 'jsoneditor-redo' - redo.title = translate('redo') - redo.onclick = () => { - const action = me.history.redo() - if (action) { - me._applyHistory(action) - } - } - this.menu.appendChild(redo) - this.dom.redo = redo - - // force enabling/disabling the undo/redo button - this.history.onChange() - } - - // create mode box - if (this.options && this.options.modes && this.options.modes.length) { - this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch (mode) { - // switch mode and restore focus - me.setMode(mode) - me.modeSwitcher.focus() - }) - } - } - - this.errorTable = new ErrorTable({ - errorTableVisible: true, - onToggleVisibility: function () { - me.validate() - }, - onFocusLine: null, - onChangeHeight: function (height) { - // TODO: change CSS to using flex box, remove setting height using JavaScript - const statusBarHeight = me.dom.statusBar ? me.dom.statusBar.clientHeight : 0 - const totalHeight = height + statusBarHeight + 1 - me.content.style.marginBottom = (-totalHeight) + 'px' - me.content.style.paddingBottom = totalHeight + 'px' - } - }) - - this.frame.appendChild(this.content) - this.frame.appendChild(this.errorTable.getErrorTable()) - this.container.appendChild(this.frame) - - if (options.statusBar) { - addClassName(this.content, 'has-status-bar') - - const statusBar = document.createElement('div') - this.dom.statusBar = statusBar - statusBar.className = 'jsoneditor-statusbar' - this.frame.appendChild(statusBar) - - this.dom.fileSizeInfo = document.createElement('span') - this.dom.fileSizeInfo.className = 'jsoneditor-size-info' - this.dom.fileSizeInfo.innerText = '' - statusBar.appendChild(this.dom.fileSizeInfo) - - this.dom.arrayInfo = document.createElement('span') - this.dom.arrayInfo.className = 'jsoneditor-size-info' - this.dom.arrayInfo.innerText = '' - statusBar.appendChild(this.dom.arrayInfo) - - statusBar.appendChild(this.errorTable.getErrorCounter()) - statusBar.appendChild(this.errorTable.getWarningIcon()) - statusBar.appendChild(this.errorTable.getErrorIcon()) - } - - this._renderPreview() - - this.setSchema(this.options.schema, this.options.schemaRefs) -} - -previewmode._renderPreview = function () { - const text = this.getText() - - this.dom.previewText.nodeValue = limitCharacters(text, MAX_PREVIEW_CHARACTERS) - - if (this.dom.fileSizeInfo) { - this.dom.fileSizeInfo.innerText = 'Size: ' + formatSize(text.length) - } - - if (this.dom.arrayInfo) { - if (Array.isArray(this.json)) { - this.dom.arrayInfo.innerText = ('Array: ' + this.json.length + ' items') - } else { - this.dom.arrayInfo.innerText = '' - } - } -} - -/** - * Handle a change: - * - Validate JSON schema - * - Send a callback to the onChange listener if provided - * @private - */ -previewmode._onChange = function () { - // validate JSON schema (if configured) - this._debouncedValidate() - - // trigger the onChange callback - if (this.options.onChange) { - try { - this.options.onChange() - } catch (err) { - console.error('Error in onChange callback: ', err) - } - } - - // trigger the onChangeJSON callback - if (this.options.onChangeJSON) { - try { - this.options.onChangeJSON(this.get()) - } catch (err) { - console.error('Error in onChangeJSON callback: ', err) - } - } - - // trigger the onChangeText callback - if (this.options.onChangeText) { - try { - this.options.onChangeText(this.getText()) - } catch (err) { - console.error('Error in onChangeText callback: ', err) - } - } -} - -/** - * Open a sort modal - * @private - */ -previewmode._showSortModal = function () { - const me = this - - function onSort (json, sortedBy) { - if (Array.isArray(json)) { - const sortedArray = sort(json, sortedBy.path, sortedBy.direction) - - me.sortedBy = sortedBy - me._setAndFireOnChange(sortedArray) - } - - if (isObject(json)) { - const sortedObject = sortObjectKeys(json, sortedBy.direction) - - me.sortedBy = sortedBy - me._setAndFireOnChange(sortedObject) - } - } - - this.executeWithBusyMessage(() => { - const container = me.options.modalAnchor || DEFAULT_MODAL_ANCHOR - const json = me.get() - me._renderPreview() // update array count - - showSortModal(container, json, sortedBy => { - me.executeWithBusyMessage(() => { - onSort(json, sortedBy) - }, 'sorting...') - }, me.sortedBy) - }, 'parsing...') -} - -/** - * Open a transform modal - * @private - */ -previewmode._showTransformModal = function () { - this.executeWithBusyMessage(() => { - const { createQuery, executeQuery, modalAnchor, queryDescription } = this.options - const json = this.get() - - this._renderPreview() // update array count - - showTransformModal({ - anchor: modalAnchor || DEFAULT_MODAL_ANCHOR, - json, - queryDescription, // can be undefined - createQuery, - executeQuery, - onTransform: query => { - this.executeWithBusyMessage(() => { - const updatedJson = executeQuery(json, query) - this._setAndFireOnChange(updatedJson) - }, 'transforming...') - } - }) - }, 'parsing...') -} - -/** - * Destroy the editor. Clean up DOM, event listeners, and web workers. - */ -previewmode.destroy = function () { - if (this.frame && this.container && this.frame.parentNode === this.container) { - this.container.removeChild(this.frame) - } - - if (this.modeSwitcher) { - this.modeSwitcher.destroy() - this.modeSwitcher = null - } - - this._debouncedValidate = null - - if (this.history) { - this.history.clear() - this.history = null - } - - // Removing the FocusTracker set to track the editor's focus event - this.frameFocusTracker.destroy() -} - -/** - * Compact the code in the text editor - */ -previewmode.compact = function () { - const json = this.get() - const text = JSON.stringify(json) - - // we know that in this case the json is still the same, so we pass json too - this._setTextAndFireOnChange(text, json) -} - -/** - * Format the code in the text editor - */ -previewmode.format = function () { - const json = this.get() - const text = JSON.stringify(json, null, this.indentation) - - // we know that in this case the json is still the same, so we pass json too - this._setTextAndFireOnChange(text, json) -} - -/** - * Repair the code in the text editor - */ -previewmode.repair = function () { - const text = this.getText() - const repairedText = repair(text) - - this._setTextAndFireOnChange(repairedText) -} - -/** - * Set focus to the editor - */ -previewmode.focus = function () { - // we don't really have a place to focus, - // let's focus on the transform button - this.dom.transform.focus() -} - -/** - * Set json data in the editor - * @param {*} json - */ -previewmode.set = function (json) { - if (this.history) { - this.history.clear() - } - - this._set(json) -} - -/** - * Update data. Same as calling `set` in text/code mode. - * @param {*} json - */ -previewmode.update = function (json) { - this._set(json) -} - -/** - * Set json data - * @param {*} json - */ -previewmode._set = function (json) { - this.text = undefined - this.json = json - - this._renderPreview() - - this._pushHistory() - - // validate JSON schema - this._debouncedValidate() -} - -previewmode._setAndFireOnChange = function (json) { - this._set(json) - this._onChange() -} - -/** - * Get json data - * @return {*} json - */ -previewmode.get = function () { - if (this.json === undefined) { - const text = this.getText() - - this.json = parse(text) // this can throw an error - } - - return this.json -} - -/** - * Get the text contents of the editor - * @return {String} jsonText - */ -previewmode.getText = function () { - if (this.text === undefined) { - this.text = JSON.stringify(this.json, null, this.indentation) - - if (this.options.escapeUnicode === true) { - this.text = escapeUnicodeChars(this.text) - } - } - - return this.text -} - -/** - * Set the text contents of the editor - * @param {String} jsonText - */ -previewmode.setText = function (jsonText) { - if (this.history) { - this.history.clear() - } - - this._setText(jsonText) -} - -/** - * Update the text contents - * @param {string} jsonText - */ -previewmode.updateText = function (jsonText) { - // don't update if there are no changes - if (this.getText() === jsonText) { - return - } - - this._setText(jsonText) -} - -/** - * Set the text contents of the editor - * @param {string} jsonText - * @param {*} [json] Optional JSON instance of the text - * @private - */ -previewmode._setText = function (jsonText, json) { - if (this.options.escapeUnicode === true) { - this.text = escapeUnicodeChars(jsonText) - } else { - this.text = jsonText - } - this.json = json - - this._renderPreview() - - if (this.json === undefined) { - const me = this - this.executeWithBusyMessage(() => { - try { - // force parsing the json now, else it will be done in validate without feedback - me.json = me.get() - me._renderPreview() - me._pushHistory() - } catch (err) { - // no need to throw an error, validation will show an error - } - }, 'parsing...') - } else { - this._pushHistory() - } - - this._debouncedValidate() -} - -/** - * Set text and fire onChange callback - * @param {string} jsonText - * @param {*} [json] Optional JSON instance of the text - * @private - */ -previewmode._setTextAndFireOnChange = function (jsonText, json) { - this._setText(jsonText, json) - this._onChange() -} - -/** - * Apply history to the current state - * @param {{json?: JSON, text?: string}} action - * @private - */ -previewmode._applyHistory = function (action) { - this.json = action.json - this.text = action.text - - this._renderPreview() - - this._debouncedValidate() -} - -/** - * Push the current state to history - * @private - */ -previewmode._pushHistory = function () { - if (!this.history) { - return - } - - const action = { - text: this.text, - json: this.json - } - - this.history.add(action) -} - -/** - * Execute a heavy, blocking action. - * Before starting the action, show a message on screen like "parsing..." - * @param {function} fn - * @param {string} message - */ -previewmode.executeWithBusyMessage = function (fn, message) { - const size = this.getText().length - - if (size > SIZE_LARGE) { - const me = this - addClassName(me.frame, 'busy') - me.dom.busyContent.innerText = message - - setTimeout(() => { - fn() - removeClassName(me.frame, 'busy') - me.dom.busyContent.innerText = '' - }, 100) - } else { - fn() - } -} - -// TODO: refactor into composable functions instead of this shaky mixin-like structure -previewmode.validate = textmode.validate -previewmode._renderErrors = textmode._renderErrors - -// define modes -export const previewModeMixins = [ - { - mode: 'preview', - mixin: previewmode, - data: 'json' - } -] diff --git a/src/js/showMoreNodeFactory.js b/src/js/showMoreNodeFactory.js deleted file mode 100644 index bade4fc..0000000 --- a/src/js/showMoreNodeFactory.js +++ /dev/null @@ -1,154 +0,0 @@ -'use strict' - -import { translate } from './i18n' - -/** - * A factory function to create an ShowMoreNode, which depends on a Node - * @param {function} Node - */ -export function showMoreNodeFactory (Node) { - /** - * @constructor ShowMoreNode - * @extends Node - * @param {TreeEditor} editor - * @param {Node} parent - * Create a new ShowMoreNode. This is a special node which is created - * for arrays or objects having more than 100 items - */ - function ShowMoreNode (editor, parent) { - /** @type {TreeEditor} */ - this.editor = editor - this.parent = parent - this.dom = {} - } - - ShowMoreNode.prototype = new Node() - - /** - * Return a table row with an append button. - * @return {Element} dom TR element - */ - ShowMoreNode.prototype.getDom = function () { - if (this.dom.tr) { - return this.dom.tr - } - - this._updateEditability() - - // display "show more" - if (!this.dom.tr) { - const me = this - const parent = this.parent - const showMoreButton = document.createElement('a') - showMoreButton.appendChild(document.createTextNode(translate('showMore'))) - showMoreButton.href = '#' - showMoreButton.onclick = event => { - // TODO: use callback instead of accessing a method of the parent - parent.visibleChilds = Math.floor(parent.visibleChilds / parent.getMaxVisibleChilds() + 1) * - parent.getMaxVisibleChilds() - me.updateDom() - parent.showChilds() - - event.preventDefault() - return false - } - - const showAllButton = document.createElement('a') - showAllButton.appendChild(document.createTextNode(translate('showAll'))) - showAllButton.href = '#' - showAllButton.onclick = event => { - // TODO: use callback instead of accessing a method of the parent - parent.visibleChilds = Infinity - me.updateDom() - parent.showChilds() - - event.preventDefault() - return false - } - - const moreContents = document.createElement('div') - const moreText = document.createTextNode(this._getShowMoreText()) - moreContents.className = 'jsoneditor-show-more' - moreContents.appendChild(moreText) - moreContents.appendChild(showMoreButton) - moreContents.appendChild(document.createTextNode('. ')) - moreContents.appendChild(showAllButton) - moreContents.appendChild(document.createTextNode('. ')) - - const tdContents = document.createElement('td') - tdContents.appendChild(moreContents) - - const moreTr = document.createElement('tr') - if (this.editor.options.mode === 'tree') { - moreTr.appendChild(document.createElement('td')) - moreTr.appendChild(document.createElement('td')) - } - moreTr.appendChild(tdContents) - moreTr.className = 'jsoneditor-show-more' - this.dom.tr = moreTr - this.dom.moreContents = moreContents - this.dom.moreText = moreText - } - - this.updateDom() - - return this.dom.tr - } - - /** - * Update the HTML dom of the Node - */ - ShowMoreNode.prototype.updateDom = function (options) { - if (this.isVisible()) { - // attach to the right child node (the first non-visible child) - this.dom.tr.node = this.parent.childs[this.parent.visibleChilds] - - if (!this.dom.tr.parentNode) { - const nextTr = this.parent._getNextTr() - if (nextTr) { - nextTr.parentNode.insertBefore(this.dom.tr, nextTr) - } - } - - // update the counts in the text - this.dom.moreText.nodeValue = this._getShowMoreText() - - // update left margin - this.dom.moreContents.style.marginLeft = (this.getLevel() + 1) * 24 + 'px' - } else { - if (this.dom.tr && this.dom.tr.parentNode) { - this.dom.tr.parentNode.removeChild(this.dom.tr) - } - } - } - - ShowMoreNode.prototype._getShowMoreText = function () { - return translate('showMoreStatus', { - visibleChilds: this.parent.visibleChilds, - totalChilds: this.parent.childs.length - }) + ' ' - } - - /** - * Check whether the ShowMoreNode is currently visible. - * the ShowMoreNode is visible when it's parent has more childs than - * the current visibleChilds - * @return {boolean} isVisible - */ - ShowMoreNode.prototype.isVisible = function () { - return this.parent.expanded && this.parent.childs.length > this.parent.visibleChilds - } - - /** - * Handle an event. The event is caught centrally by the editor - * @param {Event} event - */ - ShowMoreNode.prototype.onEvent = function (event) { - const type = event.type - if (type === 'keydown') { - this.onKeyDown(event) - } - } - - return ShowMoreNode -} diff --git a/src/js/showSortModal.js b/src/js/showSortModal.js deleted file mode 100644 index c20cef7..0000000 --- a/src/js/showSortModal.js +++ /dev/null @@ -1,131 +0,0 @@ -import picoModal from 'picomodal' -import { translate } from './i18n' -import { contains, getChildPaths } from './util' - -/** - * Show advanced sorting modal - * @param {HTMLElement} container The container where to center - * the modal and create an overlay - * @param {JSON} json The JSON data to be sorted. - * @param {function} onSort Callback function, invoked with - * an object containing the selected - * path and direction - * @param {Object} options - * Available options: - * - {string} path The selected path - * - {'asc' | 'desc'} direction The selected direction - */ -export function showSortModal (container, json, onSort, options) { - const paths = Array.isArray(json) - ? getChildPaths(json) - : [''] - const selectedPath = options && options.path && contains(paths, options.path) - ? options.path - : paths[0] - const selectedDirection = (options && options.direction) || 'asc' - - const content = '
    ' + - '
    ' + translate('sort') + '
    ' + - '
    ' + - '' + - '' + - '' + - ' ' + - ' ' + - '' + - '' + - ' ' + - ' ' + - '' + - '' + - '' + - '' + - '' + - '
    ' + translate('sortFieldLabel') + ' ' + - '
    ' + - ' ' + - '
    ' + - '
    ' + translate('sortDirectionLabel') + ' ' + - '
    ' + - '' + - '' + - '
    ' + - '
    ' + - ' ' + - '
    ' + - '
    ' + - '
    ' - - picoModal({ - parent: container, - content: content, - overlayClass: 'jsoneditor-modal-overlay', - overlayStyles: { - backgroundColor: 'rgb(1,1,1)', - opacity: 0.3 - }, - modalClass: 'jsoneditor-modal jsoneditor-modal-sort' - }) - .afterCreate(modal => { - const form = modal.modalElem().querySelector('form') - const ok = modal.modalElem().querySelector('#ok') - const field = modal.modalElem().querySelector('#field') - const direction = modal.modalElem().querySelector('#direction') - - function preprocessPath (path) { - return (path === '') - ? '@' - : (path[0] === '.') - ? path.slice(1) - : path - } - - paths.forEach(path => { - const option = document.createElement('option') - option.text = preprocessPath(path) - option.value = path - field.appendChild(option) - }) - - function setDirection (value) { - direction.value = value - direction.className = 'jsoneditor-button-group jsoneditor-button-group-value-' + direction.value - } - - field.value = selectedPath || paths[0] - setDirection(selectedDirection || 'asc') - - direction.onclick = event => { - setDirection(event.target.getAttribute('data-value')) - } - - ok.onclick = event => { - event.preventDefault() - event.stopPropagation() - - modal.close() - - onSort({ - path: field.value, - direction: direction.value - }) - } - - if (form) { // form is not available when JSONEditor is created inside a form - form.onsubmit = ok.onclick - } - }) - .afterClose(modal => { - modal.destroy() - }) - .show() -} diff --git a/src/js/showTransformModal.js b/src/js/showTransformModal.js deleted file mode 100644 index 5136c82..0000000 --- a/src/js/showTransformModal.js +++ /dev/null @@ -1,296 +0,0 @@ -import picoModal from 'picomodal' -import Selectr from './assets/selectr/selectr' -import { translate } from './i18n' -import { stringifyPartial } from './jsonUtils' -import { getChildPaths, debounce } from './util' -import { MAX_PREVIEW_CHARACTERS } from './constants' - -const DEFAULT_DESCRIPTION = - 'Enter a JMESPath query to filter, sort, or transform the JSON data.
    ' + - 'To learn JMESPath, go to the interactive tutorial.' - -/** - * Show advanced filter and transform modal using JMESPath - * @param {Object} params - * @property {HTMLElement} container The container where to center - * the modal and create an overlay - * @property {JSON} json The json data to be transformed - * @property {string} [queryDescription] Optional custom description explaining - * the transform functionality - * @property {function} createQuery Function called to create a query - * from the wizard form - * @property {function} executeQuery Execute a query for the preview pane - * @property {function} onTransform Callback invoked with the created - * query as callback - */ -export function showTransformModal ( - { - container, - json, - queryDescription = DEFAULT_DESCRIPTION, - createQuery, - executeQuery, - onTransform - } -) { - const value = json - - const content = '