From 4291652fe26061aab8f3ee4fcede481cbea72506 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Tue, 12 Oct 2021 13:23:33 +0300 Subject: [PATCH 01/75] objectloader diff endpoints and cache --- packages/objectloader/index.js | 182 ++++++++++++++++++++++++++++----- 1 file changed, 159 insertions(+), 23 deletions(-) diff --git a/packages/objectloader/index.js b/packages/objectloader/index.js index 756738a8a..833ee5089 100644 --- a/packages/objectloader/index.js +++ b/packages/objectloader/index.js @@ -11,14 +11,14 @@ export default class ObjectLoader { * Creates a new object loader instance. * @param {*} param0 */ - constructor( { serverUrl, streamId, token, objectId, options = { fullyTraverseArrays: false, excludeProps: [ ] } } ) { + constructor( { serverUrl, streamId, token, objectId, options = { enableCaching: true, fullyTraverseArrays: false, excludeProps: [ ] } } ) { this.INTERVAL_MS = 20 this.TIMEOUT_MS = 180000 // three mins this.serverUrl = serverUrl || window.location.origin this.streamId = streamId this.objectId = objectId - console.log('Object loader constructor called!!!') + console.log('Object loader constructor called!') try { this.token = token || localStorage.getItem( 'AuthToken' ) } catch (error) { @@ -33,7 +33,8 @@ export default class ObjectLoader { this.headers['Authorization'] = `Bearer ${this.token}` } - this.requestUrl = `${this.serverUrl}/objects/${this.streamId}/${this.objectId}` + this.requestUrlRootObj = `${this.serverUrl}/objects/${this.streamId}/${this.objectId}/single` + this.requestUrlChildren = `${this.serverUrl}/api/getobjects/${this.streamId}` this.promises = [] this.intervals = {} this.buffer = [] @@ -41,7 +42,10 @@ export default class ObjectLoader { this.totalChildrenCount = 0 this.traversedReferencesCount = 0 this.options = options - } + this.options.numConnections = this.options.numConnections || 4 + + this.cacheDB = null +} dispose() { this.buffer = [] @@ -177,11 +181,13 @@ export default class ObjectLoader { } async * getObjectIterator( ) { + let t0 = Date.now() for await ( let line of this.getRawObjectIterator() ) { let { id, obj } = this.processLine( line ) this.buffer[ id ] = obj yield obj } + console.log("Loaded in: ", (Date.now() - t0) / 1000) } processLine( chunk ) { @@ -190,31 +196,161 @@ export default class ObjectLoader { } async * getRawObjectIterator() { - const decoder = new TextDecoder() - const response = await fetch( this.requestUrl, { headers: this.headers } ) - const reader = response.body.getReader() - let { value: chunk, done: readerDone } = await reader.read() - chunk = chunk ? decoder.decode( chunk ) : '' + if ( this.options.enableCaching && window.indexedDB && this.cacheDB === null) { + // TODO: safari issue https://github.com/jakearchibald/idb-keyval + let idbOpenRequest = indexedDB.open('speckle-object-cache', 1) + idbOpenRequest.onupgradeneeded = () => idbOpenRequest.result.createObjectStore('objects'); + this.cacheDB = await this.promisifyIdbRequest( idbOpenRequest ) + } - let re = /\r\n|\n|\r/gm - let startIndex = 0 + const rootObjJson = await this.getRawRootObject() + yield `${this.objectId}\t${rootObjJson}` + const rootObj = JSON.parse(rootObjJson) + if ( !rootObj.__closure ) return + + let childrenIds = Object.keys(rootObj.__closure) + if ( childrenIds.length === 0 ) return + + const cachedObjects = await this.cacheGetObjects( childrenIds ) + for ( let id in cachedObjects ) { + yield `${id}\t${cachedObjects[ id ]}` + } + childrenIds = childrenIds.filter(id => !( id in cachedObjects ) ) + + let splitChildrenIds = [] + if ( childrenIds.length <= 10 ){ + splitChildrenIds.push( childrenIds ) + } else { + for (let i = 0; i < this.options.numConnections; i++) { + splitChildrenIds.push( [] ) + } + for (let i = 0; i < childrenIds.length; i++) { + splitChildrenIds[ i % this.options.numConnections ].push(childrenIds[i]) + } + } + + const decoders = [] + const readers = [] + const readPromisses = [] + const startIndexes = [] + const readBuffers = [] + const finishedRequests = [] + + for (let i = 0; i < splitChildrenIds.length; i++) { + decoders.push(new TextDecoder()) + readers.push( null ) + readPromisses.push( null ) + startIndexes.push( 0 ) + readBuffers.push( '' ) + finishedRequests.push( false ) + + fetch( + this.requestUrlChildren, + { + method: 'POST', + headers: { ...this.headers, 'Content-Type': 'application/json' }, + body: JSON.stringify( { objects: JSON.stringify( splitChildrenIds[i] ) } ) + } + ).then( crtResponse => { + let crtReader = crtResponse.body.getReader() + readers[i] = crtReader + let crtReadPromise = crtReader.read().then(x => { x.reqId = i; return x }) + readPromisses[i] = crtReadPromise + }) + } + while ( true ) { - let result = re.exec( chunk ) - if ( !result ) { - if ( readerDone ) break - let remainder = chunk.substr( startIndex ) - ;( { value: chunk, done: readerDone } = await reader.read() ) // PS: semicolon of doom - chunk = remainder + ( chunk ? decoder.decode( chunk ) : '' ) - startIndex = re.lastIndex = 0 + let validReadPromises = readPromisses.filter(x => x != null) + if ( validReadPromises.length === 0 ) { + // Check if all requests finished + if ( finishedRequests.every(x => x) ) { + break + } + // Sleep 10 ms + await new Promise( ( resolve ) => { + setTimeout( resolve, 10 ) + } ) continue } - yield chunk.substring( startIndex, result.index ) - startIndex = re.lastIndex - } - if ( startIndex < chunk.length ) { - yield chunk.substr( startIndex ) + // Wait for data on any running request + let data = await Promise.any( validReadPromises ) + let { value: crtDataChunk, done: readerDone, reqId } = data + finishedRequests[ reqId ] = readerDone + + // Replace read promise on this request with a new `read` call + if ( !readerDone ) { + let crtReadPromise = readers[ reqId ].read().then(x => { x.reqId = reqId; return x }) + readPromisses[ reqId ] = crtReadPromise + } else { + // This request finished. "Flush any non-newline-terminated text" + if ( readBuffers[ reqId ].length > 0 ) { + yield readBuffers[ reqId ] + readBuffers[ reqId ] = '' + } + // no other read calls for this request + readPromisses[ reqId ] = null + } + + if ( !crtDataChunk ) + continue + + crtDataChunk = decoders[ reqId ].decode( crtDataChunk ) + let unprocessedText = readBuffers[ reqId ] + crtDataChunk + let unprocessedLines = unprocessedText.split(/\r\n|\n|\r/) + let remainderText = unprocessedLines.pop() + readBuffers[ reqId ] = remainderText + + for ( let line of unprocessedLines ) { + yield line + } + this.cacheStoreObjects(unprocessedLines) } } + + async getRawRootObject() { + const response = await fetch( this.requestUrlRootObj, { headers: this.headers } ) + return response.text() + } + + promisifyIdbRequest(request) { + return new Promise((resolve, reject) => { + request.oncomplete = request.onsuccess = () => resolve(request.result); + request.onabort = request.onerror = () => reject(request.error); + }) + } + + async cacheGetObjects(ids) { + if ( !this.options.enableCaching || !window.indexedDB ) { + return {} + } + + let store = this.cacheDB.transaction('objects', 'readonly').objectStore('objects') + let idbChildrenPromises = ids.map( id => this.promisifyIdbRequest( store.get( id ) ).then( data => ( { id, data } ) ) ) + let cachedData = await Promise.all(idbChildrenPromises) + + let ret = {} + for ( let cachedObj of cachedData ) { + if ( !cachedObj.data ) // non-existent objects are retrieved with `undefined` data + continue + ret[ cachedObj.id ] = cachedObj.data + } + + return ret + } + + cacheStoreObjects(objects) { + if ( !this.options.enableCaching || !window.indexedDB ) { + return {} + } + + let store = this.cacheDB.transaction('objects', 'readwrite').objectStore('objects') + for ( let obj of objects ) { + let idAndData = obj.split( '\t' ) + store.put(idAndData[1], idAndData[0]) + } + + return this.promisifyIdbRequest( store.transaction ) + } } From 38eca4dbdcf1b6b6329c3fd326033d863b578d05 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 25 Oct 2021 15:46:37 +0300 Subject: [PATCH 02/75] WIP viewer --- packages/viewer/.babelrc | 5 +- packages/viewer/package-lock.json | 8149 ++++++----------- packages/viewer/package.json | 43 +- packages/viewer/src/assets/example.html | 119 +- packages/viewer/src/modules/Converter.js | 4 +- packages/viewer/src/modules/Filtering.js | 10 + .../viewer/src/modules/InteractionHandler.js | 32 +- .../viewer/src/modules/SceneObjectManager.js | 53 +- packages/viewer/src/modules/SceneObjects.js | 121 + .../viewer/src/modules/SectionPlaneHelper.js | 2 +- .../viewer/src/modules/SelectionHelper.js | 2 +- packages/viewer/src/modules/Viewer.js | 9 +- .../viewer/src/modules/ViewerObjectLoader.js | 3 + packages/viewer/webpack.config.example.js | 7 +- 14 files changed, 3099 insertions(+), 5460 deletions(-) create mode 100644 packages/viewer/src/modules/Filtering.js create mode 100644 packages/viewer/src/modules/SceneObjects.js diff --git a/packages/viewer/.babelrc b/packages/viewer/.babelrc index 582d6bdca..63cfa3e8d 100644 --- a/packages/viewer/.babelrc +++ b/packages/viewer/.babelrc @@ -15,8 +15,9 @@ "@babel/preset-react" ], "plugins": [ - "@babel/plugin-proposal-class-properties", + ["@babel/plugin-proposal-class-properties", { "loose": true}], "babel-plugin-add-module-exports", - "@babel/plugin-transform-classes" + "@babel/plugin-transform-classes", + ["@babel/plugin-proposal-private-methods", { "loose": true }] ] } diff --git a/packages/viewer/package-lock.json b/packages/viewer/package-lock.json index 6b4385b26..9c9075e43 100644 --- a/packages/viewer/package-lock.json +++ b/packages/viewer/package-lock.json @@ -5,623 +5,520 @@ "requires": true, "dependencies": { "@babel/cli": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.12.10.tgz", - "integrity": "sha512-+y4ZnePpvWs1fc/LhZRTHkTesbXkyBYuOB+5CyodZqrEuETXi3zOVfpAQIdgC3lXbHLTDG9dQosxR9BhvLKDLQ==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.15.7.tgz", + "integrity": "sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg==", "dev": true, "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.0.0", - "lodash": "^4.17.19", "make-dir": "^2.1.0", "slash": "^2.0.0", "source-map": "^0.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "optional": true, - "requires": { - "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.5.0" - } - }, - "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, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "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, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "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==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } } }, "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", "dev": true }, "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true } } }, "@babel/eslint-parser": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.12.1.tgz", - "integrity": "sha512-cc7WQHnHQY3++/bghgbDtPx+5bf6xTsokyGzV6Qzh65NLz/unv+mPQuACkQ9GFhIhcTFv6yqwNaEcfX7EkOEsg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.8.tgz", + "integrity": "sha512-fYP7QFngCvgxjUuw8O057SVH5jCXsbFFOoE77CFDcvzwBVgTOkMD/L4mIC5Ud1xf8chK/no2fRbSSn1wvNmKuQ==", "dev": true, "requires": { - "eslint-scope": "5.1.0", - "eslint-visitor-keys": "^1.3.0", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } } }, "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "requires": { - "@babel/types": "^7.12.11", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.15.4" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.15.4" } }, "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.15.4" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.15.4" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "requires": { - "@babel/types": "^7.12.11" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", - "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", - "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { @@ -643,12 +540,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -688,12 +594,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -750,469 +656,476 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", - "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", - "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz", - "integrity": "sha512-JDWGuzGNWscYcq8oJVCtSE61a5+XAOos+V0HrxnDieUus4UMnBEosDnY1VJqU5iZ4pA04QY7l0+JvHL1hZEfsw==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.10", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.12.1", - "@babel/types": "^7.12.12" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.12.tgz", - "integrity": "sha512-i1AxnKxHeMxUaWVXQOSIco4tvVvvCxMSfeBMnMM06mpaJt3g+MpxYQQrDfojUQldP1xxraPSJYSMEljoWM/dCg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.12" + "@babel/plugin-transform-react-jsx": "^7.14.5" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", - "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.12.1" + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/preset-env": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", - "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.11", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.11", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.11", - "core-js-compat": "^3.8.0", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" } }, "@babel/preset-modules": { @@ -1229,74 +1142,74 @@ } }, "@babel/preset-react": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.10.tgz", - "integrity": "sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.10", - "@babel/plugin-transform-react-jsx-development": "^7.12.7", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" } }, "@babel/preset-typescript": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz", - "integrity": "sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-transform-typescript": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" } }, "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -1306,32 +1219,22 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, "@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", "dev": true }, "@eslint/eslintrc": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", - "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", + "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -1340,16 +1243,33 @@ }, "dependencies": { "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } } } }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1364,22 +1284,22 @@ } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.5.tgz", + "integrity": "sha512-smtlRF9vNKorRMCUtJ+yllIoiY8oFmfFG7xlzsAE76nKEwXNhjPOJIsc7Dv+AUitVt76t+KjIpUP9m98Crn2LQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^27.2.5", + "jest-util": "^27.2.5", "slash": "^3.0.0" }, "dependencies": { @@ -1393,9 +1313,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1441,45 +1361,45 @@ } }, "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.5.tgz", + "integrity": "sha512-VR7mQ+jykHN4WO3OvusRJMk4xCa2MFLipMS+43fpcRGaYrN1KwMATfVEXif7ccgFKYGy5D1TVXTNE4mGq/KMMA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.2.5", + "@jest/reporters": "^27.2.5", + "@jest/test-result": "^27.2.5", + "@jest/transform": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", + "jest-changed-files": "^27.2.5", + "jest-config": "^27.2.5", + "jest-haste-map": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.2.5", + "jest-resolve-dependencies": "^27.2.5", + "jest-runner": "^27.2.5", + "jest-runtime": "^27.2.5", + "jest-snapshot": "^27.2.5", + "jest-util": "^27.2.5", + "jest-validate": "^27.2.5", + "jest-watcher": "^27.2.5", + "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -1491,19 +1411,10 @@ "color-convert": "^2.0.1" } }, - "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" - } - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1525,37 +1436,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } - }, "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1572,12 +1458,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { @@ -1588,66 +1474,58 @@ "requires": { "has-flag": "^4.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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.5.tgz", + "integrity": "sha512-XvUW3q6OUF+54SYFCgbbfCd/BKTwm5b2MGLoc2jINXQLKQDTCS2P2IrpPOtQ08WWZDGzbhAzVhOYta3J2arubg==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^27.2.5" } }, "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.5.tgz", + "integrity": "sha512-ZGUb6jg7BgwY+nmO0TW10bc7z7Hl2G/UTAvmxEyZ/GgNFoa31tY9/cgXmqcxnnZ7o5Xs7RAOz3G1SKIj8IVDlg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^27.2.5", + "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^27.2.5", + "jest-mock": "^27.2.5", + "jest-util": "^27.2.5" } }, "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.5.tgz", + "integrity": "sha512-naRI537GM+enFVJQs6DcwGYPn/0vgJNb06zGVbzXfDfe/epDPV73hP1vqO37PqSKDeOXM2KInr6ymYbL1HTP7g==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^27.2.5", + "@jest/types": "^27.2.5", + "expect": "^27.2.5" } }, "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.5.tgz", + "integrity": "sha512-zYuR9fap3Q3mxQ454VWF8I6jYHErh368NwcKHWO2uy2fwByqBzRHkf9j2ekMDM7PaSTWcLBSZyd7NNxR1iHxzQ==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.2.5", + "@jest/test-result": "^27.2.5", + "@jest/transform": "^27.2.5", + "@jest/types": "^27.2.5", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -1658,16 +1536,15 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", + "jest-haste-map": "^27.2.5", + "jest-resolve": "^27.2.5", + "jest-util": "^27.2.5", + "jest-worker": "^27.2.5", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" + "v8-to-istanbul": "^8.1.0" }, "dependencies": { "ansi-styles": { @@ -1680,9 +1557,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1734,9 +1611,9 @@ } }, "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -1753,47 +1630,46 @@ } }, "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.5.tgz", + "integrity": "sha512-ub7j3BrddxZ0BdSnM5JCF6cRZJ/7j3wgdX0+Dtwhw2Po+HKsELCiXUTvh+mgS4/89mpnU1CPhZxe2mTvuLPJJg==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.2.5", + "@jest/types": "^27.2.5", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.5.tgz", + "integrity": "sha512-8j8fHZRfnjbbdMitMAGFKaBZ6YqvFRFJlMJzcy3v75edTOqc7RY65S9JpMY6wT260zAcL2sTQRga/P4PglCu3Q==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", + "@jest/test-result": "^27.2.5", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "jest-haste-map": "^27.2.5", + "jest-runtime": "^27.2.5" } }, "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.5.tgz", + "integrity": "sha512-29lRtAHHYGALbZOx343v0zKmdOg4Sb0rsA1uSv0818bvwRhs3TyElOmTVXlrw0v1ZTqXJCAH/cmoDXimBhQOJQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", + "jest-haste-map": "^27.2.5", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.2.5", + "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", @@ -1809,19 +1685,10 @@ "color-convert": "^2.0.1" } }, - "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" - } - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1843,37 +1710,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } - }, "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1894,28 +1736,19 @@ "requires": { "has-flag": "^4.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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz", + "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "dependencies": { @@ -1929,9 +1762,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1971,59 +1804,70 @@ } }, "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "optional": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "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" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" } }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz", + "integrity": "sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, "@speckle/objectloader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@speckle/objectloader/-/objectloader-2.1.1.tgz", - "integrity": "sha512-EdMBYixK//8OrL/8aLvOkjNbEJab59FZyMETcPW9hgwo/M4a0pX6ao9LTrHyBMCGpjx5iyidk8SDpExebAtARw==", + "version": "file:../objectloader", "dev": true }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, "@types/babel__core": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", - "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2034,18 +1878,18 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2053,18 +1897,18 @@ } }, "@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, "@types/eslint": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", - "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.1.tgz", + "integrity": "sha512-XhZKznR3i/W5dXqUhgU9fFdJekufbeBd5DALmkuXoeFcjbQcPk+2cL+WLHf6Q81HWAnM2vrslIHpGVyCAviRwg==", "dev": true, "requires": { "@types/estree": "*", @@ -2072,9 +1916,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", "dev": true, "requires": { "@types/eslint": "*", @@ -2082,15 +1926,15 @@ } }, "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -2098,20 +1942,29 @@ } }, "@types/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", "dev": true }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -2128,9 +1981,9 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" @@ -2143,308 +1996,221 @@ "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/node": { - "version": "14.14.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", - "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "16.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.9.tgz", + "integrity": "sha512-H9ReOt+yqIJPCutkTYjFjlyK6WEMQYT9hLZMlWtOjFQY2ItppsWZ6RJf8Aw+jz5qTYceuHvFgPIaKOHtLAEWBw==", "dev": true }, "@types/prettier": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", - "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==", "dev": true }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", - "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", - "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@types/webpack": { - "version": "4.41.25", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", - "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", - "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "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 - } - } - }, - "@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, "@webassemblyjs/ast": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz", - "integrity": "sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.1", - "@webassemblyjs/helper-wasm-bytecode": "1.9.1", - "@webassemblyjs/wast-parser": "1.9.1" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz", - "integrity": "sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz", - "integrity": "sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz", - "integrity": "sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz", - "integrity": "sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.1" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz", - "integrity": "sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz", - "integrity": "sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.1" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz", - "integrity": "sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz", - "integrity": "sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/helper-buffer": "1.9.1", - "@webassemblyjs/helper-wasm-bytecode": "1.9.1", - "@webassemblyjs/wasm-gen": "1.9.1" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz", - "integrity": "sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.1.tgz", - "integrity": "sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.1.tgz", - "integrity": "sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz", - "integrity": "sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/helper-buffer": "1.9.1", - "@webassemblyjs/helper-wasm-bytecode": "1.9.1", - "@webassemblyjs/helper-wasm-section": "1.9.1", - "@webassemblyjs/wasm-gen": "1.9.1", - "@webassemblyjs/wasm-opt": "1.9.1", - "@webassemblyjs/wasm-parser": "1.9.1", - "@webassemblyjs/wast-printer": "1.9.1" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz", - "integrity": "sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/helper-wasm-bytecode": "1.9.1", - "@webassemblyjs/ieee754": "1.9.1", - "@webassemblyjs/leb128": "1.9.1", - "@webassemblyjs/utf8": "1.9.1" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz", - "integrity": "sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/helper-buffer": "1.9.1", - "@webassemblyjs/wasm-gen": "1.9.1", - "@webassemblyjs/wasm-parser": "1.9.1" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz", - "integrity": "sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/helper-api-error": "1.9.1", - "@webassemblyjs/helper-wasm-bytecode": "1.9.1", - "@webassemblyjs/ieee754": "1.9.1", - "@webassemblyjs/leb128": "1.9.1", - "@webassemblyjs/utf8": "1.9.1" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz", - "integrity": "sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/floating-point-hex-parser": "1.9.1", - "@webassemblyjs/helper-api-error": "1.9.1", - "@webassemblyjs/helper-code-frame": "1.9.1", - "@webassemblyjs/helper-fsm": "1.9.1", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz", - "integrity": "sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/wast-parser": "1.9.1", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true + }, "@webpack-cli/info": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", - "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", - "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", "dev": true }, "@xtuc/ieee754": { @@ -2476,9 +2242,9 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, "acorn-globals": { @@ -2489,12 +2255,26 @@ "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true + }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "acorn-walk": { @@ -2503,6 +2283,25 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2515,12 +2314,6 @@ "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.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -2534,26 +2327,26 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" }, "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==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-regex": { @@ -2572,24 +2365,13 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "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" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "argparse": { @@ -2601,24 +2383,6 @@ "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-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -2640,39 +2404,6 @@ "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" - } - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -2682,42 +2413,12 @@ "lodash": "^4.17.14" } }, - "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-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -2786,16 +2487,16 @@ } }, "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.5.tgz", + "integrity": "sha512-GC9pWCcitBhSuF7H3zl0mftoKizlswaF0E3qi+rPL417wKkCB0d+Sjjb0OfXvxj7gWiBf497ldgRMii68Xz+2g==", "dev": true, "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", + "@jest/transform": "^27.2.5", + "@jest/types": "^27.2.5", + "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "babel-preset-jest": "^27.2.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -2811,9 +2512,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -2919,9 +2620,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz", + "integrity": "sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -2930,6 +2631,36 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", @@ -2969,12 +2700,12 @@ } }, "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz", + "integrity": "sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^27.2.0", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -3070,81 +2801,17 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "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" - } - } - } - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "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", @@ -3152,21 +2819,11 @@ "dev": true }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "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" - } - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -3233,32 +2890,12 @@ } }, "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" } }, "browser-process-hrtime": { @@ -3268,48 +2905,22 @@ "dev": true }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "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 }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.739", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", - "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", - "dev": true - }, - "node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", - "dev": true - } + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" } }, "bser": { @@ -3339,31 +2950,14 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "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" - } - }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -3383,9 +2977,9 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -3397,23 +2991,14 @@ "dev": true }, "camera-controls": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-1.28.0.tgz", - "integrity": "sha512-V9HIwjcdD843RpToJjW2fUZfZUQaFIA2/Wx87+zq781/tJGzjE1g1PBeMTOV8oTGl8cskS5yV8AqtBn9+HlrUQ==" + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-1.33.0.tgz", + "integrity": "sha512-QTXwz/XbLCPGf7l6u9cWKfR3WwKulnNAahfg+RE+dFOAQ40KKvwTIvBs3Q29kqntJlKvY79ZVsmPUEUA6LoF2A==" }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==", "dev": true }, "chalk": { @@ -3434,69 +3019,39 @@ "dev": true }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "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" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" } }, "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" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", "dev": true }, "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -3514,72 +3069,72 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "clean-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", "dev": true, "requires": { - "@types/webpack": "^4.4.31", "del": "^4.1.1" } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3596,9 +3151,9 @@ "dev": true }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "combined-stream": { @@ -3622,12 +3177,6 @@ "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 - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3691,9 +3240,9 @@ "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==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -3711,12 +3260,6 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -3724,12 +3267,12 @@ "dev": true }, "core-js-compat": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.2.tgz", - "integrity": "sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", "dev": true, "requires": { - "browserslist": "^4.16.0", + "browserslist": "^4.17.3", "semver": "7.0.0" }, "dependencies": { @@ -3742,9 +3285,9 @@ } }, "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=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "cross-env": { @@ -3800,42 +3343,33 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" } }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, "cssom": { @@ -3861,15 +3395,6 @@ } } }, - "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", @@ -3882,9 +3407,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -3899,21 +3424,21 @@ } }, "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "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=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, "deep-equal": { @@ -3931,9 +3456,9 @@ } }, "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=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { @@ -3943,15 +3468,20 @@ "dev": true }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3961,47 +3491,6 @@ "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" - } - } - } - }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -4042,23 +3531,32 @@ "dev": true }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -4103,27 +3601,20 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } } }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, "domexception": { @@ -4144,22 +3635,23 @@ } }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "dot-case": { @@ -4173,33 +3665,29 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "electron-to-chromium": { + "version": "1.3.868", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.868.tgz", + "integrity": "sha512-kZYCHqwJ1ctGrYDlOcWQH+/AftAm/KD4lEnLDNwS0kKwx1x6dU4zv+GuDjsPPOGn/2TjnKBaZjDyjXaoix0q/A==", + "dev": true + }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true }, "emoji-regex": { @@ -4220,19 +3708,10 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "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": "5.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", - "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -4249,45 +3728,22 @@ } }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "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-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true }, "escalade": { "version": "3.1.1", @@ -4308,76 +3764,122 @@ "dev": true }, "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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 + }, "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 + }, + "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" + } } } }, "eslint": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", - "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", + "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.1", + "@eslint/eslintrc": "^1.0.3", + "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^6.0.1", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.1.0", + "regexpp": "^3.2.0", "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -4389,10 +3891,16 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4414,30 +3922,47 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, + "eslint-visitor-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "dev": true + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -4449,42 +3974,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "argparse": "^2.0.1" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -4494,28 +3992,13 @@ "lru-cache": "^6.0.0" } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { @@ -4526,30 +4009,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -4564,20 +4023,12 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { @@ -4587,20 +4038,20 @@ "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", "dev": true, "requires": { - "acorn": "^7.4.0", + "acorn": "^8.5.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", "dev": true } } @@ -4670,39 +4121,26 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" } }, "exit": { @@ -4711,86 +4149,24 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "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" - } - } - } - }, "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", + "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" + "@jest/types": "^27.2.5", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-regex-util": "^27.0.6" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -4850,110 +4226,25 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "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", @@ -4972,10 +4263,19 @@ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -4999,34 +4299,13 @@ "flat-cache": "^3.0.4" } }, - "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" } }, "finalhandler": { @@ -5087,6 +4366,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -5109,61 +4394,46 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, - "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" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -5177,15 +4447,11 @@ "dev": true }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -5212,9 +4478,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -5229,33 +4495,15 @@ "dev": true }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "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", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -5267,24 +4515,12 @@ } }, "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.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "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-to-regexp": { @@ -5321,46 +4557,23 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5386,41 +4599,18 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, - "has-value": { + "has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "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" - } - } + "has-symbols": "^1.0.2" } }, "he": { @@ -5429,12 +4619,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -5461,15 +4645,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "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" - } } } }, @@ -5483,9 +4658,9 @@ } }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", "dev": true }, "html-escaper": { @@ -5537,61 +4712,28 @@ } }, "html-webpack-plugin": { - "version": "5.0.0-beta.4", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.0.0-beta.4.tgz", - "integrity": "sha512-4CWq246BVHfS2l8Ni68q/oWquwJuaHs5s2Z+yVCmKNWadxS28RAqZo98hMtpnTLwhbhIg04psduDMcUr9JJpXg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz", + "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", "dev": true, "requires": { "@types/html-minifier-terser": "^5.0.0", "html-minifier-terser": "^5.0.1", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", + "lodash": "^4.17.21", + "pretty-error": "^3.0.4", "tapable": "^2.0.0" - }, - "dependencies": { - "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" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - } + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "http-deceiver": { @@ -5638,33 +4780,52 @@ "requires-port": "^1.0.0" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -5716,6 +4877,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5733,13 +4900,23 @@ "dev": true }, "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", "dev": true, "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "interpret": { @@ -5757,12 +4934,6 @@ "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": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -5770,86 +4941,43 @@ "dev": true }, "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", "dev": true }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "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.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "ci-info": "^3.1.1" } }, "is-core-module": { @@ -5861,62 +4989,19 @@ "has": "^1.0.3" } }, - "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "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 - } + "has-tostringtag": "^1.0.0" } }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, "is-extglob": { @@ -5938,34 +5023,29 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", "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" - } - } + "ip-regex": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -5990,6 +5070,12 @@ "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6000,52 +5086,47 @@ } }, "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": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "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==", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "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 + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -6065,16 +5146,10 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", + "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==", "dev": true }, "istanbul-lib-instrument": { @@ -6127,9 +5202,9 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -6146,9 +5221,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -6156,14 +5231,14 @@ } }, "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.5.tgz", + "integrity": "sha512-vDMzXcpQN4Ycaqu+vO7LX8pZwNNoKMhc+gSp6q1D8S6ftRk8gNW8cni3YFxknP95jxzQo23Lul0BI2FrWgnwYQ==", "dev": true, "requires": { - "@jest/core": "^26.6.3", + "@jest/core": "^27.2.5", "import-local": "^3.0.2", - "jest-cli": "^26.6.3" + "jest-cli": "^27.2.5" }, "dependencies": { "ansi-styles": { @@ -6176,9 +5251,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6207,24 +5282,23 @@ "dev": true }, "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.5.tgz", + "integrity": "sha512-XzfcOXi5WQrXqFYsDxq5RDOKY4FNIgBgvgf3ZBz4e/j5/aWep5KnsAYH5OFPMdX/TP/LFsYQMRH7kzJUMh6JKg==", "dev": true, "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^27.2.5", + "@jest/test-result": "^27.2.5", + "@jest/types": "^27.2.5", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-config": "^27.2.5", + "jest-util": "^27.2.5", + "jest-validate": "^27.2.5", "prompts": "^2.0.1", - "yargs": "^15.4.1" + "yargs": "^16.2.0" } }, "supports-color": { @@ -6237,145 +5311,58 @@ } }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } }, "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.2.5.tgz", + "integrity": "sha512-jfnNJzF89csUKRPKJ4MwZ1SH27wTmX2xiAIHUHrsb/OYd9Jbo4/SXxJ17/nnx6RIifpthk3Y+LEeOk+/dDeGdw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "@jest/types": "^27.2.5", + "execa": "^5.0.0", + "throat": "^6.0.1" } }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "jest-circus": { + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.5.tgz", + "integrity": "sha512-eyL9IcrAxm3Saq3rmajFCwpaxaRMGJ1KJs+7hlTDinXpJmeR3P02bheM3CYohE7UfwOBmrFMJHjgo/WPcLTM+Q==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@jest/environment": "^27.2.5", + "@jest/test-result": "^27.2.5", + "@jest/types": "^27.2.5", + "@types/node": "*", "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.2.5", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.2.5", + "jest-matcher-utils": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-runtime": "^27.2.5", + "jest-snapshot": "^27.2.5", + "jest-util": "^27.2.5", + "pretty-format": "^27.2.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -6387,19 +5374,10 @@ "color-convert": "^2.0.1" } }, - "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" - } - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6421,37 +5399,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } - }, "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6460,28 +5419,36 @@ "requires": { "has-flag": "^4.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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "jest-config": { + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.5.tgz", + "integrity": "sha512-QdENtn9b5rIIYGlbDNEcgY9LDL5kcokJnXrp7x8AGjHob/XFqw1Z6p+gjfna2sUulQsQ3ce2Fvntnv+7fKYDhQ==", "dev": true, "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.2.5", + "@jest/types": "^27.2.5", + "babel-jest": "^27.2.5", "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.2.5", + "jest-environment-jsdom": "^27.2.5", + "jest-environment-node": "^27.2.5", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.2.5", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.2.5", + "jest-runner": "^27.2.5", + "jest-util": "^27.2.5", + "jest-validate": "^27.2.5", + "micromatch": "^4.0.4", + "pretty-format": "^27.2.5" }, "dependencies": { "ansi-styles": { @@ -6494,9 +5461,72 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.5.tgz", + "integrity": "sha512-7gfwwyYkeslOOVQY4tVq5TaQa92mWfC9COsVYMNVYyJTOYAqbIkoD3twi5A+h+tAPtAelRxkqY6/xu+jwTr0dA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.2.5" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6536,25 +5566,25 @@ } }, "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.5.tgz", + "integrity": "sha512-HUPWIbJT0bXarRwKu/m7lYzqxR4GM5EhKOsu0z3t0SKtbFN6skQhpAUADM4qFShBXb9zoOuag5lcrR1x/WM+Ag==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.0.6", + "jest-util": "^27.2.5", + "pretty-format": "^27.2.5" }, "dependencies": { "ansi-styles": { @@ -6567,9 +5597,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6609,148 +5639,85 @@ } }, "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.5.tgz", + "integrity": "sha512-QtRpOh/RQKuXniaWcoFE2ElwP6tQcyxHu0hlk32880g0KczdonCs5P1sk5+weu/OVzh5V4Bt1rXuQthI01mBLg==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.2.5", + "@jest/fake-timers": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-mock": "^27.2.5", + "jest-util": "^27.2.5", + "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.5.tgz", + "integrity": "sha512-0o1LT4grm7iwrS8fIoLtwJxb/hoa3GsH7pP10P02Jpj7Mi4BXy65u46m89vEM2WfD1uFJQ2+dfDiWZNA2e6bJg==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.2.5", + "@jest/fake-timers": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^27.2.5", + "jest-util": "^27.2.5" } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", "dev": true }, "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.5.tgz", + "integrity": "sha512-pzO+Gw2WLponaSi0ilpzYBE0kuVJstoXBX8YWyUebR8VaXuX4tzzn0Zp23c/WaETo7XYTGv2e8KdnpiskAFMhQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", + "fsevents": "^2.3.2", "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.2.5", + "jest-worker": "^27.2.5", + "micromatch": "^4.0.4", "walker": "^1.0.7" - }, - "dependencies": { - "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" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.2.tgz", - "integrity": "sha512-xJEn9cTLpaYpLA/ACD3wjQRA7unhS0b7veAzx6F8cVhi8yjwjAPzHsVibMIAWwwMVHixe6WqoFXlc36FsNM80w==", - "dev": true, - "optional": 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 - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } } }, "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.5.tgz", + "integrity": "sha512-hdxY9Cm/CjLqu2tXeAoQHPgA4vcqlweVXYOg1+S9FeFdznB9Rti+eEBKDDkmOy9iqr4Xfbq95OkC4NFbXXPCAQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.2.5", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.2", + "expect": "^27.2.5", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "jest-each": "^27.2.5", + "jest-matcher-utils": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-runtime": "^27.2.5", + "jest-snapshot": "^27.2.5", + "jest-util": "^27.2.5", + "pretty-format": "^27.2.5", + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -6763,9 +5730,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6805,25 +5772,25 @@ } }, "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.5.tgz", + "integrity": "sha512-HYsi3GUR72bYhOGB5C5saF9sPdxGzSjX7soSQS+BqDRysc7sPeBwPbhbuT8DnOpijnKjgwWQ8JqvbmReYnt3aQ==", "dev": true, "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.0.6", + "pretty-format": "^27.2.5" } }, "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", + "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^27.2.5", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.2.5" }, "dependencies": { "ansi-styles": { @@ -6836,9 +5803,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6878,20 +5845,20 @@ } }, "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.5.tgz", + "integrity": "sha512-ggXSLoPfIYcbmZ8glgEJZ8b+e0Msw/iddRmgkoO7lDAr9SmI65IIfv7VnvTnV4FGnIIUIjzM+fHRHO5RBvyAbQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.2.5", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.2.5", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" }, "dependencies": { "ansi-styles": { @@ -6903,19 +5870,10 @@ "color-convert": "^2.0.1" } }, - "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" - } - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6937,37 +5895,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } - }, "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6982,25 +5915,16 @@ "requires": { "has-flag": "^4.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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.2.5.tgz", + "integrity": "sha512-HiMB3LqE9RzmeMzZARi2Bz3NoymxyP0gCid4y42ca1djffNtYFKgI220aC1VP1mUZ8rbpqZbHZOJ15093bZV/Q==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "@types/node": "*" } }, @@ -7011,24 +5935,26 @@ "dev": true }, "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", "dev": true }, "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.5.tgz", + "integrity": "sha512-q5irwS3oS73SKy3+FM/HL2T7WJftrk9BRzrXF92f7net5HMlS7lJMg/ZwxLB4YohKqjSsdksEw7n/jvMxV7EKg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "chalk": "^4.0.0", + "escalade": "^3.1.1", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.2.5", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^27.2.5", + "jest-validate": "^27.2.5", + "resolve": "^1.20.0", "slash": "^3.0.0" }, "dependencies": { @@ -7042,9 +5968,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7072,6 +5998,16 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7090,42 +6026,44 @@ } }, "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.5.tgz", + "integrity": "sha512-BSjefped31bcvvCh++/pN9ueqqN1n0+p8/58yScuWfklLm2tbPbS9d251vJhAy0ZI2pL/0IaGhOTJrs9Y4FJlg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "@jest/types": "^27.2.5", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.2.5" } }, "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.5.tgz", + "integrity": "sha512-n41vw9RLg5TKAnEeJK9d6pGOsBOpwE89XBniK+AD1k26oIIy3V7ogM1scbDjSheji8MUPC9pNgCrZ/FHLVDNgg==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.2.5", + "@jest/environment": "^27.2.5", + "@jest/test-result": "^27.2.5", + "@jest/transform": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.2.5", + "jest-environment-node": "^27.2.5", + "jest-haste-map": "^27.2.5", + "jest-leak-detector": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-resolve": "^27.2.5", + "jest-runtime": "^27.2.5", + "jest-util": "^27.2.5", + "jest-worker": "^27.2.5", "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -7138,9 +6076,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7180,38 +6118,38 @@ } }, "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.5.tgz", + "integrity": "sha512-N0WRZ3QszKyZ3Dm27HTBbBuestsSd3Ud5ooVho47XZJ8aSKO/X1Ag8M1dNx9XzfGVRNdB/xCA3lz8MJwIzPLLA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "@jest/console": "^27.2.5", + "@jest/environment": "^27.2.5", + "@jest/fake-timers": "^27.2.5", + "@jest/globals": "^27.2.5", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.2.5", + "@jest/transform": "^27.2.5", + "@jest/types": "^27.2.5", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-haste-map": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-mock": "^27.2.5", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.2.5", + "jest-snapshot": "^27.2.5", + "jest-util": "^27.2.5", + "jest-validate": "^27.2.5", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.4.1" + "yargs": "^16.2.0" }, "dependencies": { "ansi-styles": { @@ -7224,9 +6162,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7270,30 +6208,26 @@ } }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } }, "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", "dev": true, "requires": { "@types/node": "*", @@ -7301,26 +6235,34 @@ } }, "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.5.tgz", + "integrity": "sha512-2/Jkn+VN6Abwz0llBltZaiJMnL8b1j5Bp/gRIxe9YR3FCEh9qp0TXVV0dcpTGZ8AcJV1SZGQkczewkI9LP5yGw==", "dev": true, "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", + "@jest/transform": "^27.2.5", + "@jest/types": "^27.2.5", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", + "expect": "^27.2.5", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "jest-diff": "^27.2.5", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.2.5", + "jest-matcher-utils": "^27.2.5", + "jest-message-util": "^27.2.5", + "jest-resolve": "^27.2.5", + "jest-util": "^27.2.5", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", + "pretty-format": "^27.2.5", "semver": "^7.3.2" }, "dependencies": { @@ -7334,9 +6276,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7365,9 +6307,9 @@ "dev": true }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -7385,17 +6327,17 @@ } }, "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.5.tgz", + "integrity": "sha512-QRhDC6XxISntMzFRd/OQ6TGsjbzA5ONO0tlAj2ElHs155x1aEr0rkYJBEysG6H/gZVH3oGFzCdAB/GA8leh8NQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" }, "dependencies": { "ansi-styles": { @@ -7407,19 +6349,10 @@ "color-convert": "^2.0.1" } }, - "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" - } - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7441,37 +6374,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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" - } - }, "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7480,30 +6388,21 @@ "requires": { "has-flag": "^4.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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.5.tgz", + "integrity": "sha512-XgYtjS89nhVe+UfkbLgcm+GgXKWgL80t9nTcNeejyO3t0Sj/yHE8BtIJqjZu9NXQksYbGImoQRXmQ1gP+Guffw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^27.2.5", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^27.2.5" }, "dependencies": { "ansi-styles": { @@ -7522,9 +6421,9 @@ "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7564,17 +6463,17 @@ } }, "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.5.tgz", + "integrity": "sha512-umV4qGozg2Dn6DTTtqAh9puPw+DGLK9AQas7+mWjiK8t0fWMpxKg8ZXReZw7L4C88DqorsGUiDgwHNZ+jkVrkQ==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^27.2.5", + "@jest/types": "^27.2.5", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "jest-util": "^27.2.5", "string-length": "^4.0.1" }, "dependencies": { @@ -7588,9 +6487,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7630,14 +6529,14 @@ } }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.5.tgz", + "integrity": "sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -7647,9 +6546,9 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -7673,43 +6572,38 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", - "cssstyle": "^2.2.0", + "cssstyle": "^2.3.0", "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", + "decimal.js": "^10.2.1", "domexception": "^2.0.1", - "escodegen": "^1.14.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" } }, @@ -7725,18 +6619,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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", @@ -7749,18 +6631,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -7770,24 +6640,6 @@ "minimist": "^1.2.0" } }, - "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" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -7800,15 +6652,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "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" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -7816,25 +6659,19 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, "loader-runner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", - "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, "loader-utils": { @@ -7863,34 +6700,77 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "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.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, "loose-envify": { "version": "1.4.0", @@ -7911,9 +6791,9 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -7954,78 +6834,19 @@ "tmpl": "1.0.x" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "memfs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", + "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - } - } - }, - "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" - }, - "dependencies": { - "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" - } - }, - "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" - } - } + "fs-monkey": "1.0.3" } }, "merge-descriptors": { @@ -8040,6 +6861,12 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -8047,24 +6874,13 @@ "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.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "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.2.3" } }, "mime": { @@ -8074,18 +6890,18 @@ "dev": true }, "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", "dev": true }, "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", "dev": true, "requires": { - "mime-db": "1.45.0" + "mime-db": "1.50.0" } }, "mimic-fn": { @@ -8115,27 +6931,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "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": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -8146,42 +6941,63 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "ms": "2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -8193,40 +7009,82 @@ } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "minimist": "0.0.8" + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^4.0.0" } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -8252,31 +7110,11 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": 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" - } + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -8296,12 +7134,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -8313,9 +7145,9 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -8338,79 +7170,11 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "node-notifier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } + "node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", + "dev": true }, "normalize-path": { "version": "3.0.0", @@ -8419,91 +7183,42 @@ "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.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": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "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.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -8513,15 +7228,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.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -8534,15 +7240,6 @@ "object-keys": "^1.1.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -8582,105 +7279,40 @@ "mimic-fn": "^2.1.0" } }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "open": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", + "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dev": true, "requires": { - "url-parse": "^1.4.3" + "p-timeout": "^3.1.0" } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "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" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -8712,12 +7344,22 @@ "dev": true }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, "requires": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" } }, "p-try": { @@ -8737,9 +7379,9 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -8753,22 +7395,10 @@ "callsites": "^3.0.0" } }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "parseurl": { @@ -8788,25 +7418,13 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "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-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": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8826,9 +7444,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -8843,16 +7461,22 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, "pify": { @@ -8922,68 +7546,44 @@ } } }, - "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=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", + "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", "dev": true, "requires": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^2.0.6" } }, "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.5.tgz", + "integrity": "sha512-+nYn2z9GgicO9JiqmY25Xtq8SYfZ/5VCpEU3pppHHNAhd1y+ZXxmNPd1evmNcAd6Hz4iBV2kf0UpGth5A/VJ7g==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "@jest/types": "^27.2.5", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -9001,9 +7601,9 @@ "dev": true }, "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -9011,43 +7611,29 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "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 }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -9066,10 +7652,10 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "randombytes": { @@ -9108,42 +7694,11 @@ } }, "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -9156,52 +7711,18 @@ } }, "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.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "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" - } - }, - "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 - }, - "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" - } - } + "picomatch": "^2.2.1" } }, "rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { "resolve": "^1.9.0" @@ -9214,18 +7735,18 @@ "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==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regenerator-transform": { @@ -9237,65 +7758,34 @@ "@babel/runtime": "^7.8.4" } }, - "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" - } - }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "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" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { @@ -9305,9 +7795,9 @@ "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==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -9327,113 +7817,17 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "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 - }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.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" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "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" - } - } + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" } }, "require-directory": { @@ -9442,18 +7836,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9485,22 +7867,16 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rimraf": { @@ -9512,11 +7888,14 @@ "glob": "^7.1.3" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "safe-buffer": { "version": "5.1.2", @@ -9524,38 +7903,12 @@ "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 }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -9583,9 +7936,9 @@ "dev": true }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -9644,9 +7997,9 @@ } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -9714,63 +8067,36 @@ "send": "0.17.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "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" - } - } - } - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -9789,165 +8115,6 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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 - } - } - }, - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "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" - } - } - } - }, "sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -9959,62 +8126,12 @@ "websocket-driver": "^0.7.4" } }, - "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.4.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "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=", "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.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -10033,44 +8150,6 @@ } } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -10098,42 +8177,16 @@ "wbuf": "^1.7.3" } }, - "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" - } - }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -10147,43 +8200,16 @@ } } }, - "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" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "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 - }, "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -10191,85 +8217,57 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } }, "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "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.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -10287,12 +8285,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -10315,9 +8307,9 @@ } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -10347,55 +8339,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", - "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "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 - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "tapable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", @@ -10413,14 +8356,14 @@ } }, "terser": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", - "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "commander": { @@ -10434,23 +8377,47 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "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 + } + } } } }, "terser-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { - "jest-worker": "^26.6.1", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.8" + "terser": "^5.7.2" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10461,12 +8428,12 @@ } }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -10497,14 +8464,14 @@ "dev": true }, "three": { - "version": "0.124.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.124.0.tgz", - "integrity": "sha512-ROXp1Ly7YyF+jC910DQyAWj++Qlw2lQv0qwYLNQwdDbjk4bsOXAfGO92wYTMPNei1GMJUmCxSxc3MjGBTS09Rg==" + "version": "0.133.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.133.1.tgz", + "integrity": "sha512-WydohO8ll949B0FTD6MGz59Yv2Lwj8hvObg/0Heh2r42S6+tQC1WByfCNRdmG4D7+odfGod+n8JPV1I2xrboWw==" }, "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, "thunky": { @@ -10525,46 +8492,13 @@ "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" } }, "toidentifier": { @@ -10574,53 +8508,32 @@ "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "requires": { "punycode": "^2.1.1" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -10630,9 +8543,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -10655,44 +8568,38 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "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" - } + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true }, "unpipe": { "version": "1.0.0", @@ -10700,52 +8607,6 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "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.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -10755,12 +8616,6 @@ "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", @@ -10779,22 +8634,6 @@ } } }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "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-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10820,15 +8659,15 @@ "dev": true }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -10844,33 +8683,12 @@ } } }, - "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" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "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" - } - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -10899,9 +8717,9 @@ } }, "watchpack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz", - "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -10924,96 +8742,50 @@ "dev": true }, "webpack": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.0.tgz", - "integrity": "sha512-ubWv7iP54RqAC/VjixgpnLLogCFbAfSOREcSWnnOlZEU8GICC5eKmJSu6YEnph2N2amKqY9rvxSwgyHxVqpaRw==", + "version": "5.58.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.58.2.tgz", + "integrity": "sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.45", - "@webassemblyjs/ast": "1.9.1", - "@webassemblyjs/helper-module-context": "1.9.1", - "@webassemblyjs/wasm-edit": "1.9.1", - "@webassemblyjs/wasm-parser": "1.9.1", - "acorn": "^8.0.4", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.3.1", - "eslint-scope": "^5.1.1", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.4", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.1.0", + "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "pkg-dir": "^5.0.0", - "schema-utils": "^3.0.0", + "schema-utils": "^3.1.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.0.3", - "watchpack": "^2.0.0", - "webpack-sources": "^2.1.1" + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" }, "dependencies": { - "acorn": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", - "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -11021,30 +8793,30 @@ } }, "webpack-cli": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", - "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.0.tgz", + "integrity": "sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/info": "^1.2.1", - "@webpack-cli/serve": "^1.2.1", - "colorette": "^1.2.1", - "commander": "^6.2.0", - "enquirer": "^2.3.6", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", "execa": "^5.0.0", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", "rechoir": "^0.7.0", "v8-compile-cache": "^2.2.0", - "webpack-merge": "^4.2.2" + "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, "cross-spawn": { @@ -11059,9 +8831,9 @@ } }, "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -11076,9 +8848,9 @@ } }, "get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "human-signals": { @@ -11088,9 +8860,9 @@ "dev": true }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { @@ -11135,322 +8907,197 @@ } }, "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz", + "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==", "dev": true, "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^3.1.0" }, "dependencies": { - "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, "webpack-dev-server": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.3.1.tgz", + "integrity": "sha512-qNXQCVYo1kYhH9pgLtm8LRNkXX3XzTfHSj/zqzaqYzGPca+Qjr+81wj1jgPMCHhIhso9WEQ+kX9z23iG9PzQ7w==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.1", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.1.0", + "selfsigned": "^1.10.11", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", + "strip-ansi": "^7.0.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^5.2.1", + "ws": "^8.1.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "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" - } - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.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=", + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "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" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "aggregate-error": "^3.0.0" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "glob": "^7.1.3" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, "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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "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" - }, - "dependencies": { - "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" - } - } - } + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, - "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==", + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "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" - } - } + "ansi-regex": "^6.0.1" } }, "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true } } }, "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "lodash": "^4.17.15" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", - "dev": true, - "requires": { - "source-list-map": "^2.0.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 - } - } + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "dev": true }, "websocket-driver": { "version": "0.7.4", @@ -11485,29 +9132,29 @@ "dev": true }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { + "wildcard": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, "word-wrap": { @@ -11516,10 +9163,16 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -11528,9 +9181,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -11558,12 +9211,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -11587,9 +9240,9 @@ } }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", "dev": true }, "xml-name-validator": { @@ -11605,9 +9258,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { @@ -11617,206 +9270,44 @@ "dev": true }, "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.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 - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "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" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "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 - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "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 - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "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" - } - }, - "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": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - } - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } } }, "yocto-queue": { diff --git a/packages/viewer/package.json b/packages/viewer/package.json index 91a0ef69e..db4d966cd 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -14,7 +14,7 @@ "dist" ], "scripts": { - "serve": "webpack serve --env dev --config webpack.config.example.js", + "serve": "webpack serve --env dev --config webpack.config.example.js --port 9002", "dev": "webpack --progress --watch --env dev", "build": "webpack --env dev && webpack --env build", "prepublishOnly": "npm run build" @@ -29,32 +29,33 @@ "threejs" ], "devDependencies": { - "@babel/cli": "7.12.10", - "@babel/core": "7.12.10", - "@babel/eslint-parser": "^7.12.1", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/preset-env": "7.12.11", - "@babel/preset-react": "7.12.10", - "@babel/preset-typescript": "7.12.7", - "@speckle/objectloader": "^2.0.0", - "babel-jest": "26.6.3", + "@babel/cli": "7.15.7", + "@babel/core": "7.15.8", + "@babel/eslint-parser": "^7.15.8", + "@babel/plugin-proposal-class-properties": "7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/preset-env": "7.15.8", + "@babel/preset-react": "7.14.5", + "@babel/preset-typescript": "7.15.0", + "@speckle/objectloader": "file:../objectloader", + "babel-jest": "27.2.5", "babel-loader": "^8.0.0-beta.4", "babel-plugin-add-module-exports": "1.0.4", "babel-plugin-transform-class-properties": "6.24.1", - "clean-webpack-plugin": "^3.0.0", + "clean-webpack-plugin": "^4.0.0", "cross-env": "7.0.3", - "eslint": "^7.26.0", - "html-webpack-plugin": "^5.0.0-beta.4", - "jest": "26.6.3", - "mocha": "^4.0.1", - "webpack": "5.11.0", - "webpack-cli": "^4.3.1", - "webpack-dev-server": "^3.11.1", - "yargs": "^10.0.3" + "eslint": "^8.0.1", + "html-webpack-plugin": "^5.3.2", + "jest": "27.2.5", + "mocha": "^9.1.2", + "webpack": "5.58.2", + "webpack-cli": "^4.9.0", + "webpack-dev-server": "^4.3.1", + "yargs": "^17.2.1" }, "dependencies": { - "camera-controls": "^1.28.0", + "camera-controls": "^1.33.0", "lodash.debounce": "^4.0.8", - "three": "0.124.0" + "three": "^0.133.1" } } diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index a7020d472..7d8fb6690 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -1,58 +1,67 @@ - - - - Speckle Viewer - - - - - - - - -
-
-
-

Viewer

-
Controls summary:
-

Click an object to select it. Double click it to focus on it. Press `esc` to clear the selection. Press `shift-s` to toggle a section plane. Press `s` while the section plane is active to toggle its control mode. Double click anywhere outside an object to zoom extents to the entire scene.

-
-
- - - - - -
-
- - -
-
- - View: - - - - - -
-
-
-
-
-
-
-
-
+ -
+ + + Speckle Viewer + + + + + + + + + +
+
+
+

Viewer

+
Controls summary:
+

Click an object to select it. Double click it to focus on it. Press `esc` to clear the + selection. Press `shift-s` to toggle a section plane. Press `s` while the section plane is active to toggle + its control mode. Double click anywhere outside an object to zoom extents to the entire scene.

+
+
+ + + + + +
+
+ + +
+
+ + View: + + + + + +
- - +
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/packages/viewer/src/modules/Converter.js b/packages/viewer/src/modules/Converter.js index 48f1f79b2..ce8c81e5b 100644 --- a/packages/viewer/src/modules/Converter.js +++ b/packages/viewer/src/modules/Converter.js @@ -1,5 +1,5 @@ import * as THREE from 'three' -import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils' +import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' import ObjectWrapper from './ObjectWrapper' import { getConversionFactor } from './Units' @@ -308,7 +308,7 @@ export default class Coverter { buffer.computeVertexNormals( ) - buffer.computeFaceNormals( ) + //buffer.computeFaceNormals( ) buffer.computeBoundingSphere( ) // delete obj.vertices diff --git a/packages/viewer/src/modules/Filtering.js b/packages/viewer/src/modules/Filtering.js new file mode 100644 index 000000000..1ebdde8eb --- /dev/null +++ b/packages/viewer/src/modules/Filtering.js @@ -0,0 +1,10 @@ + +export function filterAndColorObject( obj, filter ) { + if ( !filter ) + return obj.clone() + + if ( filter.speckle_type && obj.userData?.speckle_type !== filter.speckle_type ) + return null + + return obj.clone() +} diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index d4dab3a1d..61cabc843 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -7,20 +7,20 @@ export default class InteractionHandler { constructor( viewer ) { this.viewer = viewer - this.sectionBox = new SectionBox( this.viewer ) - this.sectionBox.toggle() // switch off + //this.sectionBox = new SectionBox( this.viewer ) + //this.sectionBox.toggle() // switch off this.preventSelection = false this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.viewer.sceneManager.userObjects, sectionBox: this.sectionBox } ) this.selectionMeshMaterial = new THREE.MeshLambertMaterial( { color: 0x0B55D2, emissive: 0x0B55D2, side: THREE.DoubleSide } ) - this.selectionMeshMaterial.clippingPlanes = this.sectionBox.planes + //this.selectionMeshMaterial.clippingPlanes = this.sectionBox.planes this.selectionLineMaterial = new THREE.LineBasicMaterial( { color: 0x0B55D2 } ) - this.selectionLineMaterial.clippingPlanes = this.sectionBox.planes + //this.selectionLineMaterial.clippingPlanes = this.sectionBox.planes this.selectionEdgesMaterial = new THREE.LineBasicMaterial( { color: 0x23F3BD } ) - this.selectionEdgesMaterial.clippingPlanes = this.sectionBox.planes + //this.selectionEdgesMaterial.clippingPlanes = this.sectionBox.planes this.selectedObjects = new THREE.Group() this.viewer.scene.add( this.selectedObjects ) @@ -31,7 +31,7 @@ export default class InteractionHandler { this.selectionHelper.on( 'object-doubleclicked', this._handleDoubleClick.bind( this ) ) this.selectionHelper.on( 'object-clicked', this._handleSelect.bind( this ) ) - this.viewer.sceneManager.materials.forEach( mat => mat.clippingPlanes = this.sectionBox.planes ) + // this.viewer.sceneManager.materials.forEach( mat => mat.clippingPlanes = this.sectionBox.planes ) } _handleDoubleClick( objs ) { @@ -113,13 +113,13 @@ export default class InteractionHandler { } hideSectionBox() { - if ( !this.sectionBox.display.visible ) return - this.toggleSectionBox( ) + //if ( !this.sectionBox.display.visible ) return + //this.toggleSectionBox( ) } showSectionBox() { - if ( this.sectionBox.display.visible ) return - this.toggleSectionBox( ) + //if ( this.sectionBox.display.visible ) return + //this.toggleSectionBox( ) } zoomToObject( target, fit = 1.2, transition = true ) { @@ -128,17 +128,17 @@ export default class InteractionHandler { } zoomExtents( fit = 1.2, transition = true ) { - if ( this.sectionBox.display.visible ) { - this.zoomToObject( this.sectionBox.boxMesh ) - return - } - if ( this.viewer.sceneManager.objects.length === 0 ) { + // if ( this.sectionBox.display.visible ) { + // this.zoomToObject( this.sectionBox.boxMesh ) + // return + // } + if ( this.viewer.sceneManager.allObjects.length === 0 ) { let box = new THREE.Box3( new THREE.Vector3( -1,-1,-1 ), new THREE.Vector3( 1,1,1 ) ) this.zoomToBox( box, fit, transition ) return } - let box = new THREE.Box3().setFromObject( this.viewer.sceneManager.userObjects ) + let box = new THREE.Box3().setFromObject( this.viewer.sceneManager.sceneObjects.allObjects ) this.zoomToBox( box, fit, transition ) this.viewer.controls.setBoundary( box ) } diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 299aca39d..8ac05f292 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -1,5 +1,7 @@ import * as THREE from 'three' +import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' import debounce from 'lodash.debounce' +import SceneObjects from './SceneObjects' /** * Manages objects and provides some convenience methods to focus on the entire scene, or one specific object. @@ -9,18 +11,9 @@ export default class SceneObjectManager { constructor( viewer, skipPostLoad = false ) { this.viewer = viewer this.scene = viewer.scene - this.userObjects = new THREE.Group() - this.solidObjects = new THREE.Group() - this.lineObjects = new THREE.Group() - this.pointObjects = new THREE.Group() - this.transparentObjects = new THREE.Group() this.views = [] - this.userObjects.add( this.solidObjects ) - this.userObjects.add( this.transparentObjects ) - this.userObjects.add( this.lineObjects ) - this.userObjects.add( this.pointObjects ) - this.scene.add( this.userObjects ) + this.sceneObjects = new SceneObjects( viewer ) this.solidMaterial = new THREE.MeshStandardMaterial( { color: 0x8D9194, @@ -65,8 +58,12 @@ export default class SceneObjectManager { this.loaders = [] } - get objects() { - return [ ...this.solidObjects.children, ...this.transparentObjects.children, ...this.lineObjects.children, ...this.pointObjects.children ] + get allObjects() { + return [ ...this.sceneObjects.allSolidObjects.children, ...this.sceneObjects.allTransparentObjects.children, ...this.sceneObjects.allLineObjects.children, ...this.sceneObjects.allPointObjects.children ] + } + + get filteredObjects() { + return [ ...this.sceneObjects.filteredSolidObjects.children, ...this.sceneObjects.filteredTransparentObjects.children, ...this.sceneObjects.filteredLineObjects.children, ...this.sceneObjects.filteredPointObjects.children ] } get materials() { @@ -84,6 +81,8 @@ export default class SceneObjectManager { addObject( wrapper, addToScene = true ) { if ( !wrapper || !wrapper.bufferGeometry ) return + this.postLoad() + switch ( wrapper.geometryType ) { case 'View': this.views.push( wrapper.meta ) @@ -105,7 +104,6 @@ export default class SceneObjectManager { return this.addBlock( wrapper, addToScene ) } - this.postLoad() } addSolid( wrapper, addToScene = true ) { @@ -117,7 +115,7 @@ export default class SceneObjectManager { // Is it a transparent material? if ( renderMat.opacity !== 1 ) { let material = this.transparentMaterial.clone() - material.clippingPlanes = this.viewer.interactions.sectionBox.planes + // material.clippingPlanes = this.viewer.interactions.sectionBox.planes material.color = color material.opacity = renderMat.opacity !== 0 ? renderMat.opacity : 0.2 @@ -126,7 +124,7 @@ export default class SceneObjectManager { // It's not a transparent material! } else { let material = this.solidMaterial.clone() - material.clippingPlanes = this.viewer.interactions.sectionBox.planes + // material.clippingPlanes = this.viewer.interactions.sectionBox.planes material.color = color material.metalness = renderMat.metalness @@ -139,7 +137,7 @@ export default class SceneObjectManager { } else { // If we don't have defined material, just use the default let material = this.solidMaterial.clone() - material.clippingPlanes = this.viewer.interactions.sectionBox.planes + // material.clippingPlanes = this.viewer.interactions.sectionBox.planes return this.addSingleSolid( wrapper, material ) } @@ -147,11 +145,12 @@ export default class SceneObjectManager { addSingleSolid( wrapper, material, addToScene = true ) { const mesh = new THREE.Mesh( wrapper.bufferGeometry, material ? material : this.solidMaterial ) + mesh.matrixAutoUpdate = false mesh.userData = wrapper.meta mesh.uuid = wrapper.meta.id if ( addToScene ) { this.objectIds.push( mesh.uuid ) - this.solidObjects.add( mesh ) + this.sceneObjects.allSolidObjects.add( mesh ) } return mesh } @@ -162,7 +161,7 @@ export default class SceneObjectManager { mesh.uuid = wrapper.meta.id if ( addToScene ) { this.objectIds.push( mesh.uuid ) - this.transparentObjects.add( mesh ) + this.sceneObjects.allTransparentObjects.add( mesh ) } return mesh } @@ -173,7 +172,7 @@ export default class SceneObjectManager { line.uuid = wrapper.meta.id if ( addToScene ) { this.objectIds.push( line.uuid ) - this.lineObjects.add( line ) + this.sceneObjects.allLineObjects.add( line ) } return line } @@ -184,7 +183,7 @@ export default class SceneObjectManager { dot.uuid = wrapper.meta.id if ( addToScene ) { this.objectIds.push( dot.uuid ) - this.pointObjects.add( dot ) + this.sceneObjects.allPointObjects.add( dot ) } return dot } @@ -199,7 +198,7 @@ export default class SceneObjectManager { this._normaliseColor( color ) let material = this.pointMaterial.clone() - material.clippingPlanes = this.viewer.interactions.sectionBox.planes + // material.clippingPlanes = this.viewer.interactions.sectionBox.planes material.color = color @@ -212,7 +211,7 @@ export default class SceneObjectManager { clouds.uuid = wrapper.meta.id if ( addToScene ) { this.objectIds.push( clouds.uuid ) - this.pointObjects.add( clouds ) + this.sceneObjects.allPointObjects.add( clouds ) } return clouds } @@ -233,7 +232,7 @@ export default class SceneObjectManager { // Note: only apply the scale transform if this block is going to be added to the scene. otherwise it means it's a child of a nested block. group.applyMatrix4( wrapper.extras.scaleMatrix ) this.objectIds.push() - this.solidObjects.add( group ) + this.sceneObjects.allSolidObjects.add( group ) } return group @@ -249,10 +248,10 @@ export default class SceneObjectManager { obj.geometry.dispose() } } - this.solidObjects.clear() - this.transparentObjects.clear() - this.lineObjects.clear() - this.pointObjects.clear() + this.sceneObjects.allSolidObjects.clear() + this.sceneObjects.allTransparentObjects.clear() + this.sceneObjects.allLineObjects.clear() + this.sceneObjects.allPointObjects.clear() this.viewer.interactions.deselectObjects() this.viewer.interactions.hideSectionBox() diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js new file mode 100644 index 000000000..a3a027bfc --- /dev/null +++ b/packages/viewer/src/modules/SceneObjects.js @@ -0,0 +1,121 @@ +import * as THREE from 'three' +import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' +import debounce from 'lodash.debounce' +import { filterAndColorObject } from './Filtering' + +/** + * Container for the scene objects, to allow loading/unloading/filtering/coloring/grouping + */ +export default class SceneObjects { + + constructor( viewer ) { + this.viewer = viewer + this.scene = viewer.scene + + this.allObjects = new THREE.Group() + this.allSolidObjects = new THREE.Group() + this.allTransparentObjects = new THREE.Group() + this.allLineObjects = new THREE.Group() + this.allPointObjects = new THREE.Group() + this.allObjects.add( this.allSolidObjects ) + this.allObjects.add( this.allTransparentObjects ) + this.allObjects.add( this.allLineObjects ) + this.allObjects.add( this.allPointObjects ) + + this.filteredObjects = new THREE.Group() + this.filteredSolidObjects = new THREE.Group() + this.filteredTransparentObjects = new THREE.Group() + this.filteredLineObjects = new THREE.Group() + this.filteredPointObjects = new THREE.Group() + this.filteredObjects.add( this.filteredSolidObjects ) + this.filteredObjects.add( this.filteredTransparentObjects ) + this.filteredObjects.add( this.filteredLineObjects ) + this.filteredObjects.add( this.filteredPointObjects ) + + + this.groupedSolidObjects = new THREE.Group() + + this.filteredObjects.add( this.groupedSolidObjects ) + + this.scene.add( this.allObjects ) + this.scene.add( this.filteredObjects ) + + this.appliedFilter = null + } + + setFilteredView() { + this.scene.remove( this.allObjects ) + this.applyFilter() + } + + applyFilter( filter ) { + // eslint-disable-next-line no-param-reassign + if ( filter === undefined ) filter = this.appliedFilter + this.appliedFilter = filter + + this.filteredSolidObjects.clear() + for ( let obj of this.allSolidObjects.children ) { + let filteredObj = filterAndColorObject( obj, filter ) + if ( filteredObj ) + this.filteredSolidObjects.add( filteredObj ) + } + + this.filteredTransparentObjects.clear() + for ( let obj of this.allTransparentObjects.children ) { + let filteredObj = filterAndColorObject( obj, filter ) + if ( filteredObj ) + this.filteredTransparentObjects.add( filteredObj ) + } + + this.filteredLineObjects.clear() + for ( let obj of this.allLineObjects.children ) { + let filteredObj = filterAndColorObject( obj, filter ) + if ( filteredObj ) + this.filteredLineObjects.add( filteredObj ) + } + + this.filteredPointObjects.clear() + for ( let obj of this.allPointObjects.children ) { + let filteredObj = filterAndColorObject( obj, filter ) + if ( filteredObj ) + this.filteredPointObjects.add( filteredObj ) + } + + this._groupObjects() + + this.viewer.needsRender = true + } + + _groupObjects() { + let materialIdToBufferGeometry = {} + let materialIdToMaterial = {} + + for ( let mesh of this.filteredSolidObjects.children ) { + let m = mesh.material + let materialId = `${m.type}/${m.vertexColors}/${m.color.toJSON()}/${m.side}/${m.transparent}/${m.opactiy}/${m.emissive}/${m.metalness}/${m.roughness}` + + if ( !( materialId in materialIdToBufferGeometry ) ) { + materialIdToBufferGeometry[ materialId ] = [] + materialIdToMaterial[ materialId ] = m + } + + materialIdToBufferGeometry[ materialId ].push( mesh.geometry ) + } + + this.groupedSolidObjects.clear() + + for ( let solidObj of this.filteredSolidObjects.children ) { + solidObj.visible = false + } + + for ( let materialId in materialIdToBufferGeometry ) { + // TODO: does this handle transforms well ? + let groupGeometry = BufferGeometryUtils.mergeBufferGeometries( materialIdToBufferGeometry[ materialId ] ) + let groupMaterial = materialIdToMaterial[ materialId ] + let groupMesh = new THREE.Mesh( groupGeometry, groupMaterial ) + groupMesh.visible = + this.groupedSolidObjects.add( groupMesh ) + } + } + +} diff --git a/packages/viewer/src/modules/SectionPlaneHelper.js b/packages/viewer/src/modules/SectionPlaneHelper.js index 80dd73c50..12e13c7cf 100644 --- a/packages/viewer/src/modules/SectionPlaneHelper.js +++ b/packages/viewer/src/modules/SectionPlaneHelper.js @@ -85,7 +85,7 @@ export default class SectionPlaneHelper { this.cutters.push( cutter ) // adds local clipping planes to all materials - let objs = this.viewer.sceneManager.objects + let objs = this.viewer.sceneManager.filteredObjects objs.forEach( obj => { obj.material.clippingPlanes = this.cutters.map( c => c.plane ) } ) diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 31aa3dc4e..c808f0303 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -134,7 +134,7 @@ export default class SelectionHelper extends EventEmitter { const normalizedPosition = this._getNormalisedClickPosition( e ) this.raycaster.setFromCamera( normalizedPosition, this.viewer.camera ) - let intersectedObjects = this.raycaster.intersectObjects( this.subset ? this._getGroupChildren( this.subset ) : this.viewer.sceneManager.objects ) + let intersectedObjects = this.raycaster.intersectObjects( this.subset ? this._getGroupChildren( this.subset ) : this.viewer.sceneManager.filteredObjects ) if ( this.sectionBox && this.sectionBox.display.visible ) { diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 13e7a71aa..96360838c 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -15,8 +15,10 @@ export default class Viewer extends EventEmitter { constructor( { container, postprocessing = true, reflections = true, showStats = false } ) { super() - this.clock = new THREE.Clock() + window.THREE = THREE + this.clock = new THREE.Clock() + this.container = container || document.getElementById( 'renderer' ) this.postprocessing = postprocessing this.scene = new THREE.Scene() @@ -141,6 +143,7 @@ export default class Viewer extends EventEmitter { this.needsRender = false if ( this.stats ) this.stats.begin() this.render() + document.getElementById( 'draw-calls' ).textContent = 'Draw calls: ' + this.renderer.info.render.calls if ( this.stats ) this.stats.end() } @@ -151,7 +154,7 @@ export default class Viewer extends EventEmitter { // Note: scene based "dynamic" reflections need to be handled a bit more carefully, or else: // GL ERROR :GL_INVALID_OPERATION : glDrawElements: Source and destination textures of the draw are the same. // First remove the env map from all materials - for ( let obj of this.sceneManager.objects ) { + for ( let obj of this.sceneManager.filteredObjects ) { obj.material.envMap = null } @@ -162,7 +165,7 @@ export default class Viewer extends EventEmitter { this.scene.background = null // Finally, re-set the env maps of all materials - for ( let obj of this.sceneManager.objects ) { + for ( let obj of this.sceneManager.filteredObjects ) { obj.material.envMap = this.cubeCamera.renderTarget.texture } this.reflectionsNeedUpdate = false diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index b9d69fdf6..773c98d14 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -52,6 +52,7 @@ export default class ViewerObjectLoader { for await ( let obj of this.loader.getObjectIterator() ) { if ( first ) { firstObjectPromise = this.converter.traverseAndConvert( obj, ( o ) => { + console.log("ADDING OBJECT") this.viewer.sceneManager.addObject( o ) viewerLoads++ } ) @@ -66,6 +67,8 @@ export default class ViewerObjectLoader { await firstObjectPromise } + this.viewer.sceneManager.sceneObjects.setFilteredView() + if ( viewerLoads === 0 ) { console.warn( `Viewer: no 3d objects found in object ${this.objectId}` ) this.viewer.emit( 'load-warning', { message: `No displayable objects found in object ${this.objectId}.` } ) diff --git a/packages/viewer/webpack.config.example.js b/packages/viewer/webpack.config.example.js index 7c0312d4d..a48bc6826 100644 --- a/packages/viewer/webpack.config.example.js +++ b/packages/viewer/webpack.config.example.js @@ -46,11 +46,12 @@ const config = { extensions: [ '.json', '.js' ], }, devServer: { - contentBase: path.join( __dirname, 'example' ), + static: path.join( __dirname, 'example' ), compress: false, port: 9000, - serveIndex: true, - writeToDisk: true + devMiddleware: { + writeToDisk: true + } } } From 355301ae36879fbf0caf664f59c0f2f69a818ce9 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Fri, 29 Oct 2021 11:05:38 +0300 Subject: [PATCH 03/75] wip viewer --- packages/objectloader/index.js | 58 +++++++-- packages/viewer/src/app.js | 12 +- packages/viewer/src/assets/example.html | 15 ++- packages/viewer/src/modules/Converter.js | 37 ++++-- .../viewer/src/modules/SceneObjectManager.js | 38 ++++-- packages/viewer/src/modules/SceneObjects.js | 112 +++++++++++++++--- packages/viewer/src/modules/Viewer.js | 11 +- .../viewer/src/modules/ViewerObjectLoader.js | 33 +++++- 8 files changed, 257 insertions(+), 59 deletions(-) diff --git a/packages/objectloader/index.js b/packages/objectloader/index.js index 833ee5089..c4f7f0494 100644 --- a/packages/objectloader/index.js +++ b/packages/objectloader/index.js @@ -45,7 +45,26 @@ export default class ObjectLoader { this.options.numConnections = this.options.numConnections || 4 this.cacheDB = null -} + + this.lastAsyncPause = Date.now() + this.existingAsyncPause = null + + } + + async asyncPause() { + // Don't freeze the UI + // while ( this.existingAsyncPause ) { + // await this.existingAsyncPause + // } + if ( Date.now() - this.lastAsyncPause >= 30 ) { + this.lastAsyncPause = Date.now() + this.existingAsyncPause = new Promise( resolve => setTimeout( resolve, 0 ) ) + await this.existingAsyncPause + this.existingAsyncPause = null + if (Date.now() - this.lastAsyncPause > 100) console.log("Loader Event loop lag: ", Date.now() - this.lastAsyncPause) + } + + } dispose() { this.buffer = [] @@ -144,6 +163,8 @@ export default class ObjectLoader { * @returns */ async getObject( id ){ + await this.asyncPause() + if ( this.buffer[id] ) return this.buffer[id] let promise = new Promise( ( resolve, reject ) => { @@ -182,12 +203,14 @@ export default class ObjectLoader { async * getObjectIterator( ) { let t0 = Date.now() + let count = 0 for await ( let line of this.getRawObjectIterator() ) { let { id, obj } = this.processLine( line ) this.buffer[ id ] = obj + count += 1 yield obj } - console.log("Loaded in: ", (Date.now() - t0) / 1000) + console.log(`Loaded ${count} objects in: ${(Date.now() - t0) / 1000}`) } processLine( chunk ) { @@ -213,10 +236,18 @@ export default class ObjectLoader { if ( childrenIds.length === 0 ) return const cachedObjects = await this.cacheGetObjects( childrenIds ) + // await 0ms timeout every 100ms to not freeze the UI + let lastAsyncPause = Date.now() for ( let id in cachedObjects ) { + if ( Date.now() - lastAsyncPause >= 100 ) { + await new Promise( resolve => setTimeout( resolve, 0 ) ) + lastAsyncPause = Date.now() + } yield `${id}\t${cachedObjects[ id ]}` } + childrenIds = childrenIds.filter(id => !( id in cachedObjects ) ) + if ( childrenIds.length === 0 ) return let splitChildrenIds = [] if ( childrenIds.length <= 10 ){ @@ -326,15 +357,22 @@ export default class ObjectLoader { return {} } - let store = this.cacheDB.transaction('objects', 'readonly').objectStore('objects') - let idbChildrenPromises = ids.map( id => this.promisifyIdbRequest( store.get( id ) ).then( data => ( { id, data } ) ) ) - let cachedData = await Promise.all(idbChildrenPromises) - let ret = {} - for ( let cachedObj of cachedData ) { - if ( !cachedObj.data ) // non-existent objects are retrieved with `undefined` data - continue - ret[ cachedObj.id ] = cachedObj.data + + for (let i = 0; i < ids.length; i += 5000) { + let idsChunk = ids.slice(i, i + 5000) + + await this.asyncPause() + + let store = this.cacheDB.transaction('objects', 'readonly').objectStore('objects') + let idbChildrenPromises = idsChunk.map( id => this.promisifyIdbRequest( store.get( id ) ).then( data => ( { id, data } ) ) ) + let cachedData = await Promise.all(idbChildrenPromises) + + for ( let cachedObj of cachedData ) { + if ( !cachedObj.data ) // non-existent objects are retrieved with `undefined` data + continue + ret[ cachedObj.id ] = cachedObj.data + } } return ret diff --git a/packages/viewer/src/app.js b/packages/viewer/src/app.js index 5ecb4e5a7..6422b83d2 100644 --- a/packages/viewer/src/app.js +++ b/packages/viewer/src/app.js @@ -1,8 +1,14 @@ /* eslint-disable */ import Viewer from './modules/Viewer' +setInterval(() => { + document.getElementById('info-mem').innerText = '' + Math.round(performance.memory.usedJSHeapSize / 1024 / 1024) +}, 100 ) + let v = new Viewer( { container: document.getElementById( 'renderer' ), showStats: true } ) -v.on( 'load-progress', args => console.log( `Load progress ${args.progress} (on object ${args.id})` ) ) +v.on( 'load-progress', args => { + document.getElementById('info-progress').innerText = `${Math.round(1000 * args.progress) / 1000 }` +} ) window.v = v window.addEventListener( 'load', () => { @@ -16,8 +22,10 @@ window.addEventListener( 'load', () => { window.loadData = async function LoadData( url ) { url = url || document.getElementById( 'objectUrlInput' ).value localStorage.setItem( 'prevLoadUrl', url ) + let t0 = Date.now() await v.loadObject( url ) -} + console.log(`Finished loading in: ${(Date.now() - t0) / 1000}`) +} v.on( 'select', objects => { console.info( `Selection event. Current selection count: ${objects.length}.` ) diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index 7d8fb6690..44716f320 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -51,17 +51,22 @@
+ +
+ Used Memory (MB): - / + LoadProgress: - / + ViewerBusy: - / + Draw Calls: - +
+ +
-
-
-
-
-
+ \ No newline at end of file diff --git a/packages/viewer/src/modules/Converter.js b/packages/viewer/src/modules/Converter.js index ce8c81e5b..74f175c87 100644 --- a/packages/viewer/src/modules/Converter.js +++ b/packages/viewer/src/modules/Converter.js @@ -1,3 +1,4 @@ +import { chunk } from 'lodash' import * as THREE from 'three' import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' import ObjectWrapper from './ObjectWrapper' @@ -16,6 +17,17 @@ export default class Coverter { this.objectLoader = objectLoader this.curveSegmentLength = 0.1 + + this.lastAsyncPause = Date.now() + } + + async asyncPause() { + // Don't freeze the UI when doing all those traversals + if ( Date.now() - this.lastAsyncPause >= 30 ) { + this.lastAsyncPause = Date.now() + await new Promise( resolve => setTimeout( resolve, 0 ) ) + if (Date.now() - this.lastAsyncPause > 100) console.log("CONV Event loop lag: ", Date.now() - this.lastAsyncPause) + } } /** @@ -26,6 +38,8 @@ export default class Coverter { * @return {[type]} [description] */ async traverseAndConvert( obj, callback, scale = true ) { + await this.asyncPause() + // Exit on primitives (string, ints, bools, bigints, etc.) if ( typeof obj !== 'object' ) return if ( obj.referencedId ) obj = await this.resolveReference( obj ) @@ -48,7 +62,7 @@ export default class Coverter { if ( this[`${type}ToBufferGeometry`] ) { try { - callback( await this[`${type}ToBufferGeometry`]( obj.data || obj, scale ) ) + await callback( await this[`${type}ToBufferGeometry`]( obj.data || obj, scale ) ) return } catch ( e ) { console.warn( `(Traversing - direct) Failed to convert ${type} with id: ${obj.id}`, e ) @@ -65,7 +79,7 @@ export default class Coverter { if ( !displayValue.units ) displayValue.units = obj.units try { let { bufferGeometry } = await this.convert( displayValue, scale ) - callback( new ObjectWrapper( bufferGeometry, obj ) ) // use the parent's metadata! + await callback( new ObjectWrapper( bufferGeometry, obj ) ) // use the parent's metadata! } catch ( e ) { console.warn( `(Traversing) Failed to convert obj with id: ${obj.id} — ${e.message}` ) } @@ -74,7 +88,7 @@ export default class Coverter { let val = await this.resolveReference( element ) if ( !val.units ) val.units = obj.units let { bufferGeometry } = await this.convert( val, scale ) - callback( new ObjectWrapper( bufferGeometry, { renderMaterial: val.renderMaterial, ...obj } ) ) + await callback( new ObjectWrapper( bufferGeometry, { renderMaterial: val.renderMaterial, ...obj } ) ) } } } @@ -130,11 +144,15 @@ export default class Coverter { // Handles pre-chunking objects, or arrs that have not been chunked if ( !arr[0].referencedId ) return arr - let dechunked = [] + let chunked = [] for ( let ref of arr ) { let real = await this.objectLoader.getObject( ref.referencedId ) - dechunked.push( ...real.data ) + chunked.push( real.data ) + await this.asyncPause() } + + let dechunked = [].concat( ...chunked ) + return dechunked } @@ -144,8 +162,11 @@ export default class Coverter { * @return {[type]} [description] */ async resolveReference( obj ) { - if ( obj.referencedId ) - return await this.objectLoader.getObject( obj.referencedId ) + if ( obj.referencedId ) { + let resolvedObj = await this.objectLoader.getObject( obj.referencedId ) + this.asyncPause() + return resolvedObj + } else return obj } @@ -256,6 +277,8 @@ export default class Coverter { } async MeshToBufferGeometry( obj, scale = true ) { + await this.asyncPause() + try { if ( !obj ) return diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 8ac05f292..4c9802208 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -51,8 +51,8 @@ export default class SceneObjectManager { size: 2, sizeAttenuation: false, vertexColors: true } ) - this.objectIds = [] - this.postLoad = debounce( () => { this._postLoadFunction() }, 200 ) + // this.objectIds = [] + this.postLoad = debounce( () => { this._postLoadFunction() }, 200, { maxWait: 1500 } ) this.skipPostLoad = skipPostLoad this.loaders = [] @@ -145,11 +145,11 @@ export default class SceneObjectManager { addSingleSolid( wrapper, material, addToScene = true ) { const mesh = new THREE.Mesh( wrapper.bufferGeometry, material ? material : this.solidMaterial ) - mesh.matrixAutoUpdate = false + // mesh.matrixAutoUpdate = false mesh.userData = wrapper.meta mesh.uuid = wrapper.meta.id if ( addToScene ) { - this.objectIds.push( mesh.uuid ) + // this.objectIds.push( mesh.uuid ) this.sceneObjects.allSolidObjects.add( mesh ) } return mesh @@ -160,7 +160,7 @@ export default class SceneObjectManager { mesh.userData = wrapper.meta mesh.uuid = wrapper.meta.id if ( addToScene ) { - this.objectIds.push( mesh.uuid ) + // this.objectIds.push( mesh.uuid ) this.sceneObjects.allTransparentObjects.add( mesh ) } return mesh @@ -171,7 +171,7 @@ export default class SceneObjectManager { line.userData = wrapper.meta line.uuid = wrapper.meta.id if ( addToScene ) { - this.objectIds.push( line.uuid ) + // this.objectIds.push( line.uuid ) this.sceneObjects.allLineObjects.add( line ) } return line @@ -182,7 +182,7 @@ export default class SceneObjectManager { dot.userData = wrapper.meta dot.uuid = wrapper.meta.id if ( addToScene ) { - this.objectIds.push( dot.uuid ) + // this.objectIds.push( dot.uuid ) this.sceneObjects.allPointObjects.add( dot ) } return dot @@ -210,7 +210,7 @@ export default class SceneObjectManager { clouds.userData = wrapper.meta clouds.uuid = wrapper.meta.id if ( addToScene ) { - this.objectIds.push( clouds.uuid ) + // this.objectIds.push( clouds.uuid ) this.sceneObjects.allPointObjects.add( clouds ) } return clouds @@ -231,7 +231,7 @@ export default class SceneObjectManager { if ( addToScene ) { // Note: only apply the scale transform if this block is going to be added to the scene. otherwise it means it's a child of a nested block. group.applyMatrix4( wrapper.extras.scaleMatrix ) - this.objectIds.push() + // this.objectIds.push() this.sceneObjects.allSolidObjects.add( group ) } @@ -242,6 +242,23 @@ export default class SceneObjectManager { // TODO } + async removeImportedObject( importedUrl ) { + for ( let objGroup of this.sceneObjects.allObjects.children ) { + let toRemove = objGroup.children.filter( obj => obj.userData?.__importedUrl === importedUrl ) + toRemove.forEach( obj => { + if ( obj.material ) + obj.material.dispose() + if ( obj.geometry ) + obj.geometry.dispose() + objGroup.remove( obj ) + } ) + + } + this.views = this.views.filter( v => v.__importedUrl !== importedUrl ) + + await this.sceneObjects.applyFilter( undefined, true ) + } + removeAllObjects() { for ( let obj of this.objects ) { if ( obj.geometry ) { @@ -255,13 +272,14 @@ export default class SceneObjectManager { this.viewer.interactions.deselectObjects() this.viewer.interactions.hideSectionBox() - this.objectIds = [] + //this.objectIds = [] this.views = [] this._postLoadFunction() } _postLoadFunction() { + console.log("POST_LOAD") if ( this.skipPostLoad ) return this.viewer.interactions.zoomExtents() this.viewer.interactions.hideSectionBox() diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index a3a027bfc..8ef81fd08 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -9,24 +9,36 @@ import { filterAndColorObject } from './Filtering' export default class SceneObjects { constructor( viewer ) { + this.isInitialLoading = true + this.viewer = viewer this.scene = viewer.scene this.allObjects = new THREE.Group() + this.allObjects.name = 'allObjects' this.allSolidObjects = new THREE.Group() + this.allSolidObjects.name = 'allSolidObjects' this.allTransparentObjects = new THREE.Group() + this.allTransparentObjects.name = 'allTransparentObjects' this.allLineObjects = new THREE.Group() + this.allLineObjects.name = 'allLineObjects' this.allPointObjects = new THREE.Group() + this.allPointObjects.name = 'allPointObjects' this.allObjects.add( this.allSolidObjects ) this.allObjects.add( this.allTransparentObjects ) this.allObjects.add( this.allLineObjects ) this.allObjects.add( this.allPointObjects ) this.filteredObjects = new THREE.Group() + this.filteredObjects.name = 'filteredObjects' this.filteredSolidObjects = new THREE.Group() + this.filteredSolidObjects.name = 'filteredSolidObjects' this.filteredTransparentObjects = new THREE.Group() + this.filteredTransparentObjects.name = 'filteredTransparentObjects' this.filteredLineObjects = new THREE.Group() + this.filteredLineObjects.name = 'filteredLineObjects' this.filteredPointObjects = new THREE.Group() + this.filteredPointObjects.name = 'filteredPointObjects' this.filteredObjects.add( this.filteredSolidObjects ) this.filteredObjects.add( this.filteredTransparentObjects ) this.filteredObjects.add( this.filteredLineObjects ) @@ -34,31 +46,78 @@ export default class SceneObjects { this.groupedSolidObjects = new THREE.Group() + this.groupedSolidObjects.name = 'groupedSolidObjects' this.filteredObjects.add( this.groupedSolidObjects ) this.scene.add( this.allObjects ) - this.scene.add( this.filteredObjects ) this.appliedFilter = null + + this.lastAsyncPause = Date.now() } - setFilteredView() { + async asyncPause() { + // Don't freeze the UI when doing all those traversals + if ( Date.now() - this.lastAsyncPause >= 30 ) { + if (Date.now() - this.lastAsyncPause > 50 ) console.log("FREEZED for ", Date.now() - this.lastAsyncPause) + await new Promise( resolve => setTimeout( resolve, 0 ) ) + this.lastAsyncPause = Date.now() + } + } + + async setFilteredView() { + if ( !this.isInitialLoading ) { + await this.applyFilter() + return + } + + this.isInitialLoading = false + await this.applyFilter() + this.scene.add( this.filteredObjects ) this.scene.remove( this.allObjects ) - this.applyFilter() } - applyFilter( filter ) { + async applyFilterToObjects( objectArray, filter, targetGroup ) { + for ( let i = 0; i < objectArray.length; i++ ) { + if ( i % 100 === 0 ) await this.asyncPause() + + let filteredObj = filterAndColorObject( objectArray[ i ], filter ) + if ( filteredObj ) + targetGroup.add( filteredObj ) + } + } + + disposeAndClearGroup( threejsGroup, disposeGeometry = false ) { + let t0 = Date.now() + for ( let child of threejsGroup.children ) { + if ( child.material ) + child.material.dispose() + else + fdsfs() + if ( disposeGeometry && child.geometry ) + child.geometry.dispose() + } + threejsGroup.clear() + console.log("Dispose in: ", Date.now() - t0) + } + + async applyFilter( filter, disposeGeometry = false ) { // eslint-disable-next-line no-param-reassign if ( filter === undefined ) filter = this.appliedFilter this.appliedFilter = filter + + this.lastAsyncPause = Date.now() - this.filteredSolidObjects.clear() - for ( let obj of this.allSolidObjects.children ) { - let filteredObj = filterAndColorObject( obj, filter ) - if ( filteredObj ) - this.filteredSolidObjects.add( filteredObj ) - } + // this.filteredSolidObjects.clear() + this.disposeAndClearGroup( this.filteredSolidObjects, disposeGeometry ) + await this.applyFilterToObjects( this.allSolidObjects.children, filter, this.filteredSolidObjects ) + + // for ( let obj of this.allSolidObjects.children ) { + // let filteredObj = filterAndColorObject( obj, filter ) + // if ( filteredObj ) + // this.filteredSolidObjects.add( filteredObj ) + // } this.filteredTransparentObjects.clear() for ( let obj of this.allTransparentObjects.children ) { @@ -81,14 +140,15 @@ export default class SceneObjects { this.filteredPointObjects.add( filteredObj ) } - this._groupObjects() + await this._groupObjects() this.viewer.needsRender = true } - _groupObjects() { + async _groupObjects() { let materialIdToBufferGeometry = {} let materialIdToMaterial = {} + let materialIdToMeshes = {} for ( let mesh of this.filteredSolidObjects.children ) { let m = mesh.material @@ -97,25 +157,41 @@ export default class SceneObjects { if ( !( materialId in materialIdToBufferGeometry ) ) { materialIdToBufferGeometry[ materialId ] = [] materialIdToMaterial[ materialId ] = m + materialIdToMeshes[ materialId ] = [] } materialIdToBufferGeometry[ materialId ].push( mesh.geometry ) - } + materialIdToMeshes[ materialId ].push( mesh ) - this.groupedSolidObjects.clear() + // Max 1000 objects per group (mergeBufferGeometries is sync and can freeze for large data) + if ( materialIdToBufferGeometry[ materialId ].length >= 1000 ) { + let archivedMaterialId = `arch//${materialId}//${mesh.id}` + materialIdToBufferGeometry[ archivedMaterialId ] = materialIdToBufferGeometry[ materialId ] + materialIdToMaterial[ archivedMaterialId ] = materialIdToMaterial[ materialId ] + materialIdToMeshes[ archivedMaterialId ] = materialIdToMeshes[ materialId ] + delete materialIdToBufferGeometry[ materialId ] + delete materialIdToMaterial[ materialId ] + delete materialIdToMeshes[ materialId ] + } + } - for ( let solidObj of this.filteredSolidObjects.children ) { - solidObj.visible = false - } + await this.asyncPause() + this.disposeAndClearGroup( this.groupedSolidObjects, true ) + for ( let materialId in materialIdToBufferGeometry ) { + await this.asyncPause() // TODO: does this handle transforms well ? let groupGeometry = BufferGeometryUtils.mergeBufferGeometries( materialIdToBufferGeometry[ materialId ] ) + await this.asyncPause() let groupMaterial = materialIdToMaterial[ materialId ] let groupMesh = new THREE.Mesh( groupGeometry, groupMaterial ) - groupMesh.visible = this.groupedSolidObjects.add( groupMesh ) + for ( let mesh of materialIdToMeshes[ materialId ] ) { + mesh.visible = false + } } + } } diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 96360838c..f4162cb41 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -78,7 +78,7 @@ export default class Viewer extends EventEmitter { this.sceneLights() this.animate() - this.loaders = [] + this.loaders = {} } sceneLights() { @@ -143,7 +143,7 @@ export default class Viewer extends EventEmitter { this.needsRender = false if ( this.stats ) this.stats.begin() this.render() - document.getElementById( 'draw-calls' ).textContent = 'Draw calls: ' + this.renderer.info.render.calls + document.getElementById( 'info-draws' ).textContent = '' + this.renderer.info.render.calls if ( this.stats ) this.stats.end() } @@ -186,10 +186,15 @@ export default class Viewer extends EventEmitter { async loadObject( url, token ) { let loader = new ViewerObjectLoader( this, url, token ) - this.loaders.push( loader ) + this.loaders[ url ] = loader await loader.load() } + async unloadObject( url ) { + await this.loaders[ url ].unload() + delete this.loaders[ url ] + } + dispose() { // TODO } diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index 773c98d14..bb6c699f0 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -9,6 +9,7 @@ export default class ViewerObjectLoader { constructor( parent, objectUrl, authToken ) { + this.objectUrl = objectUrl this.viewer = parent this.token = null try { @@ -41,6 +42,23 @@ export default class ViewerObjectLoader { } ) this.converter = new Converter( this.loader ) + + this.lastAsyncPause = Date.now() + this.existingAsyncPause = null + } + + async asyncPause() { + // while ( this.existingAsyncPause ) { + // await this.existingAsyncPause + // } + // Don't freeze the UI + if ( Date.now() - this.lastAsyncPause >= 30 ) { + this.lastAsyncPause = Date.now() + this.existingAsyncPause = new Promise( resolve => setTimeout( resolve, 0 ) ) + await this.existingAsyncPause + this.existingAsyncPause = null + if (Date.now() - this.lastAsyncPause > 100) console.log("VObjLoader Event loop lag: ", Date.now() - this.lastAsyncPause) + } } async load( ) { @@ -51,9 +69,12 @@ export default class ViewerObjectLoader { let firstObjectPromise = null for await ( let obj of this.loader.getObjectIterator() ) { if ( first ) { - firstObjectPromise = this.converter.traverseAndConvert( obj, ( o ) => { - console.log("ADDING OBJECT") - this.viewer.sceneManager.addObject( o ) + firstObjectPromise = this.converter.traverseAndConvert( obj, async ( objectWrapper ) => { + await this.asyncPause() + objectWrapper.meta.__importedUrl = this.objectUrl + let t0 = Date.now() + this.viewer.sceneManager.addObject( objectWrapper ) + // console.log(`Added ${objectWrapper.meta.id} in ${Date.now() - t0}ms`) viewerLoads++ } ) first = false @@ -67,11 +88,15 @@ export default class ViewerObjectLoader { await firstObjectPromise } - this.viewer.sceneManager.sceneObjects.setFilteredView() + await this.viewer.sceneManager.sceneObjects.setFilteredView() if ( viewerLoads === 0 ) { console.warn( `Viewer: no 3d objects found in object ${this.objectId}` ) this.viewer.emit( 'load-warning', { message: `No displayable objects found in object ${this.objectId}.` } ) } } + + async unload( ) { + await this.viewer.sceneManager.removeImportedObject( this.objectUrl ) + } } From 0c305f9deb73058eb94220c468d750d9b471c0b5 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Fri, 29 Oct 2021 21:40:13 +0300 Subject: [PATCH 04/75] wip viewer --- packages/objectloader/index.js | 112 +++++++++++++----- packages/viewer/src/modules/Converter.js | 35 ++++-- .../viewer/src/modules/SceneObjectManager.js | 6 +- packages/viewer/src/modules/SceneObjects.js | 4 +- .../viewer/src/modules/ViewerObjectLoader.js | 9 +- 5 files changed, 116 insertions(+), 50 deletions(-) diff --git a/packages/objectloader/index.js b/packages/objectloader/index.js index c4f7f0494..c0cfa8b4e 100644 --- a/packages/objectloader/index.js +++ b/packages/objectloader/index.js @@ -56,12 +56,12 @@ export default class ObjectLoader { // while ( this.existingAsyncPause ) { // await this.existingAsyncPause // } - if ( Date.now() - this.lastAsyncPause >= 30 ) { + if ( Date.now() - this.lastAsyncPause >= 100 ) { this.lastAsyncPause = Date.now() this.existingAsyncPause = new Promise( resolve => setTimeout( resolve, 0 ) ) await this.existingAsyncPause this.existingAsyncPause = null - if (Date.now() - this.lastAsyncPause > 100) console.log("Loader Event loop lag: ", Date.now() - this.lastAsyncPause) + if (Date.now() - this.lastAsyncPause > 500) console.log("Loader Event loop lag: ", Date.now() - this.lastAsyncPause) } } @@ -163,8 +163,6 @@ export default class ObjectLoader { * @returns */ async getObject( id ){ - await this.asyncPause() - if ( this.buffer[id] ) return this.buffer[id] let promise = new Promise( ( resolve, reject ) => { @@ -232,35 +230,84 @@ export default class ObjectLoader { const rootObj = JSON.parse(rootObjJson) if ( !rootObj.__closure ) return - let childrenIds = Object.keys(rootObj.__closure) + let childrenIds = Object.keys(rootObj.__closure).sort( (a, b) => rootObj.__closure[a] - rootObj.__closure[b] ) if ( childrenIds.length === 0 ) return - const cachedObjects = await this.cacheGetObjects( childrenIds ) - // await 0ms timeout every 100ms to not freeze the UI - let lastAsyncPause = Date.now() - for ( let id in cachedObjects ) { - if ( Date.now() - lastAsyncPause >= 100 ) { - await new Promise( resolve => setTimeout( resolve, 0 ) ) - lastAsyncPause = Date.now() + let splitHttpRequests = [] + + if ( childrenIds.length > 50 ) { + // split into 5%, 15%, 40%, 40% (5% for the high priority children: the ones with lower minDepth) + let splitBeforeCacheCheck = [ [], [], [], [] ] + let crtChildIndex = 0 + + for ( ; crtChildIndex < 0.05 * childrenIds.length; crtChildIndex++ ) { + splitBeforeCacheCheck[0].push( childrenIds[ crtChildIndex ] ) + } + for ( ; crtChildIndex < 0.2 * childrenIds.length; crtChildIndex++ ) { + splitBeforeCacheCheck[1].push( childrenIds[ crtChildIndex ] ) + } + for ( ; crtChildIndex < 0.6 * childrenIds.length; crtChildIndex++ ) { + splitBeforeCacheCheck[2].push( childrenIds[ crtChildIndex ] ) + } + for ( ; crtChildIndex < childrenIds.length; crtChildIndex++ ) { + splitBeforeCacheCheck[3].push( childrenIds[ crtChildIndex ] ) } - yield `${id}\t${cachedObjects[ id ]}` - } - childrenIds = childrenIds.filter(id => !( id in cachedObjects ) ) - if ( childrenIds.length === 0 ) return + let newChildren = [] + let cachePromises = [] + for ( let cacheCheckGroup of splitBeforeCacheCheck ) { + cachePromises.push( this.cacheGetObjects( cacheCheckGroup ) ) + } + for ( let i = 0; i < 4; i++ ) { + let cachedObjects = await cachePromises[ i ] + let sortedCachedKeys = Object.keys(cachedObjects).sort( (a, b) => rootObj.__closure[a] - rootObj.__closure[b] ) + for ( let id of sortedCachedKeys ) { + yield `${id}\t${cachedObjects[ id ]}` + } + let newChildrenForBatch = splitBeforeCacheCheck[i].filter( id => !( id in cachedObjects ) ) + newChildren.push( ...newChildrenForBatch ) + } + + if ( newChildren.length === 0 ) return + + if ( newChildren.length <= 50 ) { + // we have almost all of children in the cache. do only 1 requests for the remaining new children + splitHttpRequests.push( newChildren ) + } else { + // we now set up the batches for 4 http requests, starting from `newChildren` (already sorted by priority) + splitHttpRequests = [ [], [], [], [] ] + crtChildIndex = 0 + + for ( ; crtChildIndex < 0.05 * newChildren.length; crtChildIndex++ ) { + splitHttpRequests[0].push( newChildren[ crtChildIndex ] ) + } + for ( ; crtChildIndex < 0.2 * newChildren.length; crtChildIndex++ ) { + splitHttpRequests[1].push( newChildren[ crtChildIndex ] ) + } + for ( ; crtChildIndex < 0.6 * newChildren.length; crtChildIndex++ ) { + splitHttpRequests[2].push( newChildren[ crtChildIndex ] ) + } + for ( ; crtChildIndex < newChildren.length; crtChildIndex++ ) { + splitHttpRequests[3].push( newChildren[ crtChildIndex ] ) + } + } - let splitChildrenIds = [] - if ( childrenIds.length <= 10 ){ - splitChildrenIds.push( childrenIds ) } else { - for (let i = 0; i < this.options.numConnections; i++) { - splitChildrenIds.push( [] ) - } - for (let i = 0; i < childrenIds.length; i++) { - splitChildrenIds[ i % this.options.numConnections ].push(childrenIds[i]) + // small object with <= 50 children. check cache and make only 1 request + const cachedObjects = await this.cacheGetObjects( childrenIds ) + let sortedCachedKeys = Object.keys(cachedObjects).sort( (a, b) => rootObj.__closure[a] - rootObj.__closure[b] ) + for ( let id of sortedCachedKeys ) { + yield `${id}\t${cachedObjects[ id ]}` } + childrenIds = childrenIds.filter(id => !( id in cachedObjects ) ) + if ( childrenIds.length === 0 ) return + + // only 1 http request with the remaining children ( <= 50 ) + splitHttpRequests.push( childrenIds ) } - + + // Starting http requests for batches in `splitHttpRequests` + const decoders = [] const readers = [] const readPromisses = [] @@ -268,7 +315,7 @@ export default class ObjectLoader { const readBuffers = [] const finishedRequests = [] - for (let i = 0; i < splitChildrenIds.length; i++) { + for (let i = 0; i < splitHttpRequests.length; i++) { decoders.push(new TextDecoder()) readers.push( null ) readPromisses.push( null ) @@ -281,7 +328,7 @@ export default class ObjectLoader { { method: 'POST', headers: { ...this.headers, 'Content-Type': 'application/json' }, - body: JSON.stringify( { objects: JSON.stringify( splitChildrenIds[i] ) } ) + body: JSON.stringify( { objects: JSON.stringify( splitHttpRequests[i] ) } ) } ).then( crtResponse => { let crtReader = crtResponse.body.getReader() @@ -341,8 +388,13 @@ export default class ObjectLoader { } async getRawRootObject() { + const cachedRootObject = await this.cacheGetObjects( [ this.objectId ] ) + if ( cachedRootObject[ this.objectId ] ) + return cachedRootObject[ this.objectId ] const response = await fetch( this.requestUrlRootObj, { headers: this.headers } ) - return response.text() + const responseText = await response.text() + this.cacheStoreObjects( [ `${this.objectId}\t${responseText}` ] ) + return responseText } promisifyIdbRequest(request) { @@ -362,12 +414,10 @@ export default class ObjectLoader { for (let i = 0; i < ids.length; i += 5000) { let idsChunk = ids.slice(i, i + 5000) - await this.asyncPause() - let store = this.cacheDB.transaction('objects', 'readonly').objectStore('objects') let idbChildrenPromises = idsChunk.map( id => this.promisifyIdbRequest( store.get( id ) ).then( data => ( { id, data } ) ) ) let cachedData = await Promise.all(idbChildrenPromises) - + for ( let cachedObj of cachedData ) { if ( !cachedObj.data ) // non-existent objects are retrieved with `undefined` data continue diff --git a/packages/viewer/src/modules/Converter.js b/packages/viewer/src/modules/Converter.js index 74f175c87..43bd6f6c6 100644 --- a/packages/viewer/src/modules/Converter.js +++ b/packages/viewer/src/modules/Converter.js @@ -19,14 +19,16 @@ export default class Coverter { this.curveSegmentLength = 0.1 this.lastAsyncPause = Date.now() + this.activePromises = 0 + this.maxChildrenPromises = 200 } async asyncPause() { // Don't freeze the UI when doing all those traversals - if ( Date.now() - this.lastAsyncPause >= 30 ) { + if ( Date.now() - this.lastAsyncPause >= 100 ) { this.lastAsyncPause = Date.now() await new Promise( resolve => setTimeout( resolve, 0 ) ) - if (Date.now() - this.lastAsyncPause > 100) console.log("CONV Event loop lag: ", Date.now() - this.lastAsyncPause) + if (Date.now() - this.lastAsyncPause > 200) console.log("CONV Event loop lag: ", Date.now() - this.lastAsyncPause) } } @@ -38,6 +40,7 @@ export default class Coverter { * @return {[type]} [description] */ async traverseAndConvert( obj, callback, scale = true ) { + //console.log("Active promises: ", this.activePromises) await this.asyncPause() // Exit on primitives (string, ints, bools, bigints, etc.) @@ -50,10 +53,16 @@ export default class Coverter { if ( Array.isArray( obj ) ) { for ( let element of obj ) { if ( typeof element !== 'object' ) break // exit early for non-object based arrays - let childPromise = this.traverseAndConvert( element, callback, scale ) - childrenConversionPromisses.push( childPromise ) + if ( this.activePromises >= this.maxChildrenPromises ) { + await this.traverseAndConvert( element, callback, scale ) + } else { + let childPromise = this.traverseAndConvert( element, callback, scale ) + childrenConversionPromisses.push( childPromise ) + } } + this.activePromises += childrenConversionPromisses.length await Promise.all( childrenConversionPromisses ) + this.activePromises -= childrenConversionPromisses.length return } @@ -97,7 +106,9 @@ export default class Coverter { if ( displayValue && obj.speckle_type.toLowerCase().includes( 'builtelements' ) ) { if ( obj['elements'] ) { childrenConversionPromisses.push( this.traverseAndConvert( obj['elements'], callback, scale ) ) + this.activePromises += childrenConversionPromisses.length await Promise.all( childrenConversionPromisses ) + this.activePromises -= childrenConversionPromisses.length } return } @@ -107,10 +118,16 @@ export default class Coverter { for ( let prop in target ) { if ( prop === 'bbox' ) continue if ( typeof target[prop] !== 'object' ) continue - let childPromise = this.traverseAndConvert( target[prop], callback, scale ) - childrenConversionPromisses.push( childPromise ) + if ( this.activePromises >= this.maxChildrenPromises ) { + await this.traverseAndConvert( target[prop], callback, scale ) + } else { + let childPromise = this.traverseAndConvert( target[prop], callback, scale ) + childrenConversionPromisses.push( childPromise ) + } } + this.activePromises += childrenConversionPromisses.length await Promise.all( childrenConversionPromisses ) + this.activePromises -= childrenConversionPromisses.length } /** @@ -148,7 +165,7 @@ export default class Coverter { for ( let ref of arr ) { let real = await this.objectLoader.getObject( ref.referencedId ) chunked.push( real.data ) - await this.asyncPause() + // await this.asyncPause() } let dechunked = [].concat( ...chunked ) @@ -164,7 +181,7 @@ export default class Coverter { async resolveReference( obj ) { if ( obj.referencedId ) { let resolvedObj = await this.objectLoader.getObject( obj.referencedId ) - this.asyncPause() + // this.asyncPause() return resolvedObj } else return obj @@ -277,7 +294,7 @@ export default class Coverter { } async MeshToBufferGeometry( obj, scale = true ) { - await this.asyncPause() + // await this.asyncPause() try { if ( !obj ) return diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 4c9802208..848e38cf8 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -281,9 +281,9 @@ export default class SceneObjectManager { _postLoadFunction() { console.log("POST_LOAD") if ( this.skipPostLoad ) return - this.viewer.interactions.zoomExtents() - this.viewer.interactions.hideSectionBox() - this.viewer.reflectionsNeedUpdate = true + this.viewer.interactions.zoomExtents( undefined, false ) + // this.viewer.interactions.hideSectionBox() + this.viewer.reflectionsNeedUpdate = false } getSceneBoundingBox() { diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index 8ef81fd08..c963c2dd9 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -163,8 +163,8 @@ export default class SceneObjects { materialIdToBufferGeometry[ materialId ].push( mesh.geometry ) materialIdToMeshes[ materialId ].push( mesh ) - // Max 1000 objects per group (mergeBufferGeometries is sync and can freeze for large data) - if ( materialIdToBufferGeometry[ materialId ].length >= 1000 ) { + // Max 1024 objects per group (mergeBufferGeometries is sync and can freeze for large data) + if ( materialIdToBufferGeometry[ materialId ].length >= 1024 ) { let archivedMaterialId = `arch//${materialId}//${mesh.id}` materialIdToBufferGeometry[ archivedMaterialId ] = materialIdToBufferGeometry[ materialId ] materialIdToMaterial[ archivedMaterialId ] = materialIdToMaterial[ materialId ] diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index bb6c699f0..0199e93f1 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -52,12 +52,12 @@ export default class ViewerObjectLoader { // await this.existingAsyncPause // } // Don't freeze the UI - if ( Date.now() - this.lastAsyncPause >= 30 ) { + if ( Date.now() - this.lastAsyncPause >= 100 ) { this.lastAsyncPause = Date.now() this.existingAsyncPause = new Promise( resolve => setTimeout( resolve, 0 ) ) await this.existingAsyncPause this.existingAsyncPause = null - if (Date.now() - this.lastAsyncPause > 100) console.log("VObjLoader Event loop lag: ", Date.now() - this.lastAsyncPause) + if (Date.now() - this.lastAsyncPause > 500) console.log("VObjLoader Event loop lag: ", Date.now() - this.lastAsyncPause) } } @@ -68,13 +68,12 @@ export default class ViewerObjectLoader { let viewerLoads = 0 let firstObjectPromise = null for await ( let obj of this.loader.getObjectIterator() ) { + await this.converter.asyncPause() if ( first ) { firstObjectPromise = this.converter.traverseAndConvert( obj, async ( objectWrapper ) => { - await this.asyncPause() + await this.converter.asyncPause() objectWrapper.meta.__importedUrl = this.objectUrl - let t0 = Date.now() this.viewer.sceneManager.addObject( objectWrapper ) - // console.log(`Added ${objectWrapper.meta.id} in ${Date.now() - t0}ms`) viewerLoads++ } ) first = false From 580039d1a06f94c29d93f8270de6a83d419cb7a5 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Sun, 31 Oct 2021 19:00:31 +0200 Subject: [PATCH 05/75] wip viewer - optimizations --- packages/objectloader/index.js | 24 ++- .../viewer/src/modules/SceneObjectManager.js | 15 +- packages/viewer/src/modules/SceneObjects.js | 175 ++++++++++-------- .../viewer/src/modules/ViewerObjectLoader.js | 2 +- 4 files changed, 131 insertions(+), 85 deletions(-) diff --git a/packages/objectloader/index.js b/packages/objectloader/index.js index c0cfa8b4e..a291e9035 100644 --- a/packages/objectloader/index.js +++ b/packages/objectloader/index.js @@ -217,6 +217,8 @@ export default class ObjectLoader { } async * getRawObjectIterator() { + let tSTART = Date.now() + if ( this.options.enableCaching && window.indexedDB && this.cacheDB === null) { // TODO: safari issue https://github.com/jakearchibald/idb-keyval let idbOpenRequest = indexedDB.open('speckle-object-cache', 1) @@ -225,6 +227,8 @@ export default class ObjectLoader { } const rootObjJson = await this.getRawRootObject() + console.log("Root in: ", Date.now() - tSTART) + yield `${this.objectId}\t${rootObjJson}` const rootObj = JSON.parse(rootObjJson) @@ -253,13 +257,16 @@ export default class ObjectLoader { splitBeforeCacheCheck[3].push( childrenIds[ crtChildIndex ] ) } + + console.log("Cache check for: ", splitBeforeCacheCheck) + let newChildren = [] - let cachePromises = [] - for ( let cacheCheckGroup of splitBeforeCacheCheck ) { - cachePromises.push( this.cacheGetObjects( cacheCheckGroup ) ) - } + let nextCachePromise = this.cacheGetObjects( splitBeforeCacheCheck[ 0 ] ) + for ( let i = 0; i < 4; i++ ) { - let cachedObjects = await cachePromises[ i ] + let cachedObjects = await nextCachePromise + if ( i < 3 ) nextCachePromise = this.cacheGetObjects( splitBeforeCacheCheck[ i + 1 ] ) + let sortedCachedKeys = Object.keys(cachedObjects).sort( (a, b) => rootObj.__closure[a] - rootObj.__closure[b] ) for ( let id of sortedCachedKeys ) { yield `${id}\t${cachedObjects[ id ]}` @@ -411,13 +418,16 @@ export default class ObjectLoader { let ret = {} - for (let i = 0; i < ids.length; i += 5000) { - let idsChunk = ids.slice(i, i + 5000) + for (let i = 0; i < ids.length; i += 500) { + let idsChunk = ids.slice(i, i + 500) + let t0 = Date.now() let store = this.cacheDB.transaction('objects', 'readonly').objectStore('objects') let idbChildrenPromises = idsChunk.map( id => this.promisifyIdbRequest( store.get( id ) ).then( data => ( { id, data } ) ) ) let cachedData = await Promise.all(idbChildrenPromises) + // console.log("Cache check for : ", idsChunk.length, Date.now() - t0) + for ( let cachedObj of cachedData ) { if ( !cachedObj.data ) // non-existent objects are retrieved with `undefined` data continue diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 848e38cf8..a87102427 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -52,7 +52,7 @@ export default class SceneObjectManager { } ) // this.objectIds = [] - this.postLoad = debounce( () => { this._postLoadFunction() }, 200, { maxWait: 1500 } ) + this.postLoad = debounce( () => { this._postLoadFunction() }, 20, { maxWait: 5000 } ) this.skipPostLoad = skipPostLoad this.loaders = [] @@ -63,7 +63,13 @@ export default class SceneObjectManager { } get filteredObjects() { - return [ ...this.sceneObjects.filteredSolidObjects.children, ...this.sceneObjects.filteredTransparentObjects.children, ...this.sceneObjects.filteredLineObjects.children, ...this.sceneObjects.filteredPointObjects.children ] + let ret = [] + for ( let objectGroup of this.sceneObjects.objectsInScene.children ) { + if ( objectGroup.name === 'GroupedObjects' ) + continue + ret.push( ...objectGroup.children ) + } + return ret } get materials() { @@ -81,7 +87,7 @@ export default class SceneObjectManager { addObject( wrapper, addToScene = true ) { if ( !wrapper || !wrapper.bufferGeometry ) return - this.postLoad() + // this.postLoad() switch ( wrapper.geometryType ) { case 'View': @@ -278,9 +284,10 @@ export default class SceneObjectManager { this._postLoadFunction() } - _postLoadFunction() { + async _postLoadFunction() { console.log("POST_LOAD") if ( this.skipPostLoad ) return + await this.sceneObjects.applyFilter() this.viewer.interactions.zoomExtents( undefined, false ) // this.viewer.interactions.hideSectionBox() this.viewer.reflectionsNeedUpdate = false diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index c963c2dd9..688d8f353 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -9,58 +9,67 @@ import { filterAndColorObject } from './Filtering' export default class SceneObjects { constructor( viewer ) { - this.isInitialLoading = true - this.viewer = viewer this.scene = viewer.scene this.allObjects = new THREE.Group() this.allObjects.name = 'allObjects' + this.allSolidObjects = new THREE.Group() this.allSolidObjects.name = 'allSolidObjects' + this.allSolidObjects.visible = false // these are grouped later, we never want to display them individually + this.allObjects.add( this.allSolidObjects ) + this.allTransparentObjects = new THREE.Group() this.allTransparentObjects.name = 'allTransparentObjects' + this.allObjects.add( this.allTransparentObjects ) + this.allLineObjects = new THREE.Group() this.allLineObjects.name = 'allLineObjects' + this.allObjects.add( this.allLineObjects ) + this.allPointObjects = new THREE.Group() this.allPointObjects.name = 'allPointObjects' - this.allObjects.add( this.allSolidObjects ) - this.allObjects.add( this.allTransparentObjects ) - this.allObjects.add( this.allLineObjects ) this.allObjects.add( this.allPointObjects ) - this.filteredObjects = new THREE.Group() - this.filteredObjects.name = 'filteredObjects' - this.filteredSolidObjects = new THREE.Group() - this.filteredSolidObjects.name = 'filteredSolidObjects' - this.filteredTransparentObjects = new THREE.Group() - this.filteredTransparentObjects.name = 'filteredTransparentObjects' - this.filteredLineObjects = new THREE.Group() - this.filteredLineObjects.name = 'filteredLineObjects' - this.filteredPointObjects = new THREE.Group() - this.filteredPointObjects.name = 'filteredPointObjects' - this.filteredObjects.add( this.filteredSolidObjects ) - this.filteredObjects.add( this.filteredTransparentObjects ) - this.filteredObjects.add( this.filteredLineObjects ) - this.filteredObjects.add( this.filteredPointObjects ) - - + // Grouped solid objects, generated from `allSolidObjects` this.groupedSolidObjects = new THREE.Group() this.groupedSolidObjects.name = 'groupedSolidObjects' + this.allObjects.add( this.groupedSolidObjects ) - this.filteredObjects.add( this.groupedSolidObjects ) + this.filteredObjects = null - this.scene.add( this.allObjects ) + // this.filteredObjects = new THREE.Group() + // this.filteredObjects.name = 'filteredObjects' + // this.filteredSolidObjects = new THREE.Group() + // this.filteredSolidObjects.name = 'filteredSolidObjects' + // this.filteredSolidObjects.visible = false // these are grouped later, we never want to display them individually + // this.filteredTransparentObjects = new THREE.Group() + // this.filteredTransparentObjects.name = 'filteredTransparentObjects' + // this.filteredLineObjects = new THREE.Group() + // this.filteredLineObjects.name = 'filteredLineObjects' + // this.filteredPointObjects = new THREE.Group() + // this.filteredPointObjects.name = 'filteredPointObjects' + // this.filteredObjects.add( this.filteredSolidObjects ) + // this.filteredObjects.add( this.filteredTransparentObjects ) + // this.filteredObjects.add( this.filteredLineObjects ) + // this.filteredObjects.add( this.filteredPointObjects ) this.appliedFilter = null + // When the `appliedFilter` is null, scene will contain `allObjects`. Otherwise, `filteredObjects` + // This is to optimize the no-filter usecase, so we don't make an unnecessary clone of all the objects + this.objectsInScene = this.allObjects + this.scene.add( this.allObjects ) + + this.isBusy = true this.lastAsyncPause = Date.now() } async asyncPause() { // Don't freeze the UI when doing all those traversals - if ( Date.now() - this.lastAsyncPause >= 30 ) { - if (Date.now() - this.lastAsyncPause > 50 ) console.log("FREEZED for ", Date.now() - this.lastAsyncPause) + if ( Date.now() - this.lastAsyncPause >= 100 ) { + // if (Date.now() - this.lastAsyncPause > 200 ) console.log("FREEZED for ", Date.now() - this.lastAsyncPause) await new Promise( resolve => setTimeout( resolve, 0 ) ) this.lastAsyncPause = Date.now() } @@ -78,23 +87,27 @@ export default class SceneObjects { this.scene.remove( this.allObjects ) } - async applyFilterToObjects( objectArray, filter, targetGroup ) { - for ( let i = 0; i < objectArray.length; i++ ) { - if ( i % 100 === 0 ) await this.asyncPause() + async applyFilterToGroup( threejsGroup, filter ) { + let ret = new THREE.Group() + ret.name = 'filtered_' + threejsGroup.name - let filteredObj = filterAndColorObject( objectArray[ i ], filter ) + for ( let obj of threejsGroup.children ) { + await this.asyncPause() + let filteredObj = filterAndColorObject( obj, filter ) if ( filteredObj ) - targetGroup.add( filteredObj ) + ret.add( filteredObj ) } + return ret } - disposeAndClearGroup( threejsGroup, disposeGeometry = false ) { + disposeAndClearGroup( threejsGroup, disposeGeometry = true ) { let t0 = Date.now() for ( let child of threejsGroup.children ) { + if ( child.type === 'Group' ) { + this.disposeAndClearGroup( child, disposeGeometry ) + } if ( child.material ) child.material.dispose() - else - fdsfs() if ( disposeGeometry && child.geometry ) child.geometry.dispose() } @@ -102,55 +115,72 @@ export default class SceneObjects { console.log("Dispose in: ", Date.now() - t0) } - async applyFilter( filter, disposeGeometry = false ) { + async applyFilter( filter ) { // eslint-disable-next-line no-param-reassign if ( filter === undefined ) filter = this.appliedFilter - this.appliedFilter = filter - this.lastAsyncPause = Date.now() + if ( filter === null ) { + // Remove filters, use allObjects + let newGoupedSolidObjects = await this.groupSolidObjects( this.allSolidObjects ) + if ( this.groupedSolidObjects !== null ) { + this.disposeAndClearGroup( this.groupedSolidObjects ) + this.allObjects.remove( this.groupedSolidObjects ) + } + this.groupedSolidObjects = newGoupedSolidObjects + this.allObjects.add( this.groupedSolidObjects ) - // this.filteredSolidObjects.clear() - this.disposeAndClearGroup( this.filteredSolidObjects, disposeGeometry ) - await this.applyFilterToObjects( this.allSolidObjects.children, filter, this.filteredSolidObjects ) + if ( this.filteredObjects !== null ) { + this.disposeAndClearGroup( this.filteredObjects ) + this.filteredObjects = null + } + this.scene.remove( this.objectsInScene ) + this.scene.add( this.allObjects ) + this.objectsInScene = this.allObjects + } else { + // A filter is to be applied - // for ( let obj of this.allSolidObjects.children ) { - // let filteredObj = filterAndColorObject( obj, filter ) - // if ( filteredObj ) - // this.filteredSolidObjects.add( filteredObj ) - // } + let newFilteredObjects = new THREE.Group() + newFilteredObjects.name = 'FilteredObjects' + + let filteredSolidObjects = await this.applyFilterToGroup( this.allSolidObjects, filter ) + filteredSolidObjects.visible = false + newFilteredObjects.add( filteredSolidObjects ) + + let filteredLineObjects = await this.applyFilterToGroup( this.allLineObjects, filter ) + newFilteredObjects.add( filteredLineObjects ) + + let filteredTransparentObjects = await this.applyFilterToGroup( this.allTransparentObjects, filter ) + newFilteredObjects.add( filteredTransparentObjects ) + + let filteredPointObjects = await this.applyFilterToGroup( this.allPointObjects, filter ) + newFilteredObjects.add( filteredPointObjects ) + + // group solid objects + let groupedFilteredSolidObjects = await this.groupedSolidObjects( filteredSolidObjects ) + newFilteredObjects.add( groupedFilteredSolidObjects ) - this.filteredTransparentObjects.clear() - for ( let obj of this.allTransparentObjects.children ) { - let filteredObj = filterAndColorObject( obj, filter ) - if ( filteredObj ) - this.filteredTransparentObjects.add( filteredObj ) + // Sync update scene + if ( this.filteredObjects !== null ) { + this.disposeAndClearGroup( this.filteredObjects ) + } + this.filteredObjects = newFilteredObjects + + this.scene.remove( this.objectsInScene ) + this.scene.add( this.filteredObjects ) + this.objectsInScene = this.filteredObjects } - this.filteredLineObjects.clear() - for ( let obj of this.allLineObjects.children ) { - let filteredObj = filterAndColorObject( obj, filter ) - if ( filteredObj ) - this.filteredLineObjects.add( filteredObj ) - } - - this.filteredPointObjects.clear() - for ( let obj of this.allPointObjects.children ) { - let filteredObj = filterAndColorObject( obj, filter ) - if ( filteredObj ) - this.filteredPointObjects.add( filteredObj ) - } - - await this._groupObjects() - + this.appliedFilter = filter this.viewer.needsRender = true + } - async _groupObjects() { + async groupSolidObjects( threejsGroup ) { let materialIdToBufferGeometry = {} let materialIdToMaterial = {} let materialIdToMeshes = {} - for ( let mesh of this.filteredSolidObjects.children ) { + for ( let mesh of threejsGroup.children ) { let m = mesh.material let materialId = `${m.type}/${m.vertexColors}/${m.color.toJSON()}/${m.side}/${m.transparent}/${m.opactiy}/${m.emissive}/${m.metalness}/${m.roughness}` @@ -175,10 +205,11 @@ export default class SceneObjects { } } + let groupedObjects = new THREE.Group() + groupedObjects.name = 'GroupedSolidObjects' + await this.asyncPause() - this.disposeAndClearGroup( this.groupedSolidObjects, true ) - for ( let materialId in materialIdToBufferGeometry ) { await this.asyncPause() // TODO: does this handle transforms well ? @@ -186,12 +217,10 @@ export default class SceneObjects { await this.asyncPause() let groupMaterial = materialIdToMaterial[ materialId ] let groupMesh = new THREE.Mesh( groupGeometry, groupMaterial ) - this.groupedSolidObjects.add( groupMesh ) - for ( let mesh of materialIdToMeshes[ materialId ] ) { - mesh.visible = false - } + groupedObjects.add( groupMesh ) } + return groupedObjects } } diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index 0199e93f1..d029a7ce2 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -87,7 +87,7 @@ export default class ViewerObjectLoader { await firstObjectPromise } - await this.viewer.sceneManager.sceneObjects.setFilteredView() + await this.viewer.sceneManager.postLoad() if ( viewerLoads === 0 ) { console.warn( `Viewer: no 3d objects found in object ${this.objectId}` ) From 9a84766722490c6310b0a7c3b1ef6a2a125631f8 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Sun, 31 Oct 2021 19:00:48 +0200 Subject: [PATCH 06/75] wip viewer --- packages/viewer/example/example.html | 124 +++++++++++++++------------ 1 file changed, 69 insertions(+), 55 deletions(-) diff --git a/packages/viewer/example/example.html b/packages/viewer/example/example.html index 146e8f163..703d98e4e 100644 --- a/packages/viewer/example/example.html +++ b/packages/viewer/example/example.html @@ -1,58 +1,72 @@ - - - - Speckle Viewer - - - - - - - - -
-
-
-

Viewer

-
Controls summary:
-

Click an object to select it. Double click it to focus on it. Press `esc` to clear the selection. Press `shift-s` to toggle a section plane. Press `s` while the section plane is active to toggle its control mode. Double click anywhere outside an object to zoom extents to the entire scene.

-
-
- - - - - -
-
- - -
-
- - View: - - - - - -
-
-
-
-
-
-
-
-
+ -
+ + + Speckle Viewer + + + + + + + + + +
+
+
+

Viewer

+
Controls summary:
+

Click an object to select it. Double click it to focus on it. Press `esc` to clear the + selection. Press `shift-s` to toggle a section plane. Press `s` while the section plane is active to toggle + its control mode. Double click anywhere outside an object to zoom extents to the entire scene.

+
+
+ + + + + +
+
+ + +
+
+ + View: + + + + + +
+ +
+ Used Memory (MB): - / + LoadProgress: - / + ViewerBusy: - / + Draw Calls: - +
+ +
- - +
+
+
+
+
+ + + + \ No newline at end of file From ce7d26a35bb32d24db91fa0ff6c504895570cc18 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Wed, 3 Nov 2021 13:11:15 +0200 Subject: [PATCH 07/75] wip viewer --- packages/viewer/package-lock.json | 5 + packages/viewer/package.json | 1 + packages/viewer/src/modules/Filtering.js | 142 +++++++++++++++++- packages/viewer/src/modules/SceneObjects.js | 78 +++++++--- .../viewer/src/modules/SelectionHelper.js | 8 +- 5 files changed, 212 insertions(+), 22 deletions(-) diff --git a/packages/viewer/package-lock.json b/packages/viewer/package-lock.json index 9c9075e43..bd84815fe 100644 --- a/packages/viewer/package-lock.json +++ b/packages/viewer/package-lock.json @@ -7658,6 +7658,11 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "rainbowvis.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rainbowvis.js/-/rainbowvis.js-1.0.1.tgz", + "integrity": "sha1-6JmPuXFhsCVXdIx9oJeWKw1uPgA=" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", diff --git a/packages/viewer/package.json b/packages/viewer/package.json index db4d966cd..0c5fb9a65 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -56,6 +56,7 @@ "dependencies": { "camera-controls": "^1.33.0", "lodash.debounce": "^4.0.8", + "rainbowvis.js": "^1.0.1", "three": "^0.133.1" } } diff --git a/packages/viewer/src/modules/Filtering.js b/packages/viewer/src/modules/Filtering.js index 1ebdde8eb..0cd3a1b33 100644 --- a/packages/viewer/src/modules/Filtering.js +++ b/packages/viewer/src/modules/Filtering.js @@ -1,10 +1,144 @@ +import * as THREE from 'three' +import Rainbow from 'rainbowvis.js' +import { cloneUniforms } from 'three' + +const WireframeMaterial = new THREE.MeshStandardMaterial( { + color: 0x7080A0, + side: THREE.DoubleSide, + transparent: true, + opacity: 0.04, + wireframe: true +} ) + +const ColoredMaterial = new THREE.MeshStandardMaterial( { + color: 0x7080A0, + side: THREE.DoubleSide, + transparent: false +} ) + export function filterAndColorObject( obj, filter ) { if ( !filter ) return obj.clone() - - if ( filter.speckle_type && obj.userData?.speckle_type !== filter.speckle_type ) + if ( !passesAndFilter( obj.userData, filter.and ) ) + { + if ( filter.wireframeFilter && obj.type === 'Mesh' ) { + let clone = obj.clone() + // clone.material = WireframeMaterial + clone.material = obj.material.clone() + clone.material.transparent = true + clone.material.opacity = 0.05 + clone.userData = null + return clone + } return null - - return obj.clone() + } + + let clone = obj.clone() + if ( filter.colors ) { + if ( filter.colors.type === 'category' ) { + clone.material = colorWithCategory( obj.userData, filter.colors ) + } else if ( filter.colors.type === 'gradient' ) { + clone.material = colorWithGradient( obj.userData, filter.colors ) + } + } + + return clone +} + +function getObjectProperty( obj, property ) { + if ( !property ) return + let keyParts = property.split( '.' ) + let crtObj = obj + for ( let i = 0; i < keyParts.length - 1; i++ ) { + if ( !( keyParts[i] in crtObj ) ) return + crtObj = crtObj[ keyParts[i] ] + if ( crtObj.constructor !== Object ) return + } + let attributeName = keyParts[ keyParts.length - 1 ] + return crtObj[ attributeName ] +} + +function colorWithCategory( obj, colors ) { + let defaultValue = colors.default + let color = defaultValue + let objValue = getObjectProperty( obj, colors.property ) + let customPallete = colors.values || {} + if ( objValue in customPallete ) { + color = customPallete[ objValue ] + } + + if ( !color ) { + // compute value hash + let objValueAsString = '' + objValue + let hash = 0 + for( let i = 0; i < objValueAsString.length; i++ ) { + let chr = objValueAsString.charCodeAt( i ) + hash = ( ( hash << 5 ) - hash ) + chr + hash |= 0 // Convert to 32bit integer + } + hash = Math.abs( hash ) + let colorHue = hash % 360 + color = `hsl(${colorHue}, 50%, 30%)` + } + + let material = ColoredMaterial.clone() + material.color = new THREE.Color( color ) + return material +} + +function colorWithGradient( obj, colors ) { + let rainbow = new Rainbow( ) + if ( 'minValue' in colors && 'maxValue' in colors ) + rainbow.setNumberRange( colors.minValue, colors.maxValue ) + if ( 'gradientColors' in colors ) + rainbow.setSpectrum( ...colors.gradientColors ) + + let objValue = getObjectProperty( obj, colors.property ) + objValue = Number( objValue ) + if ( Number.isNaN( objValue ) ) { + // TODO: have different behaviour for missing values? + objValue = 0 + } + + let material = ColoredMaterial.clone() + material.color = new THREE.Color( `#${rainbow.colourAt( objValue )}` ) + return material +} + +function passesAndFilter( obj, andFilter ) { + if ( !andFilter ) return true + for ( let filterKey in andFilter ) { + let objValue = getObjectProperty( obj, filterKey ) + + // let keyParts = filterKey.split( '.' ) + // let crtObj = obj + // for ( let i = 0; i < keyParts.length - 1; i++ ) { + // if ( !( keyParts[i] in crtObj ) ) return false + // crtObj = crtObj[ keyParts[i] ] + // if ( crtObj.constructor !== Object ) return false + // } + // let attributeName = keyParts[ keyParts.length - 1 ] + let passesFilter = filterValue( objValue, andFilter[ filterKey ] ) + if ( !passesFilter ) return false + } + return true +} + +function filterValue( objValue, valueFilter ) { + // Array value filter means it can be any value from the array + if ( Array.isArray( valueFilter ) ) + return valueFilter.includes( objValue ) + + // Dictionary value filter can specify ranges with `lte` and `gte` fields (LowerThanOrEqual, GreaterThanOrEqual) + if ( valueFilter.constructor === Object ) { + if ( 'lte' in valueFilter && objValue > valueFilter.lte ) + return false + if ( 'gte' in valueFilter && objValue < valueFilter.gte ) + return false + return true + } + + // Can also filter by specific value + return objValue === valueFilter } diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index 688d8f353..7ad37a78b 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -39,22 +39,6 @@ export default class SceneObjects { this.filteredObjects = null - // this.filteredObjects = new THREE.Group() - // this.filteredObjects.name = 'filteredObjects' - // this.filteredSolidObjects = new THREE.Group() - // this.filteredSolidObjects.name = 'filteredSolidObjects' - // this.filteredSolidObjects.visible = false // these are grouped later, we never want to display them individually - // this.filteredTransparentObjects = new THREE.Group() - // this.filteredTransparentObjects.name = 'filteredTransparentObjects' - // this.filteredLineObjects = new THREE.Group() - // this.filteredLineObjects.name = 'filteredLineObjects' - // this.filteredPointObjects = new THREE.Group() - // this.filteredPointObjects.name = 'filteredPointObjects' - // this.filteredObjects.add( this.filteredSolidObjects ) - // this.filteredObjects.add( this.filteredTransparentObjects ) - // this.filteredObjects.add( this.filteredLineObjects ) - // this.filteredObjects.add( this.filteredPointObjects ) - this.appliedFilter = null // When the `appliedFilter` is null, scene will contain `allObjects`. Otherwise, `filteredObjects` @@ -75,6 +59,65 @@ export default class SceneObjects { } } + getObjectsProperties() { + let flattenObject = function( obj ) { + let flatten = {} + for ( let k in obj ) { + if ( [ 'id', '__closure', 'bbox', 'totalChildrenCount' ].includes( k ) ) + continue + let v = obj[ k ] + if ( Array.isArray( v ) ) + continue + if ( v.constructor === Object ) { + let flattenProp = flattenObject( v ) + for ( let pk in flattenProp ) { + flatten[ `${k}.${pk}` ] = flattenProp[ pk ] + } + continue + } + if ( [ 'string', 'number', 'boolean' ].includes( typeof v ) ) + flatten[ k ] = v + } + return flatten + } + + let propValues = {} + for ( let objGroup of this.objectsInScene.children ) { + for ( let threeObj of objGroup.children ) { + let obj = flattenObject( threeObj.userData ) + for ( let prop of Object.keys( obj ) ) { + if ( !( prop in propValues ) ) { + propValues[ prop ] = [] + } + propValues[ prop ].push( obj[ prop ] ) + } + } + } + + let propInfo = {} + for ( let prop in propValues ) { + let pinfo = { + type: typeof propValues[ prop ][ 0 ], + objectCount: propValues[ prop ].length, + allValues: propValues[ prop ], + uniqueValues: {}, + minValue: propValues[ prop ][ 0 ], + maxValue: propValues[ prop ][ 0 ] + } + for ( let v of propValues[ prop ] ) { + if ( v < pinfo.minValue ) pinfo.minValue = v + if ( v > pinfo.maxValue ) pinfo.maxValue = v + if ( !( v in pinfo.uniqueValues ) ) { + pinfo.uniqueValues[ v ] = 0 + } + pinfo.uniqueValues[ v ] += 1 + } + + propInfo[ prop ] = pinfo + } + return propInfo + } + async setFilteredView() { if ( !this.isInitialLoading ) { await this.applyFilter() @@ -156,7 +199,7 @@ export default class SceneObjects { newFilteredObjects.add( filteredPointObjects ) // group solid objects - let groupedFilteredSolidObjects = await this.groupedSolidObjects( filteredSolidObjects ) + let groupedFilteredSolidObjects = await this.groupSolidObjects( filteredSolidObjects ) newFilteredObjects.add( groupedFilteredSolidObjects ) // Sync update scene @@ -217,6 +260,7 @@ export default class SceneObjects { await this.asyncPause() let groupMaterial = materialIdToMaterial[ materialId ] let groupMesh = new THREE.Mesh( groupGeometry, groupMaterial ) + groupMesh.userData = null groupedObjects.add( groupMesh ) } diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index c808f0303..943ce4597 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -134,7 +134,13 @@ export default class SelectionHelper extends EventEmitter { const normalizedPosition = this._getNormalisedClickPosition( e ) this.raycaster.setFromCamera( normalizedPosition, this.viewer.camera ) - let intersectedObjects = this.raycaster.intersectObjects( this.subset ? this._getGroupChildren( this.subset ) : this.viewer.sceneManager.filteredObjects ) + let targetObjects + if ( this.subset ) { + targetObjects = this._getGroupChildren( this.subset ) + } else { + targetObjects = this.viewer.sceneManager.filteredObjects.filter( obj => !!obj.userData ) + } + let intersectedObjects = this.raycaster.intersectObjects( targetObjects ) if ( this.sectionBox && this.sectionBox.display.visible ) { From 9ea48e2a777d764a8113b9ab5d2ec704553e293e Mon Sep 17 00:00:00 2001 From: cristi8 Date: Thu, 11 Nov 2021 20:39:11 +0200 Subject: [PATCH 08/75] wip viewer --- packages/objectloader/index.js | 23 ++++++++++-- packages/viewer/package.json | 2 +- packages/viewer/src/modules/Converter.js | 4 ++- packages/viewer/src/modules/Filtering.js | 40 ++++++++++----------- packages/viewer/src/modules/SceneObjects.js | 15 ++------ packages/viewer/src/modules/Viewer.js | 8 +++++ 6 files changed, 53 insertions(+), 39 deletions(-) diff --git a/packages/objectloader/index.js b/packages/objectloader/index.js index a291e9035..f913d9b6c 100644 --- a/packages/objectloader/index.js +++ b/packages/objectloader/index.js @@ -4,7 +4,6 @@ */ - export default class ObjectLoader { /** @@ -220,7 +219,7 @@ export default class ObjectLoader { let tSTART = Date.now() if ( this.options.enableCaching && window.indexedDB && this.cacheDB === null) { - // TODO: safari issue https://github.com/jakearchibald/idb-keyval + await safariFix() let idbOpenRequest = indexedDB.open('speckle-object-cache', 1) idbOpenRequest.onupgradeneeded = () => idbOpenRequest.result.createObjectStore('objects'); this.cacheDB = await this.promisifyIdbRequest( idbOpenRequest ) @@ -452,3 +451,23 @@ export default class ObjectLoader { return this.promisifyIdbRequest( store.transaction ) } } + + +// Credits and more info: https://github.com/jakearchibald/safari-14-idb-fix +function safariFix() { + const isSafari = + !navigator.userAgentData && + /Safari\//.test(navigator.userAgent) && + !/Chrom(e|ium)\//.test(navigator.userAgent) + + // No point putting other browsers or older versions of Safari through this mess. + if (!isSafari || !indexedDB.databases) return Promise.resolve() + + let intervalId + + return new Promise( ( resolve ) => { + const tryIdb = () => indexedDB.databases().finally(resolve) + intervalId = setInterval(tryIdb, 100) + tryIdb() + }).finally( () => clearInterval(intervalId) ) +} diff --git a/packages/viewer/package.json b/packages/viewer/package.json index 0c5fb9a65..f0f3d3cc1 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -57,6 +57,6 @@ "camera-controls": "^1.33.0", "lodash.debounce": "^4.0.8", "rainbowvis.js": "^1.0.1", - "three": "^0.133.1" + "three": "^0.134.0" } } diff --git a/packages/viewer/src/modules/Converter.js b/packages/viewer/src/modules/Converter.js index 43bd6f6c6..9acbbfcdd 100644 --- a/packages/viewer/src/modules/Converter.js +++ b/packages/viewer/src/modules/Converter.js @@ -1,6 +1,8 @@ import { chunk } from 'lodash' import * as THREE from 'three' import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' +// import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils' + import ObjectWrapper from './ObjectWrapper' import { getConversionFactor } from './Units' @@ -28,7 +30,7 @@ export default class Coverter { if ( Date.now() - this.lastAsyncPause >= 100 ) { this.lastAsyncPause = Date.now() await new Promise( resolve => setTimeout( resolve, 0 ) ) - if (Date.now() - this.lastAsyncPause > 200) console.log("CONV Event loop lag: ", Date.now() - this.lastAsyncPause) + if ( Date.now() - this.lastAsyncPause > 200 ) console.log( 'CONV Event loop lag: ', Date.now() - this.lastAsyncPause ) } } diff --git a/packages/viewer/src/modules/Filtering.js b/packages/viewer/src/modules/Filtering.js index 0cd3a1b33..28e705aaf 100644 --- a/packages/viewer/src/modules/Filtering.js +++ b/packages/viewer/src/modules/Filtering.js @@ -20,9 +20,9 @@ const ColoredMaterial = new THREE.MeshStandardMaterial( { export function filterAndColorObject( obj, filter ) { if ( !filter ) return obj.clone() - if ( !passesAndFilter( obj.userData, filter.and ) ) + if ( !passesFilter( obj.userData, filter.filterBy ) ) { - if ( filter.wireframeFilter && obj.type === 'Mesh' ) { + if ( filter.ghostOthers && obj.type === 'Mesh' ) { let clone = obj.clone() // clone.material = WireframeMaterial clone.material = obj.material.clone() @@ -35,11 +35,11 @@ export function filterAndColorObject( obj, filter ) { } let clone = obj.clone() - if ( filter.colors ) { - if ( filter.colors.type === 'category' ) { - clone.material = colorWithCategory( obj.userData, filter.colors ) - } else if ( filter.colors.type === 'gradient' ) { - clone.material = colorWithGradient( obj.userData, filter.colors ) + if ( filter.colorBy ) { + if ( filter.colorBy.type === 'category' ) { + clone.material = colorWithCategory( obj.userData, filter.colorBy ) + } else if ( filter.colorBy.type === 'gradient' ) { + clone.material = colorWithGradient( obj, filter.colorBy ) } } @@ -87,7 +87,8 @@ function colorWithCategory( obj, colors ) { return material } -function colorWithGradient( obj, colors ) { +function colorWithGradient( threejsObj, colors ) { + let obj = threejsObj.userData let rainbow = new Rainbow( ) if ( 'minValue' in colors && 'maxValue' in colors ) rainbow.setNumberRange( colors.minValue, colors.maxValue ) @@ -97,8 +98,7 @@ function colorWithGradient( obj, colors ) { let objValue = getObjectProperty( obj, colors.property ) objValue = Number( objValue ) if ( Number.isNaN( objValue ) ) { - // TODO: have different behaviour for missing values? - objValue = 0 + return WireframeMaterial } let material = ColoredMaterial.clone() @@ -106,20 +106,12 @@ function colorWithGradient( obj, colors ) { return material } -function passesAndFilter( obj, andFilter ) { - if ( !andFilter ) return true - for ( let filterKey in andFilter ) { +function passesFilter( obj, filterBy ) { + if ( !filterBy ) return true + for ( let filterKey in filterBy ) { let objValue = getObjectProperty( obj, filterKey ) - // let keyParts = filterKey.split( '.' ) - // let crtObj = obj - // for ( let i = 0; i < keyParts.length - 1; i++ ) { - // if ( !( keyParts[i] in crtObj ) ) return false - // crtObj = crtObj[ keyParts[i] ] - // if ( crtObj.constructor !== Object ) return false - // } - // let attributeName = keyParts[ keyParts.length - 1 ] - let passesFilter = filterValue( objValue, andFilter[ filterKey ] ) + let passesFilter = filterValue( objValue, filterBy[ filterKey ] ) if ( !passesFilter ) return false } return true @@ -132,6 +124,10 @@ function filterValue( objValue, valueFilter ) { // Dictionary value filter can specify ranges with `lte` and `gte` fields (LowerThanOrEqual, GreaterThanOrEqual) if ( valueFilter.constructor === Object ) { + if ( 'not' in valueFilter && Array.isArray( valueFilter.not ) ) { + if ( valueFilter.not.includes( objValue ) ) + return false + } if ( 'lte' in valueFilter && objValue > valueFilter.lte ) return false if ( 'gte' in valueFilter && objValue < valueFilter.gte ) diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index 7ad37a78b..dc93cdc9e 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -1,5 +1,6 @@ import * as THREE from 'three' import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' +// import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils' import debounce from 'lodash.debounce' import { filterAndColorObject } from './Filtering' @@ -118,18 +119,6 @@ export default class SceneObjects { return propInfo } - async setFilteredView() { - if ( !this.isInitialLoading ) { - await this.applyFilter() - return - } - - this.isInitialLoading = false - await this.applyFilter() - this.scene.add( this.filteredObjects ) - this.scene.remove( this.allObjects ) - } - async applyFilterToGroup( threejsGroup, filter ) { let ret = new THREE.Group() ret.name = 'filtered_' + threejsGroup.name @@ -155,7 +144,7 @@ export default class SceneObjects { child.geometry.dispose() } threejsGroup.clear() - console.log("Dispose in: ", Date.now() - t0) + // console.log( 'Dispose in: ', Date.now() - t0 ) } async applyFilter( filter ) { diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index f4162cb41..6527eebe5 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -195,6 +195,14 @@ export default class Viewer extends EventEmitter { delete this.loaders[ url ] } + async applyFilter( filter ) { + return await this.sceneManager.sceneObjects.applyFilter( filter ) + } + + async getObjectsProperties() { + return await this.sceneManager.sceneObjects.getObjectsProperties() + } + dispose() { // TODO } From f34e89f564db0d28d0bff778ed96387536fb5905 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Fri, 12 Nov 2021 20:27:45 +0000 Subject: [PATCH 09/75] feat(viewer): section box + more --- packages/viewer/src/assets/example.html | 6 +- .../viewer/src/modules/InteractionHandler.js | 21 +- .../viewer/src/modules/SceneObjectManager.js | 24 +- packages/viewer/src/modules/SceneObjects.js | 3 + packages/viewer/src/modules/SectionBoxNew.js | 321 ++++++++++++++++++ packages/viewer/src/modules/Viewer.js | 135 +++++--- 6 files changed, 441 insertions(+), 69 deletions(-) create mode 100644 packages/viewer/src/modules/SectionBoxNew.js diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index 44716f320..df94c20a7 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -20,8 +20,8 @@ - -
+ +

Viewer

@@ -33,7 +33,7 @@
- +
diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 61cabc843..1d84e186b 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -6,21 +6,16 @@ export default class InteractionHandler { constructor( viewer ) { this.viewer = viewer - - //this.sectionBox = new SectionBox( this.viewer ) - //this.sectionBox.toggle() // switch off - this.preventSelection = false - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.viewer.sceneManager.userObjects, sectionBox: this.sectionBox } ) this.selectionMeshMaterial = new THREE.MeshLambertMaterial( { color: 0x0B55D2, emissive: 0x0B55D2, side: THREE.DoubleSide } ) - //this.selectionMeshMaterial.clippingPlanes = this.sectionBox.planes + this.selectionMeshMaterial.clippingPlanes = this.viewer.sectionBox.planes this.selectionLineMaterial = new THREE.LineBasicMaterial( { color: 0x0B55D2 } ) - //this.selectionLineMaterial.clippingPlanes = this.sectionBox.planes + this.selectionLineMaterial.clippingPlanes = this.viewer.sectionBox.planes this.selectionEdgesMaterial = new THREE.LineBasicMaterial( { color: 0x23F3BD } ) - //this.selectionEdgesMaterial.clippingPlanes = this.sectionBox.planes + this.selectionEdgesMaterial.clippingPlanes = this.viewer.sectionBox.planes this.selectedObjects = new THREE.Group() this.viewer.scene.add( this.selectedObjects ) @@ -30,12 +25,16 @@ export default class InteractionHandler { this.selectionHelper.on( 'object-doubleclicked', this._handleDoubleClick.bind( this ) ) this.selectionHelper.on( 'object-clicked', this._handleSelect.bind( this ) ) - - // this.viewer.sceneManager.materials.forEach( mat => mat.clippingPlanes = this.sectionBox.planes ) } _handleDoubleClick( objs ) { - if ( !objs || objs.length === 0 ) this.zoomExtents() + if ( !objs || objs.length === 0 ) { + if( this.viewer.sectionBox.display.visible ) { + this.zoomToObject( this.viewer.sectionBox.cube ) + } else { + this.zoomExtents() + } + } else this.zoomToObject( objs[0].object ) this.viewer.needsRender = true this.viewer.emit( 'object-doubleclicked', objs && objs.length !== 0 ? objs[0].object : null ) diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index a87102427..5c6821b30 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -1,5 +1,4 @@ import * as THREE from 'three' -import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' import debounce from 'lodash.debounce' import SceneObjects from './SceneObjects' @@ -43,18 +42,13 @@ export default class SceneObjectManager { } ) this.lineMaterial = new THREE.LineBasicMaterial( { color: 0x7F7F7F } ) - this.pointMaterial = new THREE.PointsMaterial( - { size: 2, sizeAttenuation: false, color: 0x7F7F7F } - ) + + this.pointMaterial = new THREE.PointsMaterial( { size: 2, sizeAttenuation: false, color: 0x7F7F7F } ) - this.pointVertexColorsMaterial = new THREE.PointsMaterial( { - size: 2, sizeAttenuation: false, vertexColors: true - } ) + this.pointVertexColorsMaterial = new THREE.PointsMaterial( { size: 2, sizeAttenuation: false, vertexColors: true } ) - // this.objectIds = [] this.postLoad = debounce( () => { this._postLoadFunction() }, 20, { maxWait: 5000 } ) this.skipPostLoad = skipPostLoad - this.loaders = [] } @@ -121,7 +115,7 @@ export default class SceneObjectManager { // Is it a transparent material? if ( renderMat.opacity !== 1 ) { let material = this.transparentMaterial.clone() - // material.clippingPlanes = this.viewer.interactions.sectionBox.planes + material.clippingPlanes = this.viewer.sectionBox.planes material.color = color material.opacity = renderMat.opacity !== 0 ? renderMat.opacity : 0.2 @@ -130,7 +124,7 @@ export default class SceneObjectManager { // It's not a transparent material! } else { let material = this.solidMaterial.clone() - // material.clippingPlanes = this.viewer.interactions.sectionBox.planes + material.clippingPlanes = this.viewer.sectionBox.planes material.color = color material.metalness = renderMat.metalness @@ -143,7 +137,7 @@ export default class SceneObjectManager { } else { // If we don't have defined material, just use the default let material = this.solidMaterial.clone() - // material.clippingPlanes = this.viewer.interactions.sectionBox.planes + material.clippingPlanes = this.viewer.sectionBox.planes return this.addSingleSolid( wrapper, material ) } @@ -204,6 +198,7 @@ export default class SceneObjectManager { this._normaliseColor( color ) let material = this.pointMaterial.clone() + material.clippingPlanes = this.viewer.sectionBox.planes // material.clippingPlanes = this.viewer.interactions.sectionBox.planes material.color = color @@ -285,11 +280,10 @@ export default class SceneObjectManager { } async _postLoadFunction() { - console.log("POST_LOAD") if ( this.skipPostLoad ) return + this.viewer.sectionBox.off() await this.sceneObjects.applyFilter() this.viewer.interactions.zoomExtents( undefined, false ) - // this.viewer.interactions.hideSectionBox() this.viewer.reflectionsNeedUpdate = false } @@ -303,7 +297,7 @@ export default class SceneObjectManager { } _argbToRGB( argb ) { - return '#'+ ( '000000' + ( argb & 0xFFFFFF ).toString( 16 ) ).slice( -6 ) + return '#' + ( '000000' + ( argb & 0xFFFFFF ).toString( 16 ) ).slice( -6 ) } _normaliseColor( color ) { diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index dc93cdc9e..4301a8b82 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -248,6 +248,9 @@ export default class SceneObjects { let groupGeometry = BufferGeometryUtils.mergeBufferGeometries( materialIdToBufferGeometry[ materialId ] ) await this.asyncPause() let groupMaterial = materialIdToMaterial[ materialId ] + // // console.log( this.viewer.sectionBox.planes ) + // // groupMaterial.clippingPlanes = [ this.viewer.sectionBox.planes[0], this.viewer.sectionBox.planes[1] ] + // groupMaterial.clippingPlanes = [ ...this.viewer.sectionBox.planes ] let groupMesh = new THREE.Mesh( groupGeometry, groupMaterial ) groupMesh.userData = null groupedObjects.add( groupMesh ) diff --git a/packages/viewer/src/modules/SectionBoxNew.js b/packages/viewer/src/modules/SectionBoxNew.js new file mode 100644 index 000000000..4fc9aba05 --- /dev/null +++ b/packages/viewer/src/modules/SectionBoxNew.js @@ -0,0 +1,321 @@ +import * as THREE from 'three' +import SelectionHelper from './SelectionHelper' +import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js' + +export default class SectionBox { + + constructor( viewer, bbox ) { + this.viewer = viewer + + this.viewer.renderer.localClippingEnabled = true + + this.orbiting = false + this.dragging = false + this.display = new THREE.Group() + this.viewer.scene.add( this.display ) + this.viewer.controls.addEventListener( 'wake', () => { this.orbiting = true } ) + this.viewer.controls.addEventListener( 'controlend', () => { this.orbiting = false } ) + + // box + this.boxGeometry = this._generateSimpleCube( 5, 5, 5 ) + // this.material = new THREE.MeshBasicMaterial() + this.material = new THREE.MeshStandardMaterial( { color: 0x00ffff, opacity:0, wireframe: true, side: THREE.DoubleSide } ) + this.cube = new THREE.Mesh( this.boxGeometry, this.material ) + this.cube.visible = false + + this.display.add( this.cube ) + + this.boxHelper = new THREE.BoxHelper( this.cube, 0x0A66FF ) + this.display.add( this.boxHelper ) + + + let sphere = new THREE.SphereGeometry( 0.01, 10, 10 ) + this.sphere = new THREE.Mesh( sphere, new THREE.MeshStandardMaterial( { color:0x00ffff } ) ) + this.display.add( this.sphere ) + + // plane + this.plane = new THREE.PlaneGeometry( 1, 1 ) + this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) + this.hoverPlane.visible = false + this.display.add( this.hoverPlane ) + + window.cube = this.cube + + // controls + this.controls = new TransformControls( this.viewer.camera, this.viewer.renderer.domElement ) + this.controls.setSize( 0.75 ) + this.display.add( this.controls ) + + + this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) + + // this.selectionHelper.on( 'hovered', args => { } ) + + this.dragging = false + + let sidesSimple = { + '256': { verts: [ 1, 2, 5, 6 ], axis:'x' }, + '152': { verts: [ 1, 2, 5, 6 ], axis:'x' }, + '407': { verts: [ 0, 3, 4, 7 ], axis:'x' }, + '703': { verts: [ 0, 3, 4, 7 ], axis:'x' }, + '327': { verts: [ 2, 3, 6, 7 ], axis:'y' }, + '726': { verts: [ 2, 3, 6, 7 ], axis:'y' }, + '450': { verts: [ 0, 1, 4, 5 ], axis:'y' }, + '051': { verts: [ 0, 1, 4, 5 ], axis:'y' }, + '312': { verts: [ 0, 1, 3, 2 ], axis:'z' }, + '013': { verts: [ 0, 1, 3, 2 ], axis:'z' }, + '546': { verts: [ 4, 5, 7, 6 ], axis:'z' }, + '647': { verts: [ 4, 5, 7, 6 ], axis:'z' } + } + + this.sidesSimple = sidesSimple + + this._generateOrUpdatePlanes() + + this.controls.addEventListener( 'dragging-changed', ( event ) => { + let val = !!event.value + if( val ) { + this.dragging = val + this.viewer.interactions.preventSelection = val + this.viewer.controls.enabled = !val + } else { + setTimeout( ()=> { + this.dragging = val + this.viewer.interactions.preventSelection = val + this.viewer.controls.enabled = !val + }, 100 ) + + } + } ) + + this.currentRange = null + this.prevPosition = null + + this.controls.addEventListener( 'change', this._draggingChangeHandler.bind( this ) ) + this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) + + this._attachControlsToBox() + } + + _draggingChangeHandler( ) { + this.boxHelper.update() + this._generateOrUpdatePlanes() + + // Dragging a side / plane + if( this.dragging && this.currentRange ) { + if( this.prevPosition === null ) this.prevPosition = this.hoverPlane.position.clone() + this.prevPosition.sub( this.hoverPlane.position ) + this.prevPosition.negate() + let boxArr = this.boxGeometry.attributes.position.array + for( let i = 0; i < this.currentRange.length; i++ ) { + let index = this.currentRange[i] + boxArr[3 * index] += this.prevPosition.x + boxArr[3 * index + 1] += this.prevPosition.y + boxArr[3 * index + 2] += this.prevPosition.z + } + + this.prevPosition = this.hoverPlane.position.clone() + this.boxGeometry.attributes.position.needsUpdate = true + this.boxGeometry.computeVertexNormals() + this.boxGeometry.computeBoundingBox() + this.boxGeometry.computeBoundingSphere() + } + + // Dragging the whole section box + if( this.dragging && !this.currentRange ) { + if( this.prevPosition === null ) this.prevPosition = this.sphere.position.clone() + this.prevPosition.sub( this.sphere.position ) + this.prevPosition.negate() + + for( let i = 0; i < this.boxGeometry.attributes.position.array.length; i += 3 ) { + this.boxGeometry.attributes.position.array[i] += this.prevPosition.x + this.boxGeometry.attributes.position.array[i + 1] += this.prevPosition.y + this.boxGeometry.attributes.position.array[i + 2] += this.prevPosition.z + } + this.boxGeometry.attributes.position.needsUpdate = true + this.boxGeometry.computeVertexNormals() + this.boxGeometry.computeBoundingBox() + this.boxGeometry.computeBoundingSphere() + + this.prevPosition = this.sphere.position.clone() + } + this.viewer.needsRender = true + } + + _clickHandler( args ) { + console.log( 'clikcer', this.dragging ) + if( this.orbiting || this.dragging ) return + if( args.length === 0 && !this.dragging ) { + this._attachControlsToBox() + return + } + + this.hoverPlane.visible = true + let side = this.sidesSimple[`${args[0].face.a}${args[0].face.b}${args[0].face.c}`] + this.controls.showX = side.axis === 'x' + this.controls.showY = side.axis === 'y' + this.controls.showZ = side.axis === 'z' + + this.currentRange = side.verts + + let boxArr = this.boxGeometry.attributes.position + let index = 0 + let planeArr = this.plane.attributes.position.array + let centre = new THREE.Vector3() + + let tempArr = [] + for( let i = 0; i < planeArr.length; i++ ) { + if( i % 3 === 0 ) { + tempArr.push( boxArr.getX( this.currentRange[index] ) ) + } + else if( i % 3 === 1 ) { + tempArr.push( boxArr.getY( this.currentRange[index] ) ) + } + else if( i % 3 === 2 ) { + tempArr.push( boxArr.getZ( this.currentRange[index] ) ) + centre.add( new THREE.Vector3( tempArr[i - 2], tempArr[i - 1], tempArr[i] ) ) + index++ + } + } + + centre.multiplyScalar( 0.25 ) + this.hoverPlane.position.copy( centre.applyMatrix4( this.cube.matrixWorld ) ) + this.prevPosition = this.hoverPlane.position.clone() + index = 0 + for( let i = 0; i < planeArr.length; i++ ) { + if( i % 3 === 0 ) { + planeArr[i] = boxArr.getX( this.currentRange[index] ) - centre.x + } + else if( i % 3 === 1 ) { + planeArr[i] = boxArr.getY( this.currentRange[index] ) - centre.y + } + else if( i % 3 === 2 ) { + planeArr[i] = boxArr.getZ( this.currentRange[index] ) - centre.z + index++ + } + } + + this.plane.applyMatrix4( this.cube.matrixWorld ) + this.plane.attributes.position.needsUpdate = true + this.plane.computeBoundingSphere() + this.plane.computeBoundingBox() + this.controls.detach() + this.controls.attach( this.hoverPlane ) + this.controls.updateMatrixWorld() + } + + _generateSimpleCube( width = 0.5, depth = 0.5, height = 0.5 ) { + const vertices = [ + [ -1 * width, -1 * depth, -1 * height ], + [ 1 * width, -1 * depth, -1 * height ], + [ 1 * width, 1 * depth, -1 * height ], + [ -1 * width, 1 * depth, -1 * height ], + [ -1 * width, -1 * depth, 1 * height ], + [ 1 * width, -1 * depth, 1 * height ], + [ 1 * width, 1 * depth, 1 * height ], + [ -1 * width, 1 * depth, 1 * height ] + ] + + const indexes = [ + 0, 1, 3, 3, 1, 2, + 1, 5, 2, 2, 5, 6, + 5, 4, 6, 6, 4, 7, + 4, 0, 7, 7, 0, 3, + 3, 2, 7, 7, 2, 6, + 4, 5, 0, 0, 5, 1 + ] + + let positions = [] + for( let vert of vertices ) { + positions.push( ...vert ) + } + + let g = new THREE.BufferGeometry() + g.setAttribute( 'position', new THREE.BufferAttribute( new Float32Array( positions ), 3 ) ) + g.setIndex( indexes ) + g.computeVertexNormals() + return g + } + + _generateOrUpdatePlanes() { + this.planes = this.planes || [ new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane() ] + // this.helpers = this.helpers || [ new THREE.PlaneHelper( this.planes[0], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[1], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[2], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[3], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[4], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[5], 1, 0xffff00 ) ] + + if( !this.helpersAdded ) { + // this.helpers.forEach( helper => this.display.add( helper ) ) + this.helpersAdded = true + } + + let index = 0 + let boxArr = this.boxGeometry.attributes.position + const indexes = [ + 0, 1, 3, 3, 1, 2, + 1, 5, 2, 2, 5, 6, + 5, 4, 6, 6, 4, 7, + 4, 0, 7, 7, 0, 3, + 3, 2, 7, 7, 2, 6, + 4, 5, 0, 0, 5, 1 + ] + + for( let i = 0; i < indexes.length; i += 6 ) { + let a = new THREE.Vector3( boxArr.getX( indexes[i] ), boxArr.getY( indexes[i] ), boxArr.getZ( indexes[i] ) ) + let b = new THREE.Vector3( boxArr.getX( indexes[i + 1] ), boxArr.getY( indexes[i + 1] ), boxArr.getZ( indexes[i + 1] ) ) + let c = new THREE.Vector3( boxArr.getX( indexes[i + 2] ), boxArr.getY( indexes[i + 2] ), boxArr.getZ( indexes[i + 2] ) ) + let plane = this.planes[index] + plane.setFromCoplanarPoints( a, b, c ) + index++ + } + } + + _attachControlsToBox() { + this.controls.detach() + + let centre = new THREE.Vector3() + let boxArr = this.boxGeometry.attributes.position.array + for( let i = 0; i < boxArr.length; i += 3 ) { + centre.add( new THREE.Vector3( boxArr[i], boxArr[i + 1], boxArr[i + 2] ) ) + } + centre.multiplyScalar( 1 / 8 ) + this.sphere.position.copy( centre ) + + this.cube.geometry.computeBoundingSphere() + this.cube.geometry.computeBoundingBox() + this.controls.attach( this.sphere ) + this.currentRange = null + this.prevPosition = null + this.hoverPlane.visible = false + this.controls.showX = true + this.controls.showY = true + this.controls.showZ = true + } + + setPlanesFromBox( box ) { + + } + + setBox( box ) { + + } + + toggle() { + this.display.visible = !this.display.visible + this.viewer.renderer.localClippingEnabled = this.display.visible + this.viewer.needsRender = true + } + + off() { + this.display.visible = false + this.viewer.renderer.localClippingEnabled = false + this.viewer.needsRender = true + } + + on() { + this.display.visible = true + this.viewer.renderer.localClippingEnabled = true + this.viewer.needsRender = true + } + + dispose() { + + } +} diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 6527eebe5..12f9da735 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -1,6 +1,7 @@ import * as THREE from 'three' import CameraControls from 'camera-controls' +import { HOLD_EVENT_TYPE, ElementHold, KeyboardKeyHold } from 'hold-event' import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js' import { SSAOPass } from 'three/examples/jsm/postprocessing/SSAOPass.js' import Stats from 'three/examples/jsm/libs/stats.module.js' @@ -10,9 +11,11 @@ import ViewerObjectLoader from './ViewerObjectLoader' import EventEmitter from './EventEmitter' import InteractionHandler from './InteractionHandler' +import SectionBox from './SectionBoxNew' + export default class Viewer extends EventEmitter { - constructor( { container, postprocessing = true, reflections = true, showStats = false } ) { + constructor( { container, postprocessing = false, reflections = true, showStats = false } ) { super() window.THREE = THREE @@ -46,7 +49,8 @@ export default class Viewer extends EventEmitter { CameraControls.install( { THREE: THREE } ) this.controls = new CameraControls( this.camera, this.renderer.domElement ) - this.controls.maxPolarAngle = Math.PI / 2 + this.controls.maxPolarAngle = Math.PI / 1.5 + this.setupWASDControls() this.composer = new EffectComposer( this.renderer ) @@ -62,9 +66,6 @@ export default class Viewer extends EventEmitter { this.controls.addEventListener( 'wake', () => { this.pauseSSAO = true } ) this.controls.addEventListener( 'sleep', () => { this.pauseSSAO = false; this.needsRender = true } ) - // Keeps track of loaded objects - this.sceneManager = new ObjectManager( this ) - if ( showStats ) { this.stats = new Stats() this.container.appendChild( this.stats.dom ) @@ -72,54 +73,104 @@ export default class Viewer extends EventEmitter { window.addEventListener( 'resize', this.onWindowResize.bind( this ), false ) + this.mouseOverRenderer = false + this.renderer.domElement.addEventListener( 'mouseover', () => { this.mouseOverRenderer = true } ) + this.renderer.domElement.addEventListener( 'mouseout', () => { this.mouseOverRenderer = false } ) + + this.loaders = {} + + this.sectionBox = new SectionBox( this ) + this.sectionBox.off() + + this.sceneManager = new ObjectManager( this ) this.interactions = new InteractionHandler( this ) - this.needsRender = true this.sceneLights() this.animate() - - this.loaders = {} + this.onWindowResize() + this.needsRender = true } sceneLights() { - let ambientLight = new THREE.AmbientLight( 0xffffff ) - this.scene.add( ambientLight ) - const lights = [] - lights[ 0 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) - lights[ 1 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) - lights[ 2 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) - lights[ 3 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) + const dirLight = new THREE.DirectionalLight( 0xffffff, 0.1 ) + dirLight.color.setHSL( 0.1, 1, 0.95 ) + dirLight.position.set( -1, 1.75, 1 ) + dirLight.position.multiplyScalar( 1000 ) + this.scene.add( dirLight ) + + const dirLight2 = new THREE.DirectionalLight( 0xffffff, 0.9 ) + dirLight2.color.setHSL( 0.1, 1, 0.95 ) + dirLight2.position.set( 0, -1.75, 1 ) + dirLight2.position.multiplyScalar( 1000 ) + this.scene.add( dirLight2 ) - let factor = 1000 - lights[ 0 ].position.set( 1 * factor, 1 * factor, 1 * factor ) - lights[ 1 ].position.set( 1 * factor, -1 * factor, 1 * factor ) - lights[ 2 ].position.set( -1 * factor, -1 * factor, 1 * factor ) - lights[ 3 ].position.set( -1 * factor, 1 * factor, 1 * factor ) - - this.scene.add( lights[ 0 ] ) - this.scene.add( lights[ 1 ] ) - this.scene.add( lights[ 2 ] ) - this.scene.add( lights[ 3 ] ) - - // let sphereSize = 0.2 - // this.scene.add( new THREE.PointLightHelper( lights[ 0 ], sphereSize ) ) - // this.scene.add( new THREE.PointLightHelper( lights[ 1 ], sphereSize ) ) - // this.scene.add( new THREE.PointLightHelper( lights[ 2 ], sphereSize ) ) - // this.scene.add( new THREE.PointLightHelper( lights[ 3 ], sphereSize ) ) - - - const hemiLight = new THREE.HemisphereLight( 0xffffff, 0x0, 0.2 ) - hemiLight.color.setHSL( 1, 1, 1 ) - hemiLight.groundColor.setHSL( 0.095, 1, 0.75 ) - hemiLight.up.set( 0, 0, 1 ) - this.scene.add( hemiLight ) + const hemiLight2 = new THREE.HemisphereLight( 0xffffff, new THREE.Color( '#232323' ), 1.9 ) + hemiLight2.color.setHSL( 1, 1, 1 ) + // hemiLight2.groundColor = new THREE.Color( '#232323' ) + hemiLight2.up.set( 0, 0, 1 ) + this.scene.add( hemiLight2 ) let axesHelper = new THREE.AxesHelper( 1 ) this.scene.add( axesHelper ) - let group = new THREE.Group() - this.scene.add( group ) + return + + + // let ambientLight = new THREE.AmbientLight( 0xffffff ) + // this.scene.add( ambientLight ) + + // const lights = [] + // lights[ 0 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) + // lights[ 1 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) + // lights[ 2 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) + // lights[ 3 ] = new THREE.PointLight( 0xffffff, 0.21, 0 ) + + // let factor = 1000 + // lights[ 0 ].position.set( 1 * factor, 1 * factor, 1 * factor ) + // lights[ 1 ].position.set( 1 * factor, -1 * factor, 1 * factor ) + // lights[ 2 ].position.set( -1 * factor, -1 * factor, 1 * factor ) + // lights[ 3 ].position.set( -1 * factor, 1 * factor, 1 * factor ) + + // this.scene.add( lights[ 0 ] ) + // this.scene.add( lights[ 1 ] ) + // this.scene.add( lights[ 2 ] ) + // this.scene.add( lights[ 3 ] ) + + // // let sphereSize = 0.2 + // // this.scene.add( new THREE.PointLightHelper( lights[ 0 ], sphereSize ) ) + // // this.scene.add( new THREE.PointLightHelper( lights[ 1 ], sphereSize ) ) + // // this.scene.add( new THREE.PointLightHelper( lights[ 2 ], sphereSize ) ) + // // this.scene.add( new THREE.PointLightHelper( lights[ 3 ], sphereSize ) ) + + + // const hemiLight = new THREE.HemisphereLight( 0xffffff, 0x0, 0.2 ) + // hemiLight.color.setHSL( 1, 1, 1 ) + // hemiLight.groundColor.setHSL( 0.095, 1, 0.75 ) + // hemiLight.up.set( 0, 0, 1 ) + // this.scene.add( hemiLight ) + + + // let group = new THREE.Group() + // this.scene.add( group ) + } + + setupWASDControls() { + const KEYCODE = { + W: 87, + A: 65, + S: 83, + D: 68 + } + + const wKey = new KeyboardKeyHold( KEYCODE.W, 16.666 ) + const aKey = new KeyboardKeyHold( KEYCODE.A, 16.666 ) + const sKey = new KeyboardKeyHold( KEYCODE.S, 16.666 ) + const dKey = new KeyboardKeyHold( KEYCODE.D, 16.666 ) + aKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.truck( -0.01 * event.deltaTime, 0, false ) }.bind( this ) ) + dKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.truck( 0.01 * event.deltaTime, 0, false ) }.bind( this ) ) + wKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.forward( 0.01 * event.deltaTime, false ) }.bind( this ) ) + sKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.forward( -0.01 * event.deltaTime, false ) }.bind( this ) ) } onWindowResize() { @@ -184,6 +235,10 @@ export default class Viewer extends EventEmitter { } } + toggleSectionBox() { + this.sectionBox.toggle() + } + async loadObject( url, token ) { let loader = new ViewerObjectLoader( this, url, token ) this.loaders[ url ] = loader From 4e4eb8e553366a59bf6a785421d13ae6f7aec0a4 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Fri, 12 Nov 2021 23:31:11 +0000 Subject: [PATCH 10/75] =?UTF-8?q?feat(viewer):=20section=20box=20zoom=20to?= =?UTF-8?q?=20box=20=E2=98=91=EF=B8=8F,=20WASD=20=E2=98=91=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/viewer/package.json | 1 + packages/viewer/src/modules/SectionBoxNew.js | 56 +++++++++++++++++--- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/packages/viewer/package.json b/packages/viewer/package.json index f0f3d3cc1..6f1f837c8 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -55,6 +55,7 @@ }, "dependencies": { "camera-controls": "^1.33.0", + "hold-event": "^0.1.0", "lodash.debounce": "^4.0.8", "rainbowvis.js": "^1.0.1", "three": "^0.134.0" diff --git a/packages/viewer/src/modules/SectionBoxNew.js b/packages/viewer/src/modules/SectionBoxNew.js index 4fc9aba05..d5a25e247 100644 --- a/packages/viewer/src/modules/SectionBoxNew.js +++ b/packages/viewer/src/modules/SectionBoxNew.js @@ -1,6 +1,7 @@ import * as THREE from 'three' import SelectionHelper from './SelectionHelper' import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js' +import { Box3 } from 'three' export default class SectionBox { @@ -143,7 +144,6 @@ export default class SectionBox { } _clickHandler( args ) { - console.log( 'clikcer', this.dragging ) if( this.orbiting || this.dragging ) return if( args.length === 0 && !this.dragging ) { this._attachControlsToBox() @@ -239,12 +239,6 @@ export default class SectionBox { _generateOrUpdatePlanes() { this.planes = this.planes || [ new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane() ] - // this.helpers = this.helpers || [ new THREE.PlaneHelper( this.planes[0], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[1], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[2], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[3], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[4], 1, 0xffff00 ), new THREE.PlaneHelper( this.planes[5], 1, 0xffff00 ) ] - - if( !this.helpersAdded ) { - // this.helpers.forEach( helper => this.display.add( helper ) ) - this.helpersAdded = true - } let index = 0 let boxArr = this.boxGeometry.attributes.position @@ -293,11 +287,57 @@ export default class SectionBox { } - setBox( box ) { + setBox( ) { + let box = null + console.log(this.viewer.interactions.selectedObjects.children.length ) + console.log(this.viewer.sceneManager.sceneObjects.allObjects.children.length ) + if( this.viewer.interactions.selectedObjects.children.length !== 0 ) { + box = new THREE.Box3( ).setFromObject(this.viewer.interactions.selectedObjects) + } else if( this.viewer.sceneManager.sceneObjects.allObjects.children.length !== 0 ){ + box = new THREE.Box3( ).setFromObject(this.viewer.sceneManager.sceneObjects.allObjects) + } else { + box = new Box3( new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, 1, 1)) + } + if(box.min.x === Infinity) { + box = new Box3( new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, 1, 1)) + } + const dist = box.min.distanceTo(box.max) + + const x1 = box.min.x - (box.max.x-box.min.x) * 0.05 // - dist * 0.05 + const y1 = box.min.y - (box.max.y-box.min.y) * 0.05 // - dist * 0.05 + const z1 = box.min.z - (box.max.z-box.min.z) * 0.05 // - dist * 0.05 + const x2 = box.max.x + (box.max.x-box.min.x) * 0.05 // + dist * 0.05 + const y2 = box.max.y + (box.max.y-box.min.y) * 0.05 // + dist * 0.05 + const z2 = box.max.z + (box.max.z-box.min.z) * 0.05 // + dist * 0.05 + const newVertices = [ + x1, y1, z1, + x2, y1, z1, + x2, y2, z1, + x1, y2, z1, + x1, y1, z2, + x2, y1, z2, + x2, y2, z2, + x1, y2, z2, + ] + + let boxVerts = this.boxGeometry.attributes.position.array + for(let i = 0; i < newVertices.length; i++) { + boxVerts[i] = newVertices[i] + } + + this.boxGeometry.attributes.position.needsUpdate = true + this.boxGeometry.computeVertexNormals() + this.boxGeometry.computeBoundingBox() + this.boxGeometry.computeBoundingSphere() + this._generateOrUpdatePlanes() + this._attachControlsToBox() + this.boxHelper.update() + this.viewer.needsRender = true } toggle() { + this.setBox() this.display.visible = !this.display.visible this.viewer.renderer.localClippingEnabled = this.display.visible this.viewer.needsRender = true From 235faf8c09fd394e1c56a2724e2af9f4edcbf22e Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sat, 13 Nov 2021 14:28:55 +0000 Subject: [PATCH 11/75] =?UTF-8?q?feat(viewer):=20adds=20ortho=20camera=20?= =?UTF-8?q?=F0=9F=A7=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/viewer/package.json | 2 +- .../viewer/src/modules/InteractionHandler.js | 54 +++---- .../viewer/src/modules/SceneObjectManager.js | 15 +- packages/viewer/src/modules/SectionBoxNew.js | 64 ++++---- .../viewer/src/modules/SelectionHelper.js | 37 ++--- packages/viewer/src/modules/Viewer.js | 73 ++------- .../viewer/src/modules/context/cameras.js | 151 ++++++++++++++++++ 7 files changed, 238 insertions(+), 158 deletions(-) create mode 100644 packages/viewer/src/modules/context/cameras.js diff --git a/packages/viewer/package.json b/packages/viewer/package.json index 6f1f837c8..ad694119f 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -54,7 +54,7 @@ "yargs": "^17.2.1" }, "dependencies": { - "camera-controls": "^1.33.0", + "camera-controls": "^1.33.1", "hold-event": "^0.1.0", "lodash.debounce": "^4.0.8", "rainbowvis.js": "^1.0.1", diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 1d84e186b..966131c36 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -50,6 +50,7 @@ export default class InteractionHandler { if ( !this.selectionHelper.multiSelect ) this.deselectObjects() + console.log(objs) let selType = objs[0].object.type @@ -111,16 +112,6 @@ export default class InteractionHandler { this.viewer.needsRender = true } - hideSectionBox() { - //if ( !this.sectionBox.display.visible ) return - //this.toggleSectionBox( ) - } - - showSectionBox() { - //if ( this.sectionBox.display.visible ) return - //this.toggleSectionBox( ) - } - zoomToObject( target, fit = 1.2, transition = true ) { const box = new THREE.Box3().setFromObject( target ) this.zoomToBox( box, fit, transition ) @@ -131,7 +122,7 @@ export default class InteractionHandler { // this.zoomToObject( this.sectionBox.boxMesh ) // return // } - if ( this.viewer.sceneManager.allObjects.length === 0 ) { + if ( this.viewer.sceneManager.sceneObjects.allObjects.length === 0 ) { let box = new THREE.Box3( new THREE.Vector3( -1,-1,-1 ), new THREE.Vector3( 1,1,1 ) ) this.zoomToBox( box, fit, transition ) return @@ -139,10 +130,13 @@ export default class InteractionHandler { let box = new THREE.Box3().setFromObject( this.viewer.sceneManager.sceneObjects.allObjects ) this.zoomToBox( box, fit, transition ) - this.viewer.controls.setBoundary( box ) + // this.viewer.controls.setBoundary( box ) } zoomToBox( box, fit = 1.2, transition = true ) { + if(box.max.x === Infinity || box.max.x === -Infinity) { + box = new THREE.Box3( new THREE.Vector3( -10,-10,-10 ), new THREE.Vector3( 10,10,10 ) ) + } const fitOffset = fit const size = box.getSize( new THREE.Vector3() ) @@ -150,18 +144,18 @@ export default class InteractionHandler { box.getBoundingSphere( target ) target.radius = target.radius * fitOffset - this.viewer.controls.fitToSphere( target, transition ) + this.viewer.cameraHandler.activeCam.controls.fitToSphere( target, transition ) - const maxSize = Math.max( size.x, size.y, size.z ) - const fitHeightDistance = maxSize / ( 2 * Math.atan( Math.PI * this.viewer.camera.fov / 360 ) ) - const fitWidthDistance = fitHeightDistance / this.viewer.camera.aspect - const distance = fitOffset * Math.max( fitHeightDistance, fitWidthDistance ) + // const maxSize = Math.max( size.x, size.y, size.z ) + // const fitHeightDistance = maxSize / ( 2 * Math.atan( Math.PI * this.viewer.camera.fov / 360 ) ) + // const fitWidthDistance = fitHeightDistance / this.viewer.camera.aspect + // const distance = fitOffset * Math.max( fitHeightDistance, fitWidthDistance ) - this.viewer.controls.minDistance = distance / 100 - this.viewer.controls.maxDistance = distance * 100 - this.viewer.camera.near = distance / 100 - this.viewer.camera.far = distance * 100 - this.viewer.camera.updateProjectionMatrix() + // this.viewer.controls.minDistance = distance / 100 + // this.viewer.controls.maxDistance = distance * 100 + // this.viewer.camera.near = distance / 100 + // this.viewer.camera.far = distance * 100 + // this.viewer.camera.updateProjectionMatrix() } /** @@ -194,29 +188,29 @@ export default class InteractionHandler { switch ( side ) { case 'front': - this.viewer.controls.rotateTo( 0, DEG90, transition ) + this.viewer.cameraHandler.activeCam.controls.rotateTo( 0, DEG90, transition ) break case 'back': - this.viewer.controls.rotateTo( DEG180, DEG90, transition ) + this.viewer.cameraHandler.activeCam.controls.rotateTo( DEG180, DEG90, transition ) break case 'up': case 'top': - this.viewer.controls.rotateTo( 0, 0, transition ) + this.viewer.cameraHandler.activeCam.controls.rotateTo( 0, 0, transition ) break case 'down': case 'bottom': - this.viewer.controls.rotateTo( 0, DEG180, transition ) + this.viewer.cameraHandler.activeCam.controls.rotateTo( 0, DEG180, transition ) break case 'right': - this.viewer.controls.rotateTo( DEG90, DEG90, transition ) + this.viewer.cameraHandler.activeCam.controls.rotateTo( DEG90, DEG90, transition ) break case 'left': - this.viewer.controls.rotateTo( -DEG90, DEG90, transition ) + this.viewer.cameraHandler.activeCam.controls.rotateTo( -DEG90, DEG90, transition ) break } } @@ -236,11 +230,11 @@ export default class InteractionHandler { let target = view.target let position = view.origin - this.viewer.controls.setLookAt( position.x, position.y, position.z, target.x, target.y, target.z, transition ) + this.viewer.cameraHandler.activeCam.controls.setLookAt( position.x, position.y, position.z, target.x, target.y, target.z, transition ) } setLookAt( position, target, transition = true ) { if ( !position || !target ) return - this.viewer.controls.setLookAt( position.x, position.y, position.z, target.x, target.y, target.z, transition ) + this.viewer.cameraHandler.activeCam.controls.setLookAt( position.x, position.y, position.z, target.x, target.y, target.z, transition ) } } diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 5c6821b30..4bccbbbdf 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -20,7 +20,8 @@ export default class SceneObjectManager { roughness: 1, metalness: 0, side: THREE.DoubleSide, - envMap: this.viewer.cubeCamera.renderTarget.texture + envMap: this.viewer.cubeCamera.renderTarget.texture, + clippingPlanes: this.viewer.sectionBox.planes } ) this.transparentMaterial = new THREE.MeshStandardMaterial( { @@ -31,21 +32,23 @@ export default class SceneObjectManager { side: THREE.DoubleSide, transparent: true, opacity: 0.4, - envMap: this.viewer.cubeCamera.renderTarget.texture + envMap: this.viewer.cubeCamera.renderTarget.texture, + clippingPlanes: this.viewer.sectionBox.planes } ) this.solidVertexMaterial = new THREE.MeshBasicMaterial( { color: 0xffffff, vertexColors: THREE.VertexColors, side: THREE.DoubleSide, - reflectivity: 0 + reflectivity: 0, + clippingPlanes: this.viewer.sectionBox.planes } ) - this.lineMaterial = new THREE.LineBasicMaterial( { color: 0x7F7F7F } ) + this.lineMaterial = new THREE.LineBasicMaterial( { color: 0x7F7F7F, clippingPlanes: this.viewer.sectionBox.planes } ) - this.pointMaterial = new THREE.PointsMaterial( { size: 2, sizeAttenuation: false, color: 0x7F7F7F } ) + this.pointMaterial = new THREE.PointsMaterial( { size: 2, sizeAttenuation: false, color: 0x7F7F7F, clippingPlanes: this.viewer.sectionBox.planes } ) - this.pointVertexColorsMaterial = new THREE.PointsMaterial( { size: 2, sizeAttenuation: false, vertexColors: true } ) + this.pointVertexColorsMaterial = new THREE.PointsMaterial( { size: 2, sizeAttenuation: false, vertexColors: true, clippingPlanes: this.viewer.sectionBox.planes } ) this.postLoad = debounce( () => { this._postLoadFunction() }, 20, { maxWait: 5000 } ) this.skipPostLoad = skipPostLoad diff --git a/packages/viewer/src/modules/SectionBoxNew.js b/packages/viewer/src/modules/SectionBoxNew.js index d5a25e247..c0e0e0a7e 100644 --- a/packages/viewer/src/modules/SectionBoxNew.js +++ b/packages/viewer/src/modules/SectionBoxNew.js @@ -10,16 +10,12 @@ export default class SectionBox { this.viewer.renderer.localClippingEnabled = true - this.orbiting = false this.dragging = false this.display = new THREE.Group() this.viewer.scene.add( this.display ) - this.viewer.controls.addEventListener( 'wake', () => { this.orbiting = true } ) - this.viewer.controls.addEventListener( 'controlend', () => { this.orbiting = false } ) // box this.boxGeometry = this._generateSimpleCube( 5, 5, 5 ) - // this.material = new THREE.MeshBasicMaterial() this.material = new THREE.MeshStandardMaterial( { color: 0x00ffff, opacity:0, wireframe: true, side: THREE.DoubleSide } ) this.cube = new THREE.Mesh( this.boxGeometry, this.material ) this.cube.visible = false @@ -29,32 +25,23 @@ export default class SectionBox { this.boxHelper = new THREE.BoxHelper( this.cube, 0x0A66FF ) this.display.add( this.boxHelper ) - + // we're attaching the gizmo mover to this sphere in the box centre let sphere = new THREE.SphereGeometry( 0.01, 10, 10 ) this.sphere = new THREE.Mesh( sphere, new THREE.MeshStandardMaterial( { color:0x00ffff } ) ) this.display.add( this.sphere ) // plane this.plane = new THREE.PlaneGeometry( 1, 1 ) - this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) + this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0.05, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) this.hoverPlane.visible = false this.display.add( this.hoverPlane ) window.cube = this.cube - - // controls - this.controls = new TransformControls( this.viewer.camera, this.viewer.renderer.domElement ) - this.controls.setSize( 0.75 ) - this.display.add( this.controls ) - - - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) - // this.selectionHelper.on( 'hovered', args => { } ) - - this.dragging = false - - let sidesSimple = { + this.dragging = false + this._setupControls() + + this.sidesSimple = { '256': { verts: [ 1, 2, 5, 6 ], axis:'x' }, '152': { verts: [ 1, 2, 5, 6 ], axis:'x' }, '407': { verts: [ 0, 3, 4, 7 ], axis:'x' }, @@ -69,33 +56,42 @@ export default class SectionBox { '647': { verts: [ 4, 5, 7, 6 ], axis:'z' } } - this.sidesSimple = sidesSimple - this._generateOrUpdatePlanes() + this.currentRange = null + this.prevPosition = null + + this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) + this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) + + this._attachControlsToBox() + + this.viewer.on('projection-change', function() { this._setupControls(); this._attachControlsToBox(); }.bind(this) ) + } + + _setupControls() { + this.controls?.dispose() + this.controls?.detach() + this.controls = new TransformControls( this.viewer.cameraHandler.activeCam.camera, this.viewer.renderer.domElement ) + this.controls.setSize( 0.75 ) + this.display.add( this.controls ) + this.controls.addEventListener( 'change', this._draggingChangeHandler.bind( this ) ) this.controls.addEventListener( 'dragging-changed', ( event ) => { let val = !!event.value if( val ) { this.dragging = val this.viewer.interactions.preventSelection = val - this.viewer.controls.enabled = !val + this.viewer.cameraHandler.enabled = !val } else { setTimeout( ()=> { this.dragging = val this.viewer.interactions.preventSelection = val - this.viewer.controls.enabled = !val + this.viewer.cameraHandler.enabled = !val }, 100 ) } } ) - - this.currentRange = null - this.prevPosition = null - - this.controls.addEventListener( 'change', this._draggingChangeHandler.bind( this ) ) - this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) - - this._attachControlsToBox() + this.viewer.needsRender = true } _draggingChangeHandler( ) { @@ -144,7 +140,7 @@ export default class SectionBox { } _clickHandler( args ) { - if( this.orbiting || this.dragging ) return + if( this.viewer.cameraHandler.orbiting || this.dragging ) return if( args.length === 0 && !this.dragging ) { this._attachControlsToBox() return @@ -283,10 +279,6 @@ export default class SectionBox { this.controls.showZ = true } - setPlanesFromBox( box ) { - - } - setBox( ) { let box = null console.log(this.viewer.interactions.selectedObjects.children.length ) diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 943ce4597..4fddce315 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -19,12 +19,6 @@ export default class SelectionHelper extends EventEmitter { this.viewer = parent this.raycaster = new THREE.Raycaster() - // Handle clicks during camera moves - this.orbiting = false - - this.viewer.controls.addEventListener( 'wake', () => { this.orbiting = true } ) - this.viewer.controls.addEventListener( 'sleep', () => { this.orbiting = false } ) - // optional param allows for raycasting against a subset of objects // this.subset = typeof _options !== 'undefined' && typeof _options.subset !== 'undefined' ? _options.subset : null; this.subset = typeof _options !== 'undefined' && typeof _options.subset !== 'undefined' ? _options.subset : null @@ -33,27 +27,27 @@ export default class SelectionHelper extends EventEmitter { // this.hoverObj = null // optional param allows for hover - if ( typeof _options !== 'undefined' && _options.hover ) { - // doesn't feel good when debounced, might be necessary tho - this.viewer.renderer.domElement.addEventListener( 'pointermove', debounce( ( e ) => { - let hovered = this.getClickedObjects( e ) + // if ( typeof _options !== 'undefined' && _options.hover ) { + // // doesn't feel good when debounced, might be necessary tho + // this.viewer.renderer.domElement.addEventListener( 'pointermove', debounce( ( e ) => { + // let hovered = this.getClickedObjects( e ) - // dragging event, this shouldn't be under the "hover option" - if ( this.pointerDown ) { - this.emit( 'object-drag', hovered, this._getNormalisedClickPosition( e ) ) - return - } + // // dragging event, this shouldn't be under the "hover option" + // if ( this.pointerDown ) { + // this.emit( 'object-drag', hovered, this._getNormalisedClickPosition( e ) ) + // return + // } - this.emit( 'hovered', hovered, e ) - },0 ) ) - } + // this.emit( 'hovered', hovered, e ) + // },0 ) ) + // } // dragging event, this shouldn't be under the "hover option" if ( typeof _options !== 'undefined' && _options.hover ) { this.viewer.renderer.domElement.addEventListener( 'pointerdown', debounce( ( e ) => { this.pointerDown = true - if ( this.orbiting ) return + if ( this.viewer.cameraHandler.orbiting ) return this.emit( 'mouse-down', this.getClickedObjects( e ) ) }, 100 ) ) @@ -74,7 +68,7 @@ export default class SelectionHelper extends EventEmitter { this.viewer.renderer.domElement.addEventListener( 'pointerup', ( e ) => { let delta = new Date().getTime() - mdTime this.pointerDown = false - if ( this.orbiting && delta > 250 ) return + if ( this.viewer.cameraHandler.orbiting && delta > 250 ) return let selectionObjects = this.getClickedObjects( e ) @@ -132,7 +126,7 @@ export default class SelectionHelper extends EventEmitter { getClickedObjects( e ) { const normalizedPosition = this._getNormalisedClickPosition( e ) - this.raycaster.setFromCamera( normalizedPosition, this.viewer.camera ) + this.raycaster.setFromCamera( normalizedPosition, this.viewer.cameraHandler.activeCam.camera ) let targetObjects if ( this.subset ) { @@ -149,7 +143,6 @@ export default class SelectionHelper extends EventEmitter { return box.containsPoint( obj.point ) } ) } - return intersectedObjects } diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 12f9da735..f6e47194a 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -10,6 +10,7 @@ import ObjectManager from './SceneObjectManager' import ViewerObjectLoader from './ViewerObjectLoader' import EventEmitter from './EventEmitter' import InteractionHandler from './InteractionHandler' +import CameraHandler from './context/cameras' import SectionBox from './SectionBoxNew' @@ -26,20 +27,14 @@ export default class Viewer extends EventEmitter { this.postprocessing = postprocessing this.scene = new THREE.Scene() - this.camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight ) - this.camera.up.set( 0, 0, 1 ) - this.camera.position.set( 1, 1, 1 ) - this.camera.updateProjectionMatrix() - this.renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true, preserveDrawingBuffer: true } ) this.renderer.setClearColor( 0xcccccc, 0 ) this.renderer.setPixelRatio( window.devicePixelRatio ) this.renderer.setSize( this.container.offsetWidth, this.container.offsetHeight ) this.container.appendChild( this.renderer.domElement ) - // commented out because the ssao flash is annoying - // this.renderer.gammaFactor = 2.2 - // this.renderer.outputEncoding = THREE.sRGBEncoding + + this.cameraHandler = new CameraHandler(this) this.reflections = reflections this.reflectionsNeedUpdate = true @@ -47,25 +42,6 @@ export default class Viewer extends EventEmitter { this.cubeCamera = new THREE.CubeCamera( 0.1, 10_000, cubeRenderTarget ) this.scene.add( this.cubeCamera ) - CameraControls.install( { THREE: THREE } ) - this.controls = new CameraControls( this.camera, this.renderer.domElement ) - this.controls.maxPolarAngle = Math.PI / 1.5 - this.setupWASDControls() - - this.composer = new EffectComposer( this.renderer ) - - this.ssaoPass = new SSAOPass( this.scene, this.camera, this.container.offsetWidth, this.container.offsetHeight ) - this.ssaoPass.kernelRadius = 0.03 - this.ssaoPass.kernelSize = 16 - this.ssaoPass.minDistance = 0.0002 - this.ssaoPass.maxDistance = 10 - this.ssaoPass.output = SSAOPass.OUTPUT.Default - this.composer.addPass( this.ssaoPass ) - - this.pauseSSAO = false - this.controls.addEventListener( 'wake', () => { this.pauseSSAO = true } ) - this.controls.addEventListener( 'sleep', () => { this.pauseSSAO = false; this.needsRender = true } ) - if ( showStats ) { this.stats = new Stats() this.container.appendChild( this.stats.dom ) @@ -155,37 +131,17 @@ export default class Viewer extends EventEmitter { // this.scene.add( group ) } - setupWASDControls() { - const KEYCODE = { - W: 87, - A: 65, - S: 83, - D: 68 - } - - const wKey = new KeyboardKeyHold( KEYCODE.W, 16.666 ) - const aKey = new KeyboardKeyHold( KEYCODE.A, 16.666 ) - const sKey = new KeyboardKeyHold( KEYCODE.S, 16.666 ) - const dKey = new KeyboardKeyHold( KEYCODE.D, 16.666 ) - aKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.truck( -0.01 * event.deltaTime, 0, false ) }.bind( this ) ) - dKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.truck( 0.01 * event.deltaTime, 0, false ) }.bind( this ) ) - wKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.forward( 0.01 * event.deltaTime, false ) }.bind( this ) ) - sKey.addEventListener( 'holding', function( event ) { if( this.mouseOverRenderer === false ) return; this.controls.forward( -0.01 * event.deltaTime, false ) }.bind( this ) ) - } - onWindowResize() { - this.camera.aspect = this.container.offsetWidth / this.container.offsetHeight - this.camera.updateProjectionMatrix() this.renderer.setSize( this.container.offsetWidth, this.container.offsetHeight ) - this.composer.setSize( this.container.offsetWidth, this.container.offsetHeight ) + // this.composer.setSize( this.container.offsetWidth, this.container.offsetHeight ) + this.needsRender = true } animate() { - // requestAnimationFrame( this.animate.bind( this ) ) - // this.controls.update() - // const delta = this.clock.getDelta() - const hasControlsUpdated = this.controls.update( delta ) + + const hasControlsUpdated = this.cameraHandler.controls.update( delta ) + // const hasOrthoControlsUpdated = this.cameraHandler.cameras[1].controls.update( delta ) requestAnimationFrame( this.animate.bind( this ) ) @@ -222,17 +178,8 @@ export default class Viewer extends EventEmitter { this.reflectionsNeedUpdate = false } - // Render as usual - // TODO: post processing SSAO sucks so much currently it's off by default - // if ( this.postprocessing && !this.pauseSSAO && !this.renderer.localClippingEnabled ){ - if ( this.postprocessing && !this.pauseSSAO ) { - // console.log('composer') - this.composer.render( this.scene, this.camera ) - } - else { - // console.log('renderer') - this.renderer.render( this.scene, this.camera ) - } + this.renderer.render( this.scene, this.cameraHandler.activeCam.camera ) + } toggleSectionBox() { diff --git a/packages/viewer/src/modules/context/cameras.js b/packages/viewer/src/modules/context/cameras.js new file mode 100644 index 000000000..b0d1c525f --- /dev/null +++ b/packages/viewer/src/modules/context/cameras.js @@ -0,0 +1,151 @@ +import * as THREE from 'three' +import CameraControls from 'camera-controls' +import { HOLD_EVENT_TYPE, ElementHold, KeyboardKeyHold } from 'hold-event' + +export default class CameraHandler { + constructor(viewer) { + this.viewer = viewer + + this.camera = new THREE.PerspectiveCamera( 55, window.innerWidth / window.innerHeight ) + this.camera.up.set( 0, 0, 1 ) + this.camera.position.set( 1, 1, 1 ) + this.camera.updateProjectionMatrix() + + let aspect = this.viewer.container.offsetWidth / this.viewer.container.offsetHeight + let fustrumSize = 50 + this.orthoCamera = new THREE.OrthographicCamera( (-fustrumSize * aspect ) / 2, (fustrumSize * aspect ) / 2, fustrumSize / 2, -fustrumSize/ 2, 0.001, 1000) + this.orthoCamera.up.set( 0, 0, 1 ) + this.orthoCamera.position.set( 100, 100, 100 ) + this.orthoCamera.updateProjectionMatrix() + + CameraControls.install( { THREE: THREE } ) + this.controls = new CameraControls( this.camera, this.viewer.renderer.domElement ) + this.controls.maxPolarAngle = Math.PI / 1.5 + this.setupWASDControls() + + this.cameras = [ + { + camera: this.camera, + controls: this.controls, + name: 'perspective', + active: true + }, + { + camera: this.orthoCamera, + controls: this.controls, + name: 'ortho', + active: false + } + ] + + this.orbiting = false + this.controls.addEventListener('wake', () => { this.orbiting = true } ) + this.controls.addEventListener('controlend', () => { this.orbiting = false } ) + + window.addEventListener( 'resize', this.onWindowResize.bind( this ), false ) + this.onWindowResize() + } + + get activeCam() { + return this.cameras[0].active ? this.cameras[0] : this.cameras[1] + } + + set activeCam( val ) { + if( val === 'perspective' ) + return this.setPerspectiveCameraOn() + if( val === 'ortho' ) + return this.setOrthoCameraOn() + } + + set enabled( val ) { + this.controls.enabled = val + } + + setPerspectiveCameraOn(){ + if(this.cameras[0].active) return + this.cameras[0].active = true + this.cameras[1].active = false + + this.setupPerspectiveCamera() + this.viewer.needsRender = true + } + + setOrthoCameraOn(){ + if(this.cameras[1].active) return + this.cameras[0].active = false + this.cameras[1].active = true + + this.setupOrthoCamera() + this.viewer.needsRender = true + } + + toggleCameras(){ + if(this.cameras[0].active) this.setOrthoCameraOn() + else this.setPerspectiveCameraOn() + } + + setupOrthoCamera() { + this.previousDistance = this.controls.distance + this.controls.mouseButtons.wheel = CameraControls.ACTION.ZOOM + + const lineOfSight = new THREE.Vector3() + this.camera.getWorldDirection(lineOfSight) + const target = new THREE.Vector3() + this.controls.getTarget(target) + const distance = target.clone().sub(this.camera.position) + const depth = distance.dot(lineOfSight) + const dims = { x: this.viewer.container.offsetWidth, y: this.viewer.container.offsetHeight } + const aspect = dims.x / dims.y + const fov = this.camera.fov + const height = depth * 2 * Math.atan((fov * (Math.PI / 180)) / 2) + const width = height * aspect + + this.orthoCamera.zoom = 1 + this.orthoCamera.left = width / -2 + this.orthoCamera.right = width / 2 + this.orthoCamera.top = height / 2 + this.orthoCamera.bottom = height / -2 + this.orthoCamera.updateProjectionMatrix() + this.orthoCamera.position.copy(this.camera.position) + this.orthoCamera.quaternion.copy(this.camera.quaternion) + this.controls.camera = this.orthoCamera + this.viewer.emit('projection-change', 'ortho' ) + } + + setupPerspectiveCamera() { + this.controls.mouseButtons.wheel = CameraControls.ACTION.DOLLY + this.camera.position.copy(this.orthoCamera.position) + this.camera.quaternion.copy(this.orthoCamera.quaternion) + this.camera.updateProjectionMatrix() + this.controls.distance = this.previousDistance + this.controls.camera = this.camera + this.controls.zoomTo(1) + this.viewer.emit('projection-change', 'perspective' ) + } + + setupWASDControls() { + const KEYCODE = { W: 87, A: 65, S: 83, D: 68 } + + const wKey = new KeyboardKeyHold( KEYCODE.W, 16.666 ) + const aKey = new KeyboardKeyHold( KEYCODE.A, 16.666 ) + const sKey = new KeyboardKeyHold( KEYCODE.S, 16.666 ) + const dKey = new KeyboardKeyHold( KEYCODE.D, 16.666 ) + aKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.truck( -0.01 * event.deltaTime, 0, false ); return; }.bind( this ) ) + dKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.truck( 0.01 * event.deltaTime, 0, false ); return;}.bind( this ) ) + wKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.forward( 0.01 * event.deltaTime, false ); return; }.bind( this ) ) + sKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.forward( -0.01 * event.deltaTime, false ); return; }.bind( this ) ) + } + + onWindowResize() { + this.camera.aspect = this.viewer.container.offsetWidth / this.viewer.container.offsetHeight + this.camera.updateProjectionMatrix() + + let aspect = this.viewer.container.offsetWidth / this.viewer.container.offsetHeight + let fustrumSize = 50 + this.orthoCamera.left = (-fustrumSize * aspect ) / 2 + this.orthoCamera.right = (fustrumSize * aspect ) / 2 + this.orthoCamera.top = fustrumSize / 2 + this.orthoCamera.bottom = -fustrumSize/2 + this.orthoCamera.updateProjectionMatrix() + } +} \ No newline at end of file From c6e2a26c393487f7036180254416bd8e813c3b6c Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sat, 13 Nov 2021 16:59:38 +0000 Subject: [PATCH 12/75] feat(viewer): better selection handling post rotations --- packages/viewer/src/assets/example.html | 4 +-- .../viewer/src/modules/InteractionHandler.js | 10 ++++-- packages/viewer/src/modules/SectionBoxNew.js | 9 ++--- .../viewer/src/modules/SelectionHelper.js | 36 ++++++++++--------- packages/viewer/src/modules/Viewer.js | 7 ++++ .../viewer/src/modules/context/cameras.js | 16 +++++++-- 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index df94c20a7..341453768 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -20,7 +20,7 @@ - +
@@ -43,7 +43,7 @@
- + View: diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 966131c36..e74ae3b0a 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -25,6 +25,12 @@ export default class InteractionHandler { this.selectionHelper.on( 'object-doubleclicked', this._handleDoubleClick.bind( this ) ) this.selectionHelper.on( 'object-clicked', this._handleSelect.bind( this ) ) + + document.addEventListener('keydown', (e) => { + if(e.key === 'Escape' && this.viewer.mouseOverRenderer){ + this.deselectObjects() + } + }) } _handleDoubleClick( objs ) { @@ -41,6 +47,8 @@ export default class InteractionHandler { } _handleSelect( objs ) { + console.log(this.viewer.cameraHandler.orbiting ) + if(this.viewer.cameraHandler.orbiting ) return if ( this.preventSelection ) return if ( objs.length === 0 ) { @@ -49,8 +57,6 @@ export default class InteractionHandler { } if ( !this.selectionHelper.multiSelect ) this.deselectObjects() - - console.log(objs) let selType = objs[0].object.type diff --git a/packages/viewer/src/modules/SectionBoxNew.js b/packages/viewer/src/modules/SectionBoxNew.js index c0e0e0a7e..03ad55ef7 100644 --- a/packages/viewer/src/modules/SectionBoxNew.js +++ b/packages/viewer/src/modules/SectionBoxNew.js @@ -16,13 +16,14 @@ export default class SectionBox { // box this.boxGeometry = this._generateSimpleCube( 5, 5, 5 ) - this.material = new THREE.MeshStandardMaterial( { color: 0x00ffff, opacity:0, wireframe: true, side: THREE.DoubleSide } ) + this.material = new THREE.MeshStandardMaterial( { color: 0x00ffff, opacity:0, wireframe: false, side: THREE.DoubleSide } ) this.cube = new THREE.Mesh( this.boxGeometry, this.material ) this.cube.visible = false this.display.add( this.cube ) this.boxHelper = new THREE.BoxHelper( this.cube, 0x0A66FF ) + this.boxHelper.material.opacity = 0.4 this.display.add( this.boxHelper ) // we're attaching the gizmo mover to this sphere in the box centre @@ -32,11 +33,9 @@ export default class SectionBox { // plane this.plane = new THREE.PlaneGeometry( 1, 1 ) - this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0.05, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) + this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0.1, wireframe: false, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) this.hoverPlane.visible = false this.display.add( this.hoverPlane ) - - window.cube = this.cube this.dragging = false this._setupControls() @@ -143,9 +142,11 @@ export default class SectionBox { if( this.viewer.cameraHandler.orbiting || this.dragging ) return if( args.length === 0 && !this.dragging ) { this._attachControlsToBox() + this.boxHelper.material.opacity = 0.5 return } + this.boxHelper.material.opacity = 0.3 this.hoverPlane.visible = true let side = this.sidesSimple[`${args[0].face.a}${args[0].face.b}${args[0].face.c}`] this.controls.showX = side.axis === 'x' diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 4fddce315..001e35399 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -27,20 +27,20 @@ export default class SelectionHelper extends EventEmitter { // this.hoverObj = null // optional param allows for hover - // if ( typeof _options !== 'undefined' && _options.hover ) { - // // doesn't feel good when debounced, might be necessary tho - // this.viewer.renderer.domElement.addEventListener( 'pointermove', debounce( ( e ) => { - // let hovered = this.getClickedObjects( e ) + if ( typeof _options !== 'undefined' && _options.hover ) { + // doesn't feel good when debounced, might be necessary tho + this.viewer.renderer.domElement.addEventListener( 'pointermove', debounce( ( e ) => { + let hovered = this.getClickedObjects( e ) - // // dragging event, this shouldn't be under the "hover option" - // if ( this.pointerDown ) { - // this.emit( 'object-drag', hovered, this._getNormalisedClickPosition( e ) ) - // return - // } + // dragging event, this shouldn't be under the "hover option" + if ( this.pointerDown ) { + this.emit( 'object-drag', hovered, this._getNormalisedClickPosition( e ) ) + return + } - // this.emit( 'hovered', hovered, e ) - // },0 ) ) - // } + this.emit( 'hovered', hovered, e ) + },0 ) ) + } // dragging event, this shouldn't be under the "hover option" if ( typeof _options !== 'undefined' && _options.hover ) { @@ -59,16 +59,18 @@ export default class SelectionHelper extends EventEmitter { } // Handle mouseclicks - let mdTime this.viewer.renderer.domElement.addEventListener( 'pointerdown', ( ) => { mdTime = new Date().getTime() } ) this.viewer.renderer.domElement.addEventListener( 'pointerup', ( e ) => { + if( this.viewer.cameraHandler.orbiting ) return + let delta = new Date().getTime() - mdTime this.pointerDown = false - if ( this.viewer.cameraHandler.orbiting && delta > 250 ) return + + if ( delta > 250 ) return let selectionObjects = this.getClickedObjects( e ) @@ -136,9 +138,9 @@ export default class SelectionHelper extends EventEmitter { } let intersectedObjects = this.raycaster.intersectObjects( targetObjects ) - - if ( this.sectionBox && this.sectionBox.display.visible ) { - let box = new THREE.Box3().setFromObject( this.sectionBox.boxMesh ) + // filters objects in section box mode + if ( this.viewer.sectionBox.display.visible ) { + let box = new THREE.Box3().setFromObject( this.viewer.sectionBox.cube ) intersectedObjects = intersectedObjects.filter( obj => { return box.containsPoint( obj.point ) } ) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index f6e47194a..4188ce7b5 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -197,6 +197,13 @@ export default class Viewer extends EventEmitter { delete this.loaders[ url ] } + async unloadAll() { + for(let key of Object.keys(this.loaders)) { + await this.loaders[key].unload() + delete this.loaders[key] + } + } + async applyFilter( filter ) { return await this.sceneManager.sceneObjects.applyFilter( filter ) } diff --git a/packages/viewer/src/modules/context/cameras.js b/packages/viewer/src/modules/context/cameras.js index b0d1c525f..577d959e3 100644 --- a/packages/viewer/src/modules/context/cameras.js +++ b/packages/viewer/src/modules/context/cameras.js @@ -39,8 +39,20 @@ export default class CameraHandler { ] this.orbiting = false - this.controls.addEventListener('wake', () => { this.orbiting = true } ) - this.controls.addEventListener('controlend', () => { this.orbiting = false } ) + this.controls.addEventListener('wake', () => { + // console.log( 'orbiting') + this.orbiting = true + } ) + + this.controls.addEventListener('controlend', () => { + // console.log( 'controlend') + // this.orbiting = false + } ) + + this.controls.addEventListener('rest', () => { + // console.log( 'rest') + setTimeout( () => { this.orbiting = false }, 400 ) + } ) window.addEventListener( 'resize', this.onWindowResize.bind( this ), false ) this.onWindowResize() From fb546f5a399cf75f0760262b9569a20b4b8c1abe Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sat, 13 Nov 2021 17:56:50 +0000 Subject: [PATCH 13/75] feat(viewer): fixes some weird edge cases on ortho camera (a few more remain) --- .../viewer/src/modules/InteractionHandler.js | 21 +++++++++++-------- packages/viewer/src/modules/SectionBoxNew.js | 1 - packages/viewer/src/modules/Viewer.js | 2 +- .../viewer/src/modules/context/cameras.js | 1 + 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index e74ae3b0a..88b904b1d 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -152,16 +152,19 @@ export default class InteractionHandler { this.viewer.cameraHandler.activeCam.controls.fitToSphere( target, transition ) - // const maxSize = Math.max( size.x, size.y, size.z ) - // const fitHeightDistance = maxSize / ( 2 * Math.atan( Math.PI * this.viewer.camera.fov / 360 ) ) - // const fitWidthDistance = fitHeightDistance / this.viewer.camera.aspect - // const distance = fitOffset * Math.max( fitHeightDistance, fitWidthDistance ) + const maxSize = Math.max( size.x, size.y, size.z ) + const fitHeightDistance = maxSize / ( 2 * Math.atan( Math.PI * this.viewer.cameraHandler.camera.fov / 360 ) ) + const fitWidthDistance = fitHeightDistance / this.viewer.cameraHandler.camera.aspect + const distance = fitOffset * Math.max( fitHeightDistance, fitWidthDistance ) - // this.viewer.controls.minDistance = distance / 100 - // this.viewer.controls.maxDistance = distance * 100 - // this.viewer.camera.near = distance / 100 - // this.viewer.camera.far = distance * 100 - // this.viewer.camera.updateProjectionMatrix() + this.viewer.cameraHandler.controls.minDistance = distance / 100 + this.viewer.cameraHandler.controls.maxDistance = distance * 100 + this.viewer.cameraHandler.camera.near = distance / 100 + this.viewer.cameraHandler.camera.far = distance * 100 + this.viewer.cameraHandler.camera.updateProjectionMatrix() + this.viewer.cameraHandler.orthoCamera.near = distance / 100 + this.viewer.cameraHandler.orthoCamera.far = distance * 100 + this.viewer.cameraHandler.orthoCamera.updateProjectionMatrix() } /** diff --git a/packages/viewer/src/modules/SectionBoxNew.js b/packages/viewer/src/modules/SectionBoxNew.js index 03ad55ef7..caad8aac6 100644 --- a/packages/viewer/src/modules/SectionBoxNew.js +++ b/packages/viewer/src/modules/SectionBoxNew.js @@ -62,7 +62,6 @@ export default class SectionBox { this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) - this._attachControlsToBox() this.viewer.on('projection-change', function() { this._setupControls(); this._attachControlsToBox(); }.bind(this) ) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 4188ce7b5..e1cef933b 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -213,6 +213,6 @@ export default class Viewer extends EventEmitter { } dispose() { - // TODO + // TODO: currently it's easier to simply refresh the page } } diff --git a/packages/viewer/src/modules/context/cameras.js b/packages/viewer/src/modules/context/cameras.js index 577d959e3..06bcc1a65 100644 --- a/packages/viewer/src/modules/context/cameras.js +++ b/packages/viewer/src/modules/context/cameras.js @@ -117,6 +117,7 @@ export default class CameraHandler { this.orthoCamera.right = width / 2 this.orthoCamera.top = height / 2 this.orthoCamera.bottom = height / -2 + this.orthoCamera.far = this.camera.far this.orthoCamera.updateProjectionMatrix() this.orthoCamera.position.copy(this.camera.position) this.orthoCamera.quaternion.copy(this.camera.quaternion) From 2562094d58d86d01482cdc6c8ffef5bbf4654f3f Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sun, 14 Nov 2021 11:13:23 +0000 Subject: [PATCH 14/75] feat(viewer): various fixes, fiddles --- packages/viewer/src/modules/Filtering.js | 218 ++- .../viewer/src/modules/InteractionHandler.js | 50 +- .../viewer/src/modules/SceneObjectManager.js | 6 +- packages/viewer/src/modules/SceneObjects.js | 8 +- packages/viewer/src/modules/SectionBox.js | 547 ++++-- packages/viewer/src/modules/SectionBoxNew.js | 353 ---- packages/viewer/src/modules/Viewer.js | 9 +- .../context/{cameras.js => CameraHanlder.js} | 78 +- .../src/modules/external/TransformControls.js | 1709 ----------------- 9 files changed, 500 insertions(+), 2478 deletions(-) delete mode 100644 packages/viewer/src/modules/SectionBoxNew.js rename packages/viewer/src/modules/context/{cameras.js => CameraHanlder.js} (66%) delete mode 100644 packages/viewer/src/modules/external/TransformControls.js diff --git a/packages/viewer/src/modules/Filtering.js b/packages/viewer/src/modules/Filtering.js index 28e705aaf..cadce8633 100644 --- a/packages/viewer/src/modules/Filtering.js +++ b/packages/viewer/src/modules/Filtering.js @@ -1,26 +1,31 @@ import * as THREE from 'three' import Rainbow from 'rainbowvis.js' -import { cloneUniforms } from 'three' -const WireframeMaterial = new THREE.MeshStandardMaterial( { - color: 0x7080A0, - side: THREE.DoubleSide, - transparent: true, - opacity: 0.04, - wireframe: true -} ) +export default class FilteringManager { + + constructor( viewer ) { + this.viewer = viewer + this.WireframeMaterial = new THREE.MeshStandardMaterial( { + color: 0x7080A0, + side: THREE.DoubleSide, + transparent: true, + opacity: 0.04, + wireframe: true, + clippingPlanes: this.viewer.sectionBox.planes + } ) + + this.ColoredMaterial = new THREE.MeshStandardMaterial( { + color: 0x7080A0, + side: THREE.DoubleSide, + transparent: false, + clippingPlanes: this.viewer.sectionBox.planes + } ) + } -const ColoredMaterial = new THREE.MeshStandardMaterial( { - color: 0x7080A0, - side: THREE.DoubleSide, - transparent: false -} ) - - -export function filterAndColorObject( obj, filter ) { + filterAndColorObject( obj, filter ) { if ( !filter ) return obj.clone() - if ( !passesFilter( obj.userData, filter.filterBy ) ) + if ( !this.passesFilter( obj.userData, filter.filterBy ) ) { if ( filter.ghostOthers && obj.type === 'Mesh' ) { let clone = obj.clone() @@ -37,104 +42,105 @@ export function filterAndColorObject( obj, filter ) { let clone = obj.clone() if ( filter.colorBy ) { if ( filter.colorBy.type === 'category' ) { - clone.material = colorWithCategory( obj.userData, filter.colorBy ) + clone.material = this.colorWithCategory( obj.userData, filter.colorBy ) } else if ( filter.colorBy.type === 'gradient' ) { - clone.material = colorWithGradient( obj, filter.colorBy ) + clone.material = this.colorWithGradient( obj, filter.colorBy ) } } - return clone -} - -function getObjectProperty( obj, property ) { - if ( !property ) return - let keyParts = property.split( '.' ) - let crtObj = obj - for ( let i = 0; i < keyParts.length - 1; i++ ) { - if ( !( keyParts[i] in crtObj ) ) return - crtObj = crtObj[ keyParts[i] ] - if ( crtObj.constructor !== Object ) return - } - let attributeName = keyParts[ keyParts.length - 1 ] - return crtObj[ attributeName ] -} - -function colorWithCategory( obj, colors ) { - let defaultValue = colors.default - let color = defaultValue - let objValue = getObjectProperty( obj, colors.property ) - let customPallete = colors.values || {} - if ( objValue in customPallete ) { - color = customPallete[ objValue ] } - if ( !color ) { - // compute value hash - let objValueAsString = '' + objValue - let hash = 0 - for( let i = 0; i < objValueAsString.length; i++ ) { - let chr = objValueAsString.charCodeAt( i ) - hash = ( ( hash << 5 ) - hash ) + chr - hash |= 0 // Convert to 32bit integer - } - hash = Math.abs( hash ) - let colorHue = hash % 360 - color = `hsl(${colorHue}, 50%, 30%)` - } - - let material = ColoredMaterial.clone() - material.color = new THREE.Color( color ) - return material -} - -function colorWithGradient( threejsObj, colors ) { - let obj = threejsObj.userData - let rainbow = new Rainbow( ) - if ( 'minValue' in colors && 'maxValue' in colors ) - rainbow.setNumberRange( colors.minValue, colors.maxValue ) - if ( 'gradientColors' in colors ) - rainbow.setSpectrum( ...colors.gradientColors ) - - let objValue = getObjectProperty( obj, colors.property ) - objValue = Number( objValue ) - if ( Number.isNaN( objValue ) ) { - return WireframeMaterial + getObjectProperty( obj, property ) { + if ( !property ) return + let keyParts = property.split( '.' ) + let crtObj = obj + for ( let i = 0; i < keyParts.length - 1; i++ ) { + if ( !( keyParts[i] in crtObj ) ) return + crtObj = crtObj[ keyParts[i] ] + if ( crtObj.constructor !== Object ) return + } + let attributeName = keyParts[ keyParts.length - 1 ] + return crtObj[ attributeName ] } - let material = ColoredMaterial.clone() - material.color = new THREE.Color( `#${rainbow.colourAt( objValue )}` ) - return material -} - -function passesFilter( obj, filterBy ) { - if ( !filterBy ) return true - for ( let filterKey in filterBy ) { - let objValue = getObjectProperty( obj, filterKey ) - - let passesFilter = filterValue( objValue, filterBy[ filterKey ] ) - if ( !passesFilter ) return false - } - return true -} - -function filterValue( objValue, valueFilter ) { - // Array value filter means it can be any value from the array - if ( Array.isArray( valueFilter ) ) - return valueFilter.includes( objValue ) - - // Dictionary value filter can specify ranges with `lte` and `gte` fields (LowerThanOrEqual, GreaterThanOrEqual) - if ( valueFilter.constructor === Object ) { - if ( 'not' in valueFilter && Array.isArray( valueFilter.not ) ) { - if ( valueFilter.not.includes( objValue ) ) - return false + colorWithCategory( obj, colors ) { + let defaultValue = colors.default + let color = defaultValue + let objValue = this.getObjectProperty( obj, colors.property ) + let customPallete = colors.values || {} + if ( objValue in customPallete ) { + color = customPallete[ objValue ] + } + + if ( !color ) { + // compute value hash + let objValueAsString = '' + objValue + let hash = 0 + for( let i = 0; i < objValueAsString.length; i++ ) { + let chr = objValueAsString.charCodeAt( i ) + hash = ( ( hash << 5 ) - hash ) + chr + hash |= 0 // Convert to 32bit integer + } + hash = Math.abs( hash ) + let colorHue = hash % 360 + color = `hsl(${colorHue}, 50%, 30%)` + } + + let material = this.ColoredMaterial.clone() + material.color = new THREE.Color( color ) + return material + } + + colorWithGradient( threejsObj, colors ) { + let obj = threejsObj.userData + let rainbow = new Rainbow( ) + if ( 'minValue' in colors && 'maxValue' in colors ) + rainbow.setNumberRange( colors.minValue, colors.maxValue ) + if ( 'gradientColors' in colors ) + rainbow.setSpectrum( ...colors.gradientColors ) + + let objValue = this.getObjectProperty( obj, colors.property ) + objValue = Number( objValue ) + if ( Number.isNaN( objValue ) ) { + return this.WireframeMaterial + } + + let material = this.ColoredMaterial.clone() + material.color = new THREE.Color( `#${rainbow.colourAt( objValue )}` ) + return material + } + + passesFilter( obj, filterBy ) { + if ( !filterBy ) return true + for ( let filterKey in filterBy ) { + let objValue = this.getObjectProperty( obj, filterKey ) + + let passesFilter = this.filterValue( objValue, filterBy[ filterKey ] ) + if ( !passesFilter ) return false } - if ( 'lte' in valueFilter && objValue > valueFilter.lte ) - return false - if ( 'gte' in valueFilter && objValue < valueFilter.gte ) - return false return true } - - // Can also filter by specific value - return objValue === valueFilter + + filterValue( objValue, valueFilter ) { + // Array value filter means it can be any value from the array + if ( Array.isArray( valueFilter ) ) + return valueFilter.includes( objValue ) + + // Dictionary value filter can specify ranges with `lte` and `gte` fields (LowerThanOrEqual, GreaterThanOrEqual) + if ( valueFilter.constructor === Object ) { + if ( 'not' in valueFilter && Array.isArray( valueFilter.not ) ) { + if ( valueFilter.not.includes( objValue ) ) + return false + } + if ( 'lte' in valueFilter && objValue > valueFilter.lte ) + return false + if ( 'gte' in valueFilter && objValue < valueFilter.gte ) + return false + return true + } + + // Can also filter by specific value + return objValue === valueFilter + } } + diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 88b904b1d..58678db1c 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -1,5 +1,4 @@ import * as THREE from 'three' -import SectionBox from './SectionBox' import SelectionHelper from './SelectionHelper' export default class InteractionHandler { @@ -26,11 +25,11 @@ export default class InteractionHandler { this.selectionHelper.on( 'object-doubleclicked', this._handleDoubleClick.bind( this ) ) this.selectionHelper.on( 'object-clicked', this._handleSelect.bind( this ) ) - document.addEventListener('keydown', (e) => { - if(e.key === 'Escape' && this.viewer.mouseOverRenderer){ + document.addEventListener( 'keydown', ( e ) => { + if( e.key === 'Escape' && this.viewer.mouseOverRenderer ) { this.deselectObjects() } - }) + } ) } _handleDoubleClick( objs ) { @@ -47,8 +46,8 @@ export default class InteractionHandler { } _handleSelect( objs ) { - console.log(this.viewer.cameraHandler.orbiting ) - if(this.viewer.cameraHandler.orbiting ) return + console.log( this.viewer.cameraHandler.orbiting ) + if( this.viewer.cameraHandler.orbiting ) return if ( this.preventSelection ) return if ( objs.length === 0 ) { @@ -100,34 +99,16 @@ export default class InteractionHandler { this.viewer.emit( 'select', this.selectedObjectsUserData ) } - toggleSectionBox() { - this.sectionBox.toggle() - if ( this.sectionBox.display.visible ) { - if ( this.selectedObjects.children.length === 0 ) { - this.sectionBox.setBox( this.viewer.sceneManager.getSceneBoundingBox() ) - this.zoomExtents() - } - else { - let box = new THREE.Box3().setFromObject( this.selectedObjects ) - this.sectionBox.setBox( box ) - this.zoomToBox( box ) - } - } else { - this.preventSelection = false - } - this.viewer.needsRender = true - } - zoomToObject( target, fit = 1.2, transition = true ) { const box = new THREE.Box3().setFromObject( target ) this.zoomToBox( box, fit, transition ) } zoomExtents( fit = 1.2, transition = true ) { - // if ( this.sectionBox.display.visible ) { - // this.zoomToObject( this.sectionBox.boxMesh ) - // return - // } + if ( this.viewer.sectionBox.display.visible ) { + this.zoomToObject( this.viewer.sectionBox.cube ) + return + } if ( this.viewer.sceneManager.sceneObjects.allObjects.length === 0 ) { let box = new THREE.Box3( new THREE.Vector3( -1,-1,-1 ), new THREE.Vector3( 1,1,1 ) ) this.zoomToBox( box, fit, transition ) @@ -140,8 +121,8 @@ export default class InteractionHandler { } zoomToBox( box, fit = 1.2, transition = true ) { - if(box.max.x === Infinity || box.max.x === -Infinity) { - box = new THREE.Box3( new THREE.Vector3( -10,-10,-10 ), new THREE.Vector3( 10,10,10 ) ) + if( box.max.x === Infinity || box.max.x === -Infinity ) { + box = new THREE.Box3( new THREE.Vector3( -5,-5,-5 ), new THREE.Vector3( 5,5,5 ) ) } const fitOffset = fit @@ -167,15 +148,6 @@ export default class InteractionHandler { this.viewer.cameraHandler.orthoCamera.updateProjectionMatrix() } - /** - * Allows camera to go "underneath" or not. By default, this function will set - * the max polar angle to Pi, allowing the camera to look from down upwards. - * @param {[type]} angle [description] - */ - setMaxPolarAngle( angle = Math.PI ) { - this.viewer.controls.maxPolarAngle = angle - } - rotateCamera( azimuthAngle = 0.261799, polarAngle = 0, transition = true ) { this.viewer.controls.rotate( azimuthAngle, polarAngle, transition ) } diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 4bccbbbdf..0a494379d 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -109,7 +109,7 @@ export default class SceneObjectManager { } - addSolid( wrapper, addToScene = true ) { + addSolid( wrapper, _addToScene = true ) { // Do we have a defined material? if ( wrapper.meta.renderMaterial ) { let renderMat = wrapper.meta.renderMaterial @@ -242,10 +242,6 @@ export default class SceneObjectManager { return group } - removeObject( id ) { - // TODO - } - async removeImportedObject( importedUrl ) { for ( let objGroup of this.sceneObjects.allObjects.children ) { let toRemove = objGroup.children.filter( obj => obj.userData?.__importedUrl === importedUrl ) diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index 4301a8b82..2660b0b9d 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -2,7 +2,7 @@ import * as THREE from 'three' import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' // import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils' import debounce from 'lodash.debounce' -import { filterAndColorObject } from './Filtering' +import FilteringManager from './Filtering' /** * Container for the scene objects, to allow loading/unloading/filtering/coloring/grouping @@ -38,6 +38,7 @@ export default class SceneObjects { this.groupedSolidObjects.name = 'groupedSolidObjects' this.allObjects.add( this.groupedSolidObjects ) + this.filteringManager = new FilteringManager( this.viewer ) this.filteredObjects = null this.appliedFilter = null @@ -125,7 +126,7 @@ export default class SceneObjects { for ( let obj of threejsGroup.children ) { await this.asyncPause() - let filteredObj = filterAndColorObject( obj, filter ) + let filteredObj = this.filteringManager.filterAndColorObject( obj, filter ) if ( filteredObj ) ret.add( filteredObj ) } @@ -248,9 +249,6 @@ export default class SceneObjects { let groupGeometry = BufferGeometryUtils.mergeBufferGeometries( materialIdToBufferGeometry[ materialId ] ) await this.asyncPause() let groupMaterial = materialIdToMaterial[ materialId ] - // // console.log( this.viewer.sectionBox.planes ) - // // groupMaterial.clippingPlanes = [ this.viewer.sectionBox.planes[0], this.viewer.sectionBox.planes[1] ] - // groupMaterial.clippingPlanes = [ ...this.viewer.sectionBox.planes ] let groupMesh = new THREE.Mesh( groupGeometry, groupMaterial ) groupMesh.userData = null groupedObjects.add( groupMesh ) diff --git a/packages/viewer/src/modules/SectionBox.js b/packages/viewer/src/modules/SectionBox.js index dd18afb4d..d6af28e8d 100644 --- a/packages/viewer/src/modules/SectionBox.js +++ b/packages/viewer/src/modules/SectionBox.js @@ -1,246 +1,371 @@ import * as THREE from 'three' import SelectionHelper from './SelectionHelper' -import { TransformControls } from './external/TransformControls.js' +import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js' +import { Box3 } from 'three' export default class SectionBox { - constructor( viewer, bbox ) { + constructor( viewer ) { this.viewer = viewer - this.orbiting = false + this.viewer.renderer.localClippingEnabled = true + this.dragging = false this.display = new THREE.Group() - this.viewer.controls.addEventListener( 'wake', () => { this.orbiting = true } ) - this.viewer.controls.addEventListener( 'controlend', () => { this.orbiting = false } ) - - this.box = bbox || this.viewer.sceneManager.getSceneBoundingBox() - const dimensions = new THREE.Vector3().subVectors( this.box.max, this.box.min ) - this.boxGeo = new THREE.BoxGeometry( dimensions.x, dimensions.y, dimensions.z ) - - const matrix = new THREE.Matrix4().setPosition( dimensions.addVectors( this.box.min, this.box.max ).multiplyScalar( 0.5 ) ) - this.boxGeo.applyMatrix4( matrix ) - this.boxMesh = new THREE.Mesh( this.boxGeo, new THREE.MeshBasicMaterial() ) - - this.boxHelper = new THREE.BoxHelper( this.boxMesh, 0x0A66FF ) - - const plane = new THREE.PlaneGeometry( 1, 1 ) - this.hoverPlane = new THREE.Mesh( plane, new THREE.MeshStandardMaterial( { - transparent: true, - side: THREE.DoubleSide, - opacity: 0.02, - color: 0x0A66FF, - metalness: 0.1, - roughness: 0.75 - } ) ) - - this.display.add( this.boxHelper ) - this.display.add( this.hoverPlane ) - this.viewer.scene.add( this.display ) - this.boxMesh.userData.planes = [] - this.boxMesh.userData.indices = [] - this.planes = [] + // box + this.boxGeometry = this._generateSimpleCube( 5, 5, 5 ) + this.material = new THREE.MeshStandardMaterial( { color: 0x00ffff, opacity:0, wireframe: false, side: THREE.DoubleSide } ) + this.cube = new THREE.Mesh( this.boxGeometry, this.material ) + this.cube.visible = false - // Gen box and planes - this._generatePlanes() + this.display.add( this.cube ) - // Box face selection controls - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.boxMesh, hover: true } ) - let targetFaceIndex = -1 + this.boxHelper = new THREE.BoxHelper( this.cube, 0x0A66FF ) + this.boxHelper.material.opacity = 0.4 + this.display.add( this.boxHelper ) - this.selectionHelper.on( 'hovered', ( obj ) => { - if ( obj.length === 0 && !this.dragging ) { - this.hoverPlane.visible = false + // we're attaching the gizmo mover to this sphere in the box centre + let sphere = new THREE.SphereGeometry( 0.01, 10, 10 ) + this.sphere = new THREE.Mesh( sphere, new THREE.MeshStandardMaterial( { color:0x00ffff } ) ) + this.display.add( this.sphere ) + + // plane + this.plane = new THREE.PlaneGeometry( 1, 1 ) + this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0.1, wireframe: false, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) + this.hoverPlane.visible = false + this.display.add( this.hoverPlane ) + + this.dragging = false + this._setupControls() + + this.sidesSimple = { + '256': { verts: [ 1, 2, 5, 6 ], axis:'x' }, + '152': { verts: [ 1, 2, 5, 6 ], axis:'x' }, + '407': { verts: [ 0, 3, 4, 7 ], axis:'x' }, + '703': { verts: [ 0, 3, 4, 7 ], axis:'x' }, + '327': { verts: [ 2, 3, 6, 7 ], axis:'y' }, + '726': { verts: [ 2, 3, 6, 7 ], axis:'y' }, + '450': { verts: [ 0, 1, 4, 5 ], axis:'y' }, + '051': { verts: [ 0, 1, 4, 5 ], axis:'y' }, + '312': { verts: [ 0, 1, 3, 2 ], axis:'z' }, + '013': { verts: [ 0, 1, 3, 2 ], axis:'z' }, + '546': { verts: [ 4, 5, 7, 6 ], axis:'z' }, + '647': { verts: [ 4, 5, 7, 6 ], axis:'z' } + } + + this._generateOrUpdatePlanes() + + this.currentRange = null + this.prevPosition = null + this.attachedToBox = true + + this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) + this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) + this.selectionHelper.on( 'hovered', ( objs ) =>{ + if( !this.attachedToBox ) return + if( objs.length === 0 ) { + this.controls.visible = false + this.viewer.needsRender = true + } + else if( objs.length !== 0 ) { this.controls.visible = true - this.planeControls.detach() - this.viewer.controls.enabled = true - this.viewer.interactions.preventSelection = false this.viewer.needsRender = true - targetFaceIndex = -1 - return - } - if ( this.orbiting || this.dragging ) return - - this.controls.visible = false - this.hoverPlane.visible = true - - let centre = new THREE.Vector3() - for ( let i = 0; i < 4; i++ ) { - centre.add( this.boxGeo.vertices[ obj[0].object.userData.indices[ obj[0].faceIndex ][i] ].clone().applyMatrix4( this.boxMesh.matrixWorld ) ) - } - centre.multiplyScalar( 0.25 ) - this.hoverPlane.position.copy( centre ) - - for ( let i = 0; i < 4; i++ ) { - let vertex = this.boxGeo.vertices[ obj[0].object.userData.indices[ obj[0].faceIndex ][i] ].clone().applyMatrix4( this.boxMesh.matrixWorld ) - this.hoverPlane.geometry.vertices[i].set( vertex.x - centre.x, vertex.y - centre.y , vertex.z - centre.z ) - } - - this.hoverPlane.geometry.verticesNeedUpdate = true - - let normal = obj[0].face.normal - this.planeControls.showX = normal.x !== 0 - this.planeControls.showY = normal.y !== 0 - this.planeControls.showZ = normal.z !== 0 - - this.planeControls.attach( this.hoverPlane ) - - if ( obj[0].faceIndex !== targetFaceIndex ) { - this.viewer.needsRender = true - targetFaceIndex = obj[0].faceIndex } } ) - // Whole box controls - this._globalControlsTarget = new THREE.Mesh( new THREE.SphereGeometry( 0.0001 ), new THREE.MeshBasicMaterial( ) ) - this._globalControlsTarget.position.copy( this.boxGeo.vertices[ 5 ].clone().multiplyScalar( 1.1 ) ) - this.display.add( this._globalControlsTarget ) + document.addEventListener( 'keydown', ( e ) => { + if( e.key === 'Escape' && this.viewer.mouseOverRenderer ) { + this._attachControlsToBox() + } + } ) - this.controls = new TransformControls( this.viewer.camera, this.viewer.renderer.domElement ) - this.controls.setSize( 0.5 ) - this.controls.attach( this._globalControlsTarget ) + this._attachControlsToBox() + + this.viewer.on( 'projection-change', function() { this._setupControls(); this._attachControlsToBox() }.bind( this ) ) + } + + _setupControls() { + this.controls?.dispose() + this.controls?.detach() + this.controls = new TransformControls( this.viewer.cameraHandler.activeCam.camera, this.viewer.renderer.domElement ) + this.controls.setSize( 0.75 ) this.display.add( this.controls ) - - // Section plane controls - this.planeControls = new TransformControls( this.viewer.camera, this.viewer.renderer.domElement, true ) - this.display.add( this.planeControls ) - - this.prevGizmoPos = this._globalControlsTarget.position.clone() - this.controls.addEventListener( 'change', ( ) => { - this.prevGizmoPos.sub( this._globalControlsTarget.position ) - this.boxMesh.translateX( -this.prevGizmoPos.x ) - this.boxMesh.translateY( -this.prevGizmoPos.y ) - this.boxMesh.translateZ( -this.prevGizmoPos.z ) - - this.prevGizmoPos = this._globalControlsTarget.position.clone() - this.setPlanesFromBox( new THREE.Box3().setFromObject( this.boxMesh ) ) - this.boxHelper.update() - this.viewer.needsRender = true - } ) - + this.controls.addEventListener( 'change', this._draggingChangeHandler.bind( this ) ) this.controls.addEventListener( 'dragging-changed', ( event ) => { - this.viewer.controls.enabled = !event.value - this.viewer.interactions.preventSelection = !event.value - if ( !event.value ) - this.viewer.interactions.zoomToObject( this.boxMesh ) - } ) - - let prevPlaneGizmoPos = null - this.planeControls.addEventListener( 'change', ( ) => { - if ( !this.dragging ) return - if ( targetFaceIndex === -1 ) return - if ( prevPlaneGizmoPos === null ) prevPlaneGizmoPos = this.hoverPlane.position.clone() - prevPlaneGizmoPos.sub( this.hoverPlane.position ) - let plane = this.boxMesh.userData.planes[ targetFaceIndex ] - - prevPlaneGizmoPos.negate() - plane.translate( prevPlaneGizmoPos ) - let indices = this.boxMesh.userData.indices[ targetFaceIndex ] - for ( let i = 0; i < 4; i++ ) { - let index = indices[i] - this.boxGeo.vertices[index].add( prevPlaneGizmoPos ) + let val = !!event.value + if( val ) { + this.dragging = val + this.viewer.interactions.preventSelection = val + this.viewer.cameraHandler.enabled = !val + } else { + setTimeout( ()=> { + this.dragging = val + this.viewer.interactions.preventSelection = val + this.viewer.cameraHandler.enabled = !val + }, 100 ) } - this.boxGeo.verticesNeedUpdate = true - this.boxMesh.geometry.computeBoundingBox() - this.boxMesh.geometry.computeBoundingSphere() - - let gizmoPos = this.boxGeo.vertices[ 5 ].clone() - gizmoPos.multiplyScalar( 1.1 ) - gizmoPos.applyMatrix4( this.boxMesh.matrixWorld ) - this._globalControlsTarget.position.copy( gizmoPos ) - this.prevGizmoPos = gizmoPos - - prevPlaneGizmoPos = this.hoverPlane.position.clone() - this.boxHelper.update() - this.viewer.needsRender = true - } ) - - this.planeControls.addEventListener( 'dragging-changed', ( event ) => { - this.viewer.controls.enabled = !event.value - this.viewer.interactions.preventSelection = !event.value - this.dragging = !!event.value - if ( !this.dragging ) { - prevPlaneGizmoPos = null - this.viewer.interactions.zoomToObject( this.boxMesh ) - targetFaceIndex = -1 - - } - this.viewer.needsRender = true } ) + this.viewer.needsRender = true } - _generatePlanes() { - for ( let i = 0; i < this.boxGeo.faces.length; i += 2 ) { - let face = this.boxGeo.faces[i] - let pairFace = this.boxGeo.faces[i+1] - let plane = new THREE.Plane() - // inverting points so plane - plane.setFromCoplanarPoints( this.boxGeo.vertices[face.c], this.boxGeo.vertices[face.b], this.boxGeo.vertices[face.a] ) - // adding it twice for ease of use - this.boxMesh.userData.planes.push( plane ) - this.boxMesh.userData.planes.push( plane ) - - this.boxMesh.userData.indices.push( [ face.a, face.b, face.c, pairFace.b ] ) - this.boxMesh.userData.indices.push( [ face.a, face.b, face.c, pairFace.b ] ) - - this.planes.push( plane ) - } - } - - setPlanesFromBox( box ) { - const dimensions = new THREE.Vector3().subVectors( box.max, box.min ) - let boxGeo = new THREE.BoxGeometry( dimensions.x, dimensions.y, dimensions.z ) - - const matrix = new THREE.Matrix4().setPosition( dimensions.addVectors( box.min, box.max ).multiplyScalar( 0.5 ) ) - boxGeo.applyMatrix4( matrix ) - - for ( let i = 0; i < this.boxGeo.faces.length; i += 2 ) { - let face = boxGeo.faces[i] - let plane = this.boxMesh.userData.planes[i] - plane.setFromCoplanarPoints( boxGeo.vertices[face.c], boxGeo.vertices[face.b], boxGeo.vertices[face.a] ) // invert pts - } - } - - setBox( box ) { - box = box.clone().expandByScalar( 0.5 ) - const dimensions = new THREE.Vector3().subVectors( box.max, box.min ) - let boxGeo = new THREE.BoxGeometry( dimensions.x, dimensions.y, dimensions.z ) - - const matrix = new THREE.Matrix4().setPosition( dimensions.addVectors( box.min, box.max ).multiplyScalar( 0.5 ) ) - boxGeo.applyMatrix4( matrix ) - - for ( let i = 0; i < this.boxGeo.vertices.length; i++ ) { - this.boxGeo.vertices[i].copy( boxGeo.vertices[i] ) - } - - this._globalControlsTarget.position.copy( this.boxGeo.vertices[ 5 ].clone().multiplyScalar( 1.1 ) ) - this.prevGizmoPos = this._globalControlsTarget.position.clone() - this.boxMesh.position.copy( new THREE.Vector3() ) - this.boxMesh.geometry.verticesNeedUpdate = true - this.boxMesh.geometry.computeBoundingBox() - this.boxMesh.geometry.computeBoundingSphere() + _draggingChangeHandler( ) { + this.boxHelper.update() + this._generateOrUpdatePlanes() + + // Dragging a side / plane + if( this.dragging && this.currentRange ) { + if( this.prevPosition === null ) this.prevPosition = this.hoverPlane.position.clone() + this.prevPosition.sub( this.hoverPlane.position ) + this.prevPosition.negate() + let boxArr = this.boxGeometry.attributes.position.array + for( let i = 0; i < this.currentRange.length; i++ ) { + let index = this.currentRange[i] + boxArr[3 * index] += this.prevPosition.x + boxArr[3 * index + 1] += this.prevPosition.y + boxArr[3 * index + 2] += this.prevPosition.z + } + + this.prevPosition = this.hoverPlane.position.clone() + this.boxGeometry.attributes.position.needsUpdate = true + this.boxGeometry.computeVertexNormals() + this.boxGeometry.computeBoundingBox() + this.boxGeometry.computeBoundingSphere() + } + + // Dragging the whole section box + if( this.dragging && !this.currentRange ) { + if( this.prevPosition === null ) this.prevPosition = this.sphere.position.clone() + this.prevPosition.sub( this.sphere.position ) + this.prevPosition.negate() + + for( let i = 0; i < this.boxGeometry.attributes.position.array.length; i += 3 ) { + this.boxGeometry.attributes.position.array[i] += this.prevPosition.x + this.boxGeometry.attributes.position.array[i + 1] += this.prevPosition.y + this.boxGeometry.attributes.position.array[i + 2] += this.prevPosition.z + } + this.boxGeometry.attributes.position.needsUpdate = true + this.boxGeometry.computeVertexNormals() + this.boxGeometry.computeBoundingBox() + this.boxGeometry.computeBoundingSphere() + + this.prevPosition = this.sphere.position.clone() + } + this.viewer.needsRender = true + } + + _clickHandler( args ) { + if( this.viewer.cameraHandler.orbiting || this.dragging ) return + if( args.length === 0 && !this.dragging ) { + this._attachControlsToBox() + this.boxHelper.material.opacity = 0.5 + this.attachedToBox = true + return + } + this.attachedToBox = false + this.boxHelper.material.opacity = 0.3 + this.hoverPlane.visible = true + let side = this.sidesSimple[`${args[0].face.a}${args[0].face.b}${args[0].face.c}`] + this.controls.showX = side.axis === 'x' + this.controls.showY = side.axis === 'y' + this.controls.showZ = side.axis === 'z' + + this.currentRange = side.verts + + let boxArr = this.boxGeometry.attributes.position + let index = 0 + let planeArr = this.plane.attributes.position.array + let centre = new THREE.Vector3() + + let tempArr = [] + for( let i = 0; i < planeArr.length; i++ ) { + if( i % 3 === 0 ) { + tempArr.push( boxArr.getX( this.currentRange[index] ) ) + } + else if( i % 3 === 1 ) { + tempArr.push( boxArr.getY( this.currentRange[index] ) ) + } + else if( i % 3 === 2 ) { + tempArr.push( boxArr.getZ( this.currentRange[index] ) ) + centre.add( new THREE.Vector3( tempArr[i - 2], tempArr[i - 1], tempArr[i] ) ) + index++ + } + } + + centre.multiplyScalar( 0.25 ) + this.hoverPlane.position.copy( centre.applyMatrix4( this.cube.matrixWorld ) ) + this.prevPosition = this.hoverPlane.position.clone() + index = 0 + for( let i = 0; i < planeArr.length; i++ ) { + if( i % 3 === 0 ) { + planeArr[i] = boxArr.getX( this.currentRange[index] ) - centre.x + } + else if( i % 3 === 1 ) { + planeArr[i] = boxArr.getY( this.currentRange[index] ) - centre.y + } + else if( i % 3 === 2 ) { + planeArr[i] = boxArr.getZ( this.currentRange[index] ) - centre.z + index++ + } + } + + this.plane.applyMatrix4( this.cube.matrixWorld ) + this.plane.attributes.position.needsUpdate = true + this.plane.computeBoundingSphere() + this.plane.computeBoundingBox() + this.controls.detach() + this.controls.attach( this.hoverPlane ) + this.controls.updateMatrixWorld() + } + + _generateSimpleCube( width = 0.5, depth = 0.5, height = 0.5 ) { + const vertices = [ + [ -1 * width, -1 * depth, -1 * height ], + [ 1 * width, -1 * depth, -1 * height ], + [ 1 * width, 1 * depth, -1 * height ], + [ -1 * width, 1 * depth, -1 * height ], + [ -1 * width, -1 * depth, 1 * height ], + [ 1 * width, -1 * depth, 1 * height ], + [ 1 * width, 1 * depth, 1 * height ], + [ -1 * width, 1 * depth, 1 * height ] + ] + + const indexes = [ + 0, 1, 3, 3, 1, 2, + 1, 5, 2, 2, 5, 6, + 5, 4, 6, 6, 4, 7, + 4, 0, 7, 7, 0, 3, + 3, 2, 7, 7, 2, 6, + 4, 5, 0, 0, 5, 1 + ] + + let positions = [] + for( let vert of vertices ) { + positions.push( ...vert ) + } + + let g = new THREE.BufferGeometry() + g.setAttribute( 'position', new THREE.BufferAttribute( new Float32Array( positions ), 3 ) ) + g.setIndex( indexes ) + g.computeVertexNormals() + return g + } + + _generateOrUpdatePlanes() { + this.planes = this.planes || [ new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane() ] + + let index = 0 + let boxArr = this.boxGeometry.attributes.position + const indexes = [ + 0, 1, 3, 3, 1, 2, + 1, 5, 2, 2, 5, 6, + 5, 4, 6, 6, 4, 7, + 4, 0, 7, 7, 0, 3, + 3, 2, 7, 7, 2, 6, + 4, 5, 0, 0, 5, 1 + ] + + for( let i = 0; i < indexes.length; i += 6 ) { + let a = new THREE.Vector3( boxArr.getX( indexes[i] ), boxArr.getY( indexes[i] ), boxArr.getZ( indexes[i] ) ) + let b = new THREE.Vector3( boxArr.getX( indexes[i + 1] ), boxArr.getY( indexes[i + 1] ), boxArr.getZ( indexes[i + 1] ) ) + let c = new THREE.Vector3( boxArr.getX( indexes[i + 2] ), boxArr.getY( indexes[i + 2] ), boxArr.getZ( indexes[i + 2] ) ) + let plane = this.planes[index] + plane.setFromCoplanarPoints( a, b, c ) + index++ + } + } + + _attachControlsToBox() { + this.controls.detach() + + let centre = new THREE.Vector3() + let boxArr = this.boxGeometry.attributes.position.array + for( let i = 0; i < boxArr.length; i += 3 ) { + centre.add( new THREE.Vector3( boxArr[i], boxArr[i + 1], boxArr[i + 2] ) ) + } + centre.multiplyScalar( 1 / 8 ) + this.sphere.position.copy( centre ) + + this.cube.geometry.computeBoundingSphere() + this.cube.geometry.computeBoundingBox() + this.controls.attach( this.sphere ) + this.currentRange = null + this.prevPosition = null + this.hoverPlane.visible = false + this.controls.showX = true + this.controls.showY = true + this.controls.showZ = true + } + + setBox( targetBox, offset = 0.05 ) { + let box + + if( targetBox ) box = targetBox + else { + if( this.viewer.interactions.selectedObjects.children.length !== 0 ) { + box = new THREE.Box3( ).setFromObject( this.viewer.interactions.selectedObjects ) + } else if( this.viewer.sceneManager.sceneObjects.allObjects.children.length !== 0 ) { + box = new THREE.Box3( ).setFromObject( this.viewer.sceneManager.sceneObjects.allObjects ) + } else { + box = new Box3( new THREE.Vector3( -1, -1, -1 ), new THREE.Vector3( 1, 1, 1 ) ) + } + } + + if( box.min.x === Infinity ) { + box = new Box3( new THREE.Vector3( -1, -1, -1 ), new THREE.Vector3( 1, 1, 1 ) ) + } + + const x1 = box.min.x - ( box.max.x - box.min.x ) * offset + const y1 = box.min.y - ( box.max.y - box.min.y ) * offset + const z1 = box.min.z - ( box.max.z - box.min.z ) * offset + const x2 = box.max.x + ( box.max.x - box.min.x ) * offset + const y2 = box.max.y + ( box.max.y - box.min.y ) * offset + const z2 = box.max.z + ( box.max.z - box.min.z ) * offset + + const newVertices = [ + x1, y1, z1, + x2, y1, z1, + x2, y2, z1, + x1, y2, z1, + x1, y1, z2, + x2, y1, z2, + x2, y2, z2, + x1, y2, z2 + ] + + let boxVerts = this.boxGeometry.attributes.position.array + for( let i = 0; i < newVertices.length; i++ ) { + boxVerts[i] = newVertices[i] + } + + this.boxGeometry.attributes.position.needsUpdate = true + this.boxGeometry.computeVertexNormals() + this.boxGeometry.computeBoundingBox() + this.boxGeometry.computeBoundingSphere() + this._generateOrUpdatePlanes() + this._attachControlsToBox() this.boxHelper.update() - this.setPlanesFromBox( box ) this.viewer.needsRender = true } toggle() { - if ( this.display.visible ) { - this.viewer.renderer.localClippingEnabled = false - this.display.visible = false - this.viewer.emit( 'section-box', false ) - } else { - this.viewer.renderer.localClippingEnabled = true - this.display.visible = true - this.viewer.emit( 'section-box', true ) - } + this.setBox() + this.display.visible = !this.display.visible + this.viewer.renderer.localClippingEnabled = this.display.visible + this.viewer.needsRender = true } - dispose() { - this.selectionHelper.dispose() - this.controls.dispose() - this.planeControls.dispose() - this.display.clear() + off() { + this.display.visible = false + this.viewer.renderer.localClippingEnabled = false + this.viewer.needsRender = true } + + on() { + this.display.visible = true + this.viewer.renderer.localClippingEnabled = true + this.viewer.needsRender = true + } + } diff --git a/packages/viewer/src/modules/SectionBoxNew.js b/packages/viewer/src/modules/SectionBoxNew.js deleted file mode 100644 index caad8aac6..000000000 --- a/packages/viewer/src/modules/SectionBoxNew.js +++ /dev/null @@ -1,353 +0,0 @@ -import * as THREE from 'three' -import SelectionHelper from './SelectionHelper' -import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js' -import { Box3 } from 'three' - -export default class SectionBox { - - constructor( viewer, bbox ) { - this.viewer = viewer - - this.viewer.renderer.localClippingEnabled = true - - this.dragging = false - this.display = new THREE.Group() - this.viewer.scene.add( this.display ) - - // box - this.boxGeometry = this._generateSimpleCube( 5, 5, 5 ) - this.material = new THREE.MeshStandardMaterial( { color: 0x00ffff, opacity:0, wireframe: false, side: THREE.DoubleSide } ) - this.cube = new THREE.Mesh( this.boxGeometry, this.material ) - this.cube.visible = false - - this.display.add( this.cube ) - - this.boxHelper = new THREE.BoxHelper( this.cube, 0x0A66FF ) - this.boxHelper.material.opacity = 0.4 - this.display.add( this.boxHelper ) - - // we're attaching the gizmo mover to this sphere in the box centre - let sphere = new THREE.SphereGeometry( 0.01, 10, 10 ) - this.sphere = new THREE.Mesh( sphere, new THREE.MeshStandardMaterial( { color:0x00ffff } ) ) - this.display.add( this.sphere ) - - // plane - this.plane = new THREE.PlaneGeometry( 1, 1 ) - this.hoverPlane = new THREE.Mesh( this.plane, new THREE.MeshStandardMaterial( { transparent: true, side: THREE.DoubleSide, opacity: 0.1, wireframe: false, color: 0x0A66FF, metalness: 0.1, roughness: 0.75 } ) ) - this.hoverPlane.visible = false - this.display.add( this.hoverPlane ) - - this.dragging = false - this._setupControls() - - this.sidesSimple = { - '256': { verts: [ 1, 2, 5, 6 ], axis:'x' }, - '152': { verts: [ 1, 2, 5, 6 ], axis:'x' }, - '407': { verts: [ 0, 3, 4, 7 ], axis:'x' }, - '703': { verts: [ 0, 3, 4, 7 ], axis:'x' }, - '327': { verts: [ 2, 3, 6, 7 ], axis:'y' }, - '726': { verts: [ 2, 3, 6, 7 ], axis:'y' }, - '450': { verts: [ 0, 1, 4, 5 ], axis:'y' }, - '051': { verts: [ 0, 1, 4, 5 ], axis:'y' }, - '312': { verts: [ 0, 1, 3, 2 ], axis:'z' }, - '013': { verts: [ 0, 1, 3, 2 ], axis:'z' }, - '546': { verts: [ 4, 5, 7, 6 ], axis:'z' }, - '647': { verts: [ 4, 5, 7, 6 ], axis:'z' } - } - - this._generateOrUpdatePlanes() - - this.currentRange = null - this.prevPosition = null - - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) - this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) - this._attachControlsToBox() - - this.viewer.on('projection-change', function() { this._setupControls(); this._attachControlsToBox(); }.bind(this) ) - } - - _setupControls() { - this.controls?.dispose() - this.controls?.detach() - this.controls = new TransformControls( this.viewer.cameraHandler.activeCam.camera, this.viewer.renderer.domElement ) - this.controls.setSize( 0.75 ) - this.display.add( this.controls ) - this.controls.addEventListener( 'change', this._draggingChangeHandler.bind( this ) ) - this.controls.addEventListener( 'dragging-changed', ( event ) => { - let val = !!event.value - if( val ) { - this.dragging = val - this.viewer.interactions.preventSelection = val - this.viewer.cameraHandler.enabled = !val - } else { - setTimeout( ()=> { - this.dragging = val - this.viewer.interactions.preventSelection = val - this.viewer.cameraHandler.enabled = !val - }, 100 ) - - } - } ) - this.viewer.needsRender = true - } - - _draggingChangeHandler( ) { - this.boxHelper.update() - this._generateOrUpdatePlanes() - - // Dragging a side / plane - if( this.dragging && this.currentRange ) { - if( this.prevPosition === null ) this.prevPosition = this.hoverPlane.position.clone() - this.prevPosition.sub( this.hoverPlane.position ) - this.prevPosition.negate() - let boxArr = this.boxGeometry.attributes.position.array - for( let i = 0; i < this.currentRange.length; i++ ) { - let index = this.currentRange[i] - boxArr[3 * index] += this.prevPosition.x - boxArr[3 * index + 1] += this.prevPosition.y - boxArr[3 * index + 2] += this.prevPosition.z - } - - this.prevPosition = this.hoverPlane.position.clone() - this.boxGeometry.attributes.position.needsUpdate = true - this.boxGeometry.computeVertexNormals() - this.boxGeometry.computeBoundingBox() - this.boxGeometry.computeBoundingSphere() - } - - // Dragging the whole section box - if( this.dragging && !this.currentRange ) { - if( this.prevPosition === null ) this.prevPosition = this.sphere.position.clone() - this.prevPosition.sub( this.sphere.position ) - this.prevPosition.negate() - - for( let i = 0; i < this.boxGeometry.attributes.position.array.length; i += 3 ) { - this.boxGeometry.attributes.position.array[i] += this.prevPosition.x - this.boxGeometry.attributes.position.array[i + 1] += this.prevPosition.y - this.boxGeometry.attributes.position.array[i + 2] += this.prevPosition.z - } - this.boxGeometry.attributes.position.needsUpdate = true - this.boxGeometry.computeVertexNormals() - this.boxGeometry.computeBoundingBox() - this.boxGeometry.computeBoundingSphere() - - this.prevPosition = this.sphere.position.clone() - } - this.viewer.needsRender = true - } - - _clickHandler( args ) { - if( this.viewer.cameraHandler.orbiting || this.dragging ) return - if( args.length === 0 && !this.dragging ) { - this._attachControlsToBox() - this.boxHelper.material.opacity = 0.5 - return - } - - this.boxHelper.material.opacity = 0.3 - this.hoverPlane.visible = true - let side = this.sidesSimple[`${args[0].face.a}${args[0].face.b}${args[0].face.c}`] - this.controls.showX = side.axis === 'x' - this.controls.showY = side.axis === 'y' - this.controls.showZ = side.axis === 'z' - - this.currentRange = side.verts - - let boxArr = this.boxGeometry.attributes.position - let index = 0 - let planeArr = this.plane.attributes.position.array - let centre = new THREE.Vector3() - - let tempArr = [] - for( let i = 0; i < planeArr.length; i++ ) { - if( i % 3 === 0 ) { - tempArr.push( boxArr.getX( this.currentRange[index] ) ) - } - else if( i % 3 === 1 ) { - tempArr.push( boxArr.getY( this.currentRange[index] ) ) - } - else if( i % 3 === 2 ) { - tempArr.push( boxArr.getZ( this.currentRange[index] ) ) - centre.add( new THREE.Vector3( tempArr[i - 2], tempArr[i - 1], tempArr[i] ) ) - index++ - } - } - - centre.multiplyScalar( 0.25 ) - this.hoverPlane.position.copy( centre.applyMatrix4( this.cube.matrixWorld ) ) - this.prevPosition = this.hoverPlane.position.clone() - index = 0 - for( let i = 0; i < planeArr.length; i++ ) { - if( i % 3 === 0 ) { - planeArr[i] = boxArr.getX( this.currentRange[index] ) - centre.x - } - else if( i % 3 === 1 ) { - planeArr[i] = boxArr.getY( this.currentRange[index] ) - centre.y - } - else if( i % 3 === 2 ) { - planeArr[i] = boxArr.getZ( this.currentRange[index] ) - centre.z - index++ - } - } - - this.plane.applyMatrix4( this.cube.matrixWorld ) - this.plane.attributes.position.needsUpdate = true - this.plane.computeBoundingSphere() - this.plane.computeBoundingBox() - this.controls.detach() - this.controls.attach( this.hoverPlane ) - this.controls.updateMatrixWorld() - } - - _generateSimpleCube( width = 0.5, depth = 0.5, height = 0.5 ) { - const vertices = [ - [ -1 * width, -1 * depth, -1 * height ], - [ 1 * width, -1 * depth, -1 * height ], - [ 1 * width, 1 * depth, -1 * height ], - [ -1 * width, 1 * depth, -1 * height ], - [ -1 * width, -1 * depth, 1 * height ], - [ 1 * width, -1 * depth, 1 * height ], - [ 1 * width, 1 * depth, 1 * height ], - [ -1 * width, 1 * depth, 1 * height ] - ] - - const indexes = [ - 0, 1, 3, 3, 1, 2, - 1, 5, 2, 2, 5, 6, - 5, 4, 6, 6, 4, 7, - 4, 0, 7, 7, 0, 3, - 3, 2, 7, 7, 2, 6, - 4, 5, 0, 0, 5, 1 - ] - - let positions = [] - for( let vert of vertices ) { - positions.push( ...vert ) - } - - let g = new THREE.BufferGeometry() - g.setAttribute( 'position', new THREE.BufferAttribute( new Float32Array( positions ), 3 ) ) - g.setIndex( indexes ) - g.computeVertexNormals() - return g - } - - _generateOrUpdatePlanes() { - this.planes = this.planes || [ new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane(), new THREE.Plane() ] - - let index = 0 - let boxArr = this.boxGeometry.attributes.position - const indexes = [ - 0, 1, 3, 3, 1, 2, - 1, 5, 2, 2, 5, 6, - 5, 4, 6, 6, 4, 7, - 4, 0, 7, 7, 0, 3, - 3, 2, 7, 7, 2, 6, - 4, 5, 0, 0, 5, 1 - ] - - for( let i = 0; i < indexes.length; i += 6 ) { - let a = new THREE.Vector3( boxArr.getX( indexes[i] ), boxArr.getY( indexes[i] ), boxArr.getZ( indexes[i] ) ) - let b = new THREE.Vector3( boxArr.getX( indexes[i + 1] ), boxArr.getY( indexes[i + 1] ), boxArr.getZ( indexes[i + 1] ) ) - let c = new THREE.Vector3( boxArr.getX( indexes[i + 2] ), boxArr.getY( indexes[i + 2] ), boxArr.getZ( indexes[i + 2] ) ) - let plane = this.planes[index] - plane.setFromCoplanarPoints( a, b, c ) - index++ - } - } - - _attachControlsToBox() { - this.controls.detach() - - let centre = new THREE.Vector3() - let boxArr = this.boxGeometry.attributes.position.array - for( let i = 0; i < boxArr.length; i += 3 ) { - centre.add( new THREE.Vector3( boxArr[i], boxArr[i + 1], boxArr[i + 2] ) ) - } - centre.multiplyScalar( 1 / 8 ) - this.sphere.position.copy( centre ) - - this.cube.geometry.computeBoundingSphere() - this.cube.geometry.computeBoundingBox() - this.controls.attach( this.sphere ) - this.currentRange = null - this.prevPosition = null - this.hoverPlane.visible = false - this.controls.showX = true - this.controls.showY = true - this.controls.showZ = true - } - - setBox( ) { - let box = null - console.log(this.viewer.interactions.selectedObjects.children.length ) - console.log(this.viewer.sceneManager.sceneObjects.allObjects.children.length ) - if( this.viewer.interactions.selectedObjects.children.length !== 0 ) { - box = new THREE.Box3( ).setFromObject(this.viewer.interactions.selectedObjects) - } else if( this.viewer.sceneManager.sceneObjects.allObjects.children.length !== 0 ){ - box = new THREE.Box3( ).setFromObject(this.viewer.sceneManager.sceneObjects.allObjects) - } else { - box = new Box3( new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, 1, 1)) - } - if(box.min.x === Infinity) { - box = new Box3( new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, 1, 1)) - } - const dist = box.min.distanceTo(box.max) - - const x1 = box.min.x - (box.max.x-box.min.x) * 0.05 // - dist * 0.05 - const y1 = box.min.y - (box.max.y-box.min.y) * 0.05 // - dist * 0.05 - const z1 = box.min.z - (box.max.z-box.min.z) * 0.05 // - dist * 0.05 - const x2 = box.max.x + (box.max.x-box.min.x) * 0.05 // + dist * 0.05 - const y2 = box.max.y + (box.max.y-box.min.y) * 0.05 // + dist * 0.05 - const z2 = box.max.z + (box.max.z-box.min.z) * 0.05 // + dist * 0.05 - - const newVertices = [ - x1, y1, z1, - x2, y1, z1, - x2, y2, z1, - x1, y2, z1, - x1, y1, z2, - x2, y1, z2, - x2, y2, z2, - x1, y2, z2, - ] - - let boxVerts = this.boxGeometry.attributes.position.array - for(let i = 0; i < newVertices.length; i++) { - boxVerts[i] = newVertices[i] - } - - this.boxGeometry.attributes.position.needsUpdate = true - this.boxGeometry.computeVertexNormals() - this.boxGeometry.computeBoundingBox() - this.boxGeometry.computeBoundingSphere() - this._generateOrUpdatePlanes() - this._attachControlsToBox() - this.boxHelper.update() - this.viewer.needsRender = true - } - - toggle() { - this.setBox() - this.display.visible = !this.display.visible - this.viewer.renderer.localClippingEnabled = this.display.visible - this.viewer.needsRender = true - } - - off() { - this.display.visible = false - this.viewer.renderer.localClippingEnabled = false - this.viewer.needsRender = true - } - - on() { - this.display.visible = true - this.viewer.renderer.localClippingEnabled = true - this.viewer.needsRender = true - } - - dispose() { - - } -} diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index e1cef933b..795c5527b 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -1,18 +1,14 @@ import * as THREE from 'three' -import CameraControls from 'camera-controls' -import { HOLD_EVENT_TYPE, ElementHold, KeyboardKeyHold } from 'hold-event' -import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js' -import { SSAOPass } from 'three/examples/jsm/postprocessing/SSAOPass.js' import Stats from 'three/examples/jsm/libs/stats.module.js' import ObjectManager from './SceneObjectManager' import ViewerObjectLoader from './ViewerObjectLoader' import EventEmitter from './EventEmitter' import InteractionHandler from './InteractionHandler' -import CameraHandler from './context/cameras' +import CameraHandler from './context/CameraHanlder' -import SectionBox from './SectionBoxNew' +import SectionBox from './SectionBox' export default class Viewer extends EventEmitter { @@ -64,6 +60,7 @@ export default class Viewer extends EventEmitter { this.sceneLights() this.animate() this.onWindowResize() + this.interactions.zoomExtents() this.needsRender = true } diff --git a/packages/viewer/src/modules/context/cameras.js b/packages/viewer/src/modules/context/CameraHanlder.js similarity index 66% rename from packages/viewer/src/modules/context/cameras.js rename to packages/viewer/src/modules/context/CameraHanlder.js index 06bcc1a65..18790422e 100644 --- a/packages/viewer/src/modules/context/cameras.js +++ b/packages/viewer/src/modules/context/CameraHanlder.js @@ -1,9 +1,9 @@ import * as THREE from 'three' import CameraControls from 'camera-controls' -import { HOLD_EVENT_TYPE, ElementHold, KeyboardKeyHold } from 'hold-event' +import { KeyboardKeyHold } from 'hold-event' export default class CameraHandler { - constructor(viewer) { + constructor( viewer ) { this.viewer = viewer this.camera = new THREE.PerspectiveCamera( 55, window.innerWidth / window.innerHeight ) @@ -13,7 +13,7 @@ export default class CameraHandler { let aspect = this.viewer.container.offsetWidth / this.viewer.container.offsetHeight let fustrumSize = 50 - this.orthoCamera = new THREE.OrthographicCamera( (-fustrumSize * aspect ) / 2, (fustrumSize * aspect ) / 2, fustrumSize / 2, -fustrumSize/ 2, 0.001, 1000) + this.orthoCamera = new THREE.OrthographicCamera( ( -fustrumSize * aspect ) / 2, ( fustrumSize * aspect ) / 2, fustrumSize / 2, -fustrumSize / 2, 0.001, 10000 ) this.orthoCamera.up.set( 0, 0, 1 ) this.orthoCamera.position.set( 100, 100, 100 ) this.orthoCamera.updateProjectionMatrix() @@ -39,20 +39,10 @@ export default class CameraHandler { ] this.orbiting = false - this.controls.addEventListener('wake', () => { - // console.log( 'orbiting') - this.orbiting = true - } ) - - this.controls.addEventListener('controlend', () => { - // console.log( 'controlend') - // this.orbiting = false - } ) - - this.controls.addEventListener('rest', () => { - // console.log( 'rest') - setTimeout( () => { this.orbiting = false }, 400 ) - } ) + this.controls.addEventListener( 'wake', () => { this.orbiting = true } ) + // note: moved to new controls event called "rest" + this.controls.addEventListener( 'controlend', () => { } ) + this.controls.addEventListener( 'rest', () => { setTimeout( () => { this.orbiting = false }, 400 ) } ) window.addEventListener( 'resize', this.onWindowResize.bind( this ), false ) this.onWindowResize() @@ -64,17 +54,17 @@ export default class CameraHandler { set activeCam( val ) { if( val === 'perspective' ) - return this.setPerspectiveCameraOn() + this.setPerspectiveCameraOn() if( val === 'ortho' ) - return this.setOrthoCameraOn() + this.setOrthoCameraOn() } set enabled( val ) { this.controls.enabled = val } - setPerspectiveCameraOn(){ - if(this.cameras[0].active) return + setPerspectiveCameraOn() { + if( this.cameras[0].active ) return this.cameras[0].active = true this.cameras[1].active = false @@ -82,8 +72,8 @@ export default class CameraHandler { this.viewer.needsRender = true } - setOrthoCameraOn(){ - if(this.cameras[1].active) return + setOrthoCameraOn() { + if( this.cameras[1].active ) return this.cameras[0].active = false this.cameras[1].active = true @@ -91,8 +81,8 @@ export default class CameraHandler { this.viewer.needsRender = true } - toggleCameras(){ - if(this.cameras[0].active) this.setOrthoCameraOn() + toggleCameras() { + if( this.cameras[0].active ) this.setOrthoCameraOn() else this.setPerspectiveCameraOn() } @@ -101,15 +91,15 @@ export default class CameraHandler { this.controls.mouseButtons.wheel = CameraControls.ACTION.ZOOM const lineOfSight = new THREE.Vector3() - this.camera.getWorldDirection(lineOfSight) + this.camera.getWorldDirection( lineOfSight ) const target = new THREE.Vector3() - this.controls.getTarget(target) - const distance = target.clone().sub(this.camera.position) - const depth = distance.dot(lineOfSight) + this.controls.getTarget( target ) + const distance = target.clone().sub( this.camera.position ) + const depth = distance.dot( lineOfSight ) const dims = { x: this.viewer.container.offsetWidth, y: this.viewer.container.offsetHeight } const aspect = dims.x / dims.y const fov = this.camera.fov - const height = depth * 2 * Math.atan((fov * (Math.PI / 180)) / 2) + const height = depth * 2 * Math.atan( ( fov * ( Math.PI / 180 ) ) / 2 ) const width = height * aspect this.orthoCamera.zoom = 1 @@ -119,21 +109,21 @@ export default class CameraHandler { this.orthoCamera.bottom = height / -2 this.orthoCamera.far = this.camera.far this.orthoCamera.updateProjectionMatrix() - this.orthoCamera.position.copy(this.camera.position) - this.orthoCamera.quaternion.copy(this.camera.quaternion) + this.orthoCamera.position.copy( this.camera.position ) + this.orthoCamera.quaternion.copy( this.camera.quaternion ) this.controls.camera = this.orthoCamera - this.viewer.emit('projection-change', 'ortho' ) + this.viewer.emit( 'projection-change', 'ortho' ) } setupPerspectiveCamera() { this.controls.mouseButtons.wheel = CameraControls.ACTION.DOLLY - this.camera.position.copy(this.orthoCamera.position) - this.camera.quaternion.copy(this.orthoCamera.quaternion) + this.camera.position.copy( this.orthoCamera.position ) + this.camera.quaternion.copy( this.orthoCamera.quaternion ) this.camera.updateProjectionMatrix() this.controls.distance = this.previousDistance this.controls.camera = this.camera - this.controls.zoomTo(1) - this.viewer.emit('projection-change', 'perspective' ) + this.controls.zoomTo( 1 ) + this.viewer.emit( 'projection-change', 'perspective' ) } setupWASDControls() { @@ -143,10 +133,10 @@ export default class CameraHandler { const aKey = new KeyboardKeyHold( KEYCODE.A, 16.666 ) const sKey = new KeyboardKeyHold( KEYCODE.S, 16.666 ) const dKey = new KeyboardKeyHold( KEYCODE.D, 16.666 ) - aKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.truck( -0.01 * event.deltaTime, 0, false ); return; }.bind( this ) ) - dKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.truck( 0.01 * event.deltaTime, 0, false ); return;}.bind( this ) ) - wKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.forward( 0.01 * event.deltaTime, false ); return; }.bind( this ) ) - sKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.forward( -0.01 * event.deltaTime, false ); return; }.bind( this ) ) + aKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.truck( -0.01 * event.deltaTime, 0, false ); return }.bind( this ) ) + dKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.truck( 0.01 * event.deltaTime, 0, false ); return}.bind( this ) ) + wKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.forward( 0.01 * event.deltaTime, false ); return }.bind( this ) ) + sKey.addEventListener( 'holding', function( event ) { if( this.viewer.mouseOverRenderer === false ) return; this.controls.forward( -0.01 * event.deltaTime, false ); return }.bind( this ) ) } onWindowResize() { @@ -155,10 +145,10 @@ export default class CameraHandler { let aspect = this.viewer.container.offsetWidth / this.viewer.container.offsetHeight let fustrumSize = 50 - this.orthoCamera.left = (-fustrumSize * aspect ) / 2 - this.orthoCamera.right = (fustrumSize * aspect ) / 2 + this.orthoCamera.left = ( -fustrumSize * aspect ) / 2 + this.orthoCamera.right = ( fustrumSize * aspect ) / 2 this.orthoCamera.top = fustrumSize / 2 - this.orthoCamera.bottom = -fustrumSize/2 + this.orthoCamera.bottom = -fustrumSize / 2 this.orthoCamera.updateProjectionMatrix() } } \ No newline at end of file diff --git a/packages/viewer/src/modules/external/TransformControls.js b/packages/viewer/src/modules/external/TransformControls.js deleted file mode 100644 index 2955e291f..000000000 --- a/packages/viewer/src/modules/external/TransformControls.js +++ /dev/null @@ -1,1709 +0,0 @@ -/* eslint-disable */ -// src: https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/TransformControls.js -// Note: customisations: -// - cosmetic blues for materials -// - added "hover" event -// - added "translationDotsOnly" prop for box face manipulation - -import { - BoxGeometry, - BufferGeometry, - Color, - CylinderGeometry, - DoubleSide, - Euler, - Float32BufferAttribute, - Line, - LineBasicMaterial, - Matrix4, - Mesh, - MeshBasicMaterial, - Object3D, - OctahedronGeometry, - PlaneGeometry, - Quaternion, - Raycaster, - SphereGeometry, - TorusGeometry, - Vector3 -} from 'three'; - -var TransformControls = function ( camera, domElement, translationDotsOnly ) { - - if ( domElement === undefined ) { - - console.warn( 'THREE.TransformControls: The second parameter "domElement" is now mandatory.' ); - domElement = document; - - } - - Object3D.call( this ); - - this.visible = false; - this.domElement = domElement; - - var _gizmo = new TransformControlsGizmo( translationDotsOnly ); - this.add( _gizmo ); - - var _plane = new TransformControlsPlane(); - this.add( _plane ); - - var scope = this; - - // Define properties with getters/setter - // Setting the defined property will automatically trigger change event - // Defined properties are passed down to gizmo and plane - - defineProperty( 'camera', camera ); - defineProperty( 'object', undefined ); - defineProperty( 'enabled', true ); - defineProperty( 'axis', null ); - defineProperty( 'mode', 'translate' ); - defineProperty( 'translationSnap', null ); - defineProperty( 'rotationSnap', null ); - defineProperty( 'scaleSnap', null ); - defineProperty( 'space', 'world' ); - defineProperty( 'size', 1 ); - defineProperty( 'dragging', false ); - defineProperty( 'showX', true ); - defineProperty( 'showY', true ); - defineProperty( 'showZ', true ); - - var changeEvent = { type: 'change' }; - var mouseDownEvent = { type: 'mouseDown' }; - var mouseUpEvent = { type: 'mouseUp', mode: scope.mode }; - var objectChangeEvent = { type: 'objectChange' }; - - // Reusable utility variables - - var raycaster = new Raycaster(); - - function intersectObjectWithRay( object, raycaster, includeInvisible ) { - - var allIntersections = raycaster.intersectObject( object, true ); - - for ( var i = 0; i < allIntersections.length; i ++ ) { - - if ( allIntersections[ i ].object.visible || includeInvisible ) { - - return allIntersections[ i ]; - - } - - } - - return false; - - } - - var _tempVector = new Vector3(); - var _tempVector2 = new Vector3(); - var _tempQuaternion = new Quaternion(); - var _unit = { - X: new Vector3( 1, 0, 0 ), - Y: new Vector3( 0, 1, 0 ), - Z: new Vector3( 0, 0, 1 ) - }; - - var pointStart = new Vector3(); - var pointEnd = new Vector3(); - var offset = new Vector3(); - var rotationAxis = new Vector3(); - var startNorm = new Vector3(); - var endNorm = new Vector3(); - var rotationAngle = 0; - - var cameraPosition = new Vector3(); - var cameraQuaternion = new Quaternion(); - var cameraScale = new Vector3(); - - var parentPosition = new Vector3(); - var parentQuaternion = new Quaternion(); - var parentQuaternionInv = new Quaternion(); - var parentScale = new Vector3(); - - var worldPositionStart = new Vector3(); - var worldQuaternionStart = new Quaternion(); - var worldScaleStart = new Vector3(); - - var worldPosition = new Vector3(); - var worldQuaternion = new Quaternion(); - var worldQuaternionInv = new Quaternion(); - var worldScale = new Vector3(); - - var eye = new Vector3(); - - var positionStart = new Vector3(); - var quaternionStart = new Quaternion(); - var scaleStart = new Vector3(); - - // TODO: remove properties unused in plane and gizmo - - defineProperty( 'worldPosition', worldPosition ); - defineProperty( 'worldPositionStart', worldPositionStart ); - defineProperty( 'worldQuaternion', worldQuaternion ); - defineProperty( 'worldQuaternionStart', worldQuaternionStart ); - defineProperty( 'cameraPosition', cameraPosition ); - defineProperty( 'cameraQuaternion', cameraQuaternion ); - defineProperty( 'pointStart', pointStart ); - defineProperty( 'pointEnd', pointEnd ); - defineProperty( 'rotationAxis', rotationAxis ); - defineProperty( 'rotationAngle', rotationAngle ); - defineProperty( 'eye', eye ); - - { - - domElement.addEventListener( 'pointerdown', onPointerDown ); - domElement.addEventListener( 'pointermove', onPointerHover ); - scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp ); - - } - - this.dispose = function () { - - domElement.removeEventListener( 'pointerdown', onPointerDown ); - domElement.removeEventListener( 'pointermove', onPointerHover ); - scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove ); - scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp ); - - this.traverse( function ( child ) { - - if ( child.geometry ) child.geometry.dispose(); - if ( child.material ) child.material.dispose(); - - } ); - - }; - - // Set current object - this.attach = function ( object ) { - - this.object = object; - this.visible = true; - - return this; - - }; - - // Detach from object - this.detach = function () { - - this.object = undefined; - this.visible = false; - this.axis = null; - - return this; - - }; - - // Defined getter, setter and store for a property - function defineProperty( propName, defaultValue ) { - - var propValue = defaultValue; - - Object.defineProperty( scope, propName, { - - get: function () { - - return propValue !== undefined ? propValue : defaultValue; - - }, - - set: function ( value ) { - - if ( propValue !== value ) { - - propValue = value; - _plane[ propName ] = value; - _gizmo[ propName ] = value; - - scope.dispatchEvent( { type: propName + '-changed', value: value } ); - scope.dispatchEvent( changeEvent ); - - } - - } - - } ); - - scope[ propName ] = defaultValue; - _plane[ propName ] = defaultValue; - _gizmo[ propName ] = defaultValue; - - } - - // updateMatrixWorld updates key transformation variables - this.updateMatrixWorld = function () { - - if ( this.object !== undefined ) { - - this.object.updateMatrixWorld(); - - if ( this.object.parent === null ) { - - console.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' ); - - } else { - - this.object.parent.matrixWorld.decompose( parentPosition, parentQuaternion, parentScale ); - - } - - this.object.matrixWorld.decompose( worldPosition, worldQuaternion, worldScale ); - - parentQuaternionInv.copy( parentQuaternion ).invert(); - worldQuaternionInv.copy( worldQuaternion ).invert(); - - } - - this.camera.updateMatrixWorld(); - this.camera.matrixWorld.decompose( cameraPosition, cameraQuaternion, cameraScale ); - - eye.copy( cameraPosition ).sub( worldPosition ).normalize(); - - Object3D.prototype.updateMatrixWorld.call( this ); - - }; - - this.pointerHover = function ( pointer ) { - - if ( this.object === undefined || this.dragging === true ) return; - - raycaster.setFromCamera( pointer, this.camera ); - - var intersect = intersectObjectWithRay( _gizmo.picker[ this.mode ], raycaster ); - - if ( intersect ) { - - this.axis = intersect.object.name; - - this.dispatchEvent( { type: 'hover', value: true } ); - - } else { - - this.axis = null; - - this.dispatchEvent( { type: 'hover', value: false } ); - } - - }; - - this.pointerDown = function ( pointer ) { - - if ( this.object === undefined || this.dragging === true || pointer.button !== 0 ) return; - - if ( this.axis !== null ) { - - raycaster.setFromCamera( pointer, this.camera ); - - var planeIntersect = intersectObjectWithRay( _plane, raycaster, true ); - - if ( planeIntersect ) { - - var space = this.space; - - if ( this.mode === 'scale' ) { - - space = 'local'; - - } else if ( this.axis === 'E' || this.axis === 'XYZE' || this.axis === 'XYZ' ) { - - space = 'world'; - - } - - if ( space === 'local' && this.mode === 'rotate' ) { - - var snap = this.rotationSnap; - - if ( this.axis === 'X' && snap ) this.object.rotation.x = Math.round( this.object.rotation.x / snap ) * snap; - if ( this.axis === 'Y' && snap ) this.object.rotation.y = Math.round( this.object.rotation.y / snap ) * snap; - if ( this.axis === 'Z' && snap ) this.object.rotation.z = Math.round( this.object.rotation.z / snap ) * snap; - - } - - this.object.updateMatrixWorld(); - this.object.parent.updateMatrixWorld(); - - positionStart.copy( this.object.position ); - quaternionStart.copy( this.object.quaternion ); - scaleStart.copy( this.object.scale ); - - this.object.matrixWorld.decompose( worldPositionStart, worldQuaternionStart, worldScaleStart ); - - pointStart.copy( planeIntersect.point ).sub( worldPositionStart ); - - } - - this.dragging = true; - mouseDownEvent.mode = this.mode; - this.dispatchEvent( mouseDownEvent ); - - } - - }; - - this.pointerMove = function ( pointer ) { - - var axis = this.axis; - var mode = this.mode; - var object = this.object; - var space = this.space; - - if ( mode === 'scale' ) { - - space = 'local'; - - } else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) { - - space = 'world'; - - } - - if ( object === undefined || axis === null || this.dragging === false || pointer.button !== - 1 ) return; - - raycaster.setFromCamera( pointer, this.camera ); - - var planeIntersect = intersectObjectWithRay( _plane, raycaster, true ); - - if ( ! planeIntersect ) return; - - pointEnd.copy( planeIntersect.point ).sub( worldPositionStart ); - - if ( mode === 'translate' ) { - - // Apply translate - - offset.copy( pointEnd ).sub( pointStart ); - - if ( space === 'local' && axis !== 'XYZ' ) { - - offset.applyQuaternion( worldQuaternionInv ); - - } - - if ( axis.indexOf( 'X' ) === - 1 ) offset.x = 0; - if ( axis.indexOf( 'Y' ) === - 1 ) offset.y = 0; - if ( axis.indexOf( 'Z' ) === - 1 ) offset.z = 0; - - if ( space === 'local' && axis !== 'XYZ' ) { - - offset.applyQuaternion( quaternionStart ).divide( parentScale ); - - } else { - - offset.applyQuaternion( parentQuaternionInv ).divide( parentScale ); - - } - - object.position.copy( offset ).add( positionStart ); - - // Apply translation snap - - if ( this.translationSnap ) { - - if ( space === 'local' ) { - - object.position.applyQuaternion( _tempQuaternion.copy( quaternionStart ).invert() ); - - if ( axis.search( 'X' ) !== - 1 ) { - - object.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap; - - } - - if ( axis.search( 'Y' ) !== - 1 ) { - - object.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap; - - } - - if ( axis.search( 'Z' ) !== - 1 ) { - - object.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap; - - } - - object.position.applyQuaternion( quaternionStart ); - - } - - if ( space === 'world' ) { - - if ( object.parent ) { - - object.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) ); - - } - - if ( axis.search( 'X' ) !== - 1 ) { - - object.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap; - - } - - if ( axis.search( 'Y' ) !== - 1 ) { - - object.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap; - - } - - if ( axis.search( 'Z' ) !== - 1 ) { - - object.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap; - - } - - if ( object.parent ) { - - object.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) ); - - } - - } - - } - - } else if ( mode === 'scale' ) { - - if ( axis.search( 'XYZ' ) !== - 1 ) { - - var d = pointEnd.length() / pointStart.length(); - - if ( pointEnd.dot( pointStart ) < 0 ) d *= - 1; - - _tempVector2.set( d, d, d ); - - } else { - - _tempVector.copy( pointStart ); - _tempVector2.copy( pointEnd ); - - _tempVector.applyQuaternion( worldQuaternionInv ); - _tempVector2.applyQuaternion( worldQuaternionInv ); - - _tempVector2.divide( _tempVector ); - - if ( axis.search( 'X' ) === - 1 ) { - - _tempVector2.x = 1; - - } - - if ( axis.search( 'Y' ) === - 1 ) { - - _tempVector2.y = 1; - - } - - if ( axis.search( 'Z' ) === - 1 ) { - - _tempVector2.z = 1; - - } - - } - - // Apply scale - - object.scale.copy( scaleStart ).multiply( _tempVector2 ); - - if ( this.scaleSnap ) { - - if ( axis.search( 'X' ) !== - 1 ) { - - object.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap; - - } - - if ( axis.search( 'Y' ) !== - 1 ) { - - object.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap; - - } - - if ( axis.search( 'Z' ) !== - 1 ) { - - object.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap; - - } - - } - - } else if ( mode === 'rotate' ) { - - offset.copy( pointEnd ).sub( pointStart ); - - var ROTATION_SPEED = 20 / worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) ); - - if ( axis === 'E' ) { - - rotationAxis.copy( eye ); - rotationAngle = pointEnd.angleTo( pointStart ); - - startNorm.copy( pointStart ).normalize(); - endNorm.copy( pointEnd ).normalize(); - - rotationAngle *= ( endNorm.cross( startNorm ).dot( eye ) < 0 ? 1 : - 1 ); - - } else if ( axis === 'XYZE' ) { - - rotationAxis.copy( offset ).cross( eye ).normalize(); - rotationAngle = offset.dot( _tempVector.copy( rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED; - - } else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) { - - rotationAxis.copy( _unit[ axis ] ); - - _tempVector.copy( _unit[ axis ] ); - - if ( space === 'local' ) { - - _tempVector.applyQuaternion( worldQuaternion ); - - } - - rotationAngle = offset.dot( _tempVector.cross( eye ).normalize() ) * ROTATION_SPEED; - - } - - // Apply rotation snap - - if ( this.rotationSnap ) rotationAngle = Math.round( rotationAngle / this.rotationSnap ) * this.rotationSnap; - - this.rotationAngle = rotationAngle; - - // Apply rotate - if ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) { - - object.quaternion.copy( quaternionStart ); - object.quaternion.multiply( _tempQuaternion.setFromAxisAngle( rotationAxis, rotationAngle ) ).normalize(); - - } else { - - rotationAxis.applyQuaternion( parentQuaternionInv ); - object.quaternion.copy( _tempQuaternion.setFromAxisAngle( rotationAxis, rotationAngle ) ); - object.quaternion.multiply( quaternionStart ).normalize(); - - } - - } - - this.dispatchEvent( changeEvent ); - this.dispatchEvent( objectChangeEvent ); - - }; - - this.pointerUp = function ( pointer ) { - - if ( pointer.button !== 0 ) return; - - if ( this.dragging && ( this.axis !== null ) ) { - - mouseUpEvent.mode = this.mode; - this.dispatchEvent( mouseUpEvent ); - - } - - this.dragging = false; - this.axis = null; - - }; - - // normalize mouse / touch pointer and remap {x,y} to view space. - - function getPointer( event ) { - - if ( scope.domElement.ownerDocument.pointerLockElement ) { - - return { - x: 0, - y: 0, - button: event.button - }; - - } else { - - var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; - - var rect = domElement.getBoundingClientRect(); - - return { - x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1, - y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1, - button: event.button - }; - - } - - } - - // mouse / touch event handlers - - function onPointerHover( event ) { - - if ( ! scope.enabled ) return; - - switch ( event.pointerType ) { - - case 'mouse': - case 'pen': - scope.pointerHover( getPointer( event ) ); - break; - - } - - } - - function onPointerDown( event ) { - - if ( ! scope.enabled ) return; - - scope.domElement.style.touchAction = 'none'; // disable touch scroll - scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove ); - - scope.pointerHover( getPointer( event ) ); - scope.pointerDown( getPointer( event ) ); - - } - - function onPointerMove( event ) { - - if ( ! scope.enabled ) return; - - scope.pointerMove( getPointer( event ) ); - - } - - function onPointerUp( event ) { - - if ( ! scope.enabled ) return; - - scope.domElement.style.touchAction = ''; - scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove ); - - scope.pointerUp( getPointer( event ) ); - - } - - // TODO: deprecate - - this.getMode = function () { - - return scope.mode; - - }; - - this.setMode = function ( mode ) { - - scope.mode = mode; - - }; - - this.setTranslationSnap = function ( translationSnap ) { - - scope.translationSnap = translationSnap; - - }; - - this.setRotationSnap = function ( rotationSnap ) { - - scope.rotationSnap = rotationSnap; - - }; - - this.setScaleSnap = function ( scaleSnap ) { - - scope.scaleSnap = scaleSnap; - - }; - - this.setSize = function ( size ) { - - scope.size = size; - - }; - - this.setSpace = function ( space ) { - - scope.space = space; - - }; - - this.update = function () { - - console.warn( 'THREE.TransformControls: update function has no more functionality and therefore has been deprecated.' ); - - }; - -}; - -TransformControls.prototype = Object.assign( Object.create( Object3D.prototype ), { - - constructor: TransformControls, - - isTransformControls: true - -} ); - - -var TransformControlsGizmo = function ( translationDotsOnly ) { - - 'use strict'; - - Object3D.call( this ); - - this.type = 'TransformControlsGizmo'; - - // shared materials - - var gizmoMaterial = new MeshBasicMaterial( { - depthTest: false, - depthWrite: false, - transparent: true, - side: DoubleSide, - fog: false, - toneMapped: false - } ); - - var gizmoLineMaterial = new LineBasicMaterial( { - depthTest: false, - depthWrite: false, - transparent: true, - linewidth: 1, - fog: false, - toneMapped: false - } ); - - // Make unique material for each axis/color - - var matInvisible = gizmoMaterial.clone(); - matInvisible.opacity = 0.15; - - var matHelper = gizmoMaterial.clone(); - matHelper.opacity = 0.33; - - var matRed = gizmoMaterial.clone(); - matRed.color.set( 0x0A66FF ); - - var matGreen = gizmoMaterial.clone(); - matGreen.color.set( 0x0A66FF ); - - var matBlue = gizmoMaterial.clone(); - matBlue.color.set( 0x0A66FF ); - - var matWhiteTransparent = gizmoMaterial.clone(); - matWhiteTransparent.opacity = 0.25; - - var matYellowTransparent = matWhiteTransparent.clone(); - matYellowTransparent.color.set( 0x0A66FF ); - - var matCyanTransparent = matWhiteTransparent.clone(); - matCyanTransparent.color.set( 0x0A66FF ); - - var matMagentaTransparent = matWhiteTransparent.clone(); - matMagentaTransparent.color.set( 0x0A66FF ); - - var matYellow = gizmoMaterial.clone(); - matYellow.color.set( 0x0A66FF ); - - var matLineRed = gizmoLineMaterial.clone(); - matLineRed.color.set( 0x0A66FF ); - - var matLineGreen = gizmoLineMaterial.clone(); - matLineGreen.color.set( 0x0A66FF ); - - var matLineBlue = gizmoLineMaterial.clone(); - matLineBlue.color.set( 0x0A66FF ); - - var matLineCyan = gizmoLineMaterial.clone(); - matLineCyan.color.set( 0x0A66FF ); - - var matLineMagenta = gizmoLineMaterial.clone(); - matLineMagenta.color.set( 0x0A66FF ); - - var matLineYellow = gizmoLineMaterial.clone(); - matLineYellow.color.set( 0x0A66FF ); - - var matLineGray = gizmoLineMaterial.clone(); - matLineGray.color.set( 0x787878 ); - - var matLineYellowTransparent = matLineYellow.clone(); - matLineYellowTransparent.opacity = 0.25; - - // reusable geometry - - var arrowGeometry = new CylinderGeometry( 0, 0.1, 0.2, 12, 1, false ); - var sphereGeometry = new SphereGeometry( 0.075, 10, 10 ); - - var scaleHandleGeometry = new BoxGeometry( 0.125, 0.125, 0.125 ); - - var lineGeometry = new BufferGeometry(); - lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 0, 0 ], 3 ) ); - - var CircleGeometry = function ( radius, arc ) { - - var geometry = new BufferGeometry( ); - var vertices = []; - - for ( var i = 0; i <= 64 * arc; ++ i ) { - - vertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius ); - - } - - geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); - - return geometry; - - }; - - // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position - - var TranslateHelperGeometry = function () { - - var geometry = new BufferGeometry(); - - geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) ); - - return geometry; - - }; - - // Gizmo definitions - custom hierarchy definitions for setupGizmo() function - - var gizmoTranslate = { - X: [ - [ new Mesh( translationDotsOnly ? sphereGeometry : arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, - Math.PI / 2 ], null, 'fwd' ], - [ new Mesh( translationDotsOnly ? sphereGeometry : arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, Math.PI / 2 ], null, 'bwd' ], - [ translationDotsOnly ? null : new Line( lineGeometry, matLineRed ) ] - ], - Y: [ - [ new Mesh( translationDotsOnly ? sphereGeometry : arrowGeometry, matGreen ), [ 0, 1, 0 ], null, null, 'fwd' ], - [ new Mesh( translationDotsOnly ? sphereGeometry : arrowGeometry, matGreen ), [ 0, 1, 0 ], [ Math.PI, 0, 0 ], null, 'bwd' ], - [ translationDotsOnly ? null : new Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ]] - ], - Z: [ - [ new Mesh( translationDotsOnly ? sphereGeometry : arrowGeometry, matBlue ), [ 0, 0, 1 ], [ Math.PI / 2, 0, 0 ], null, 'fwd' ], - [ new Mesh( translationDotsOnly ? sphereGeometry : arrowGeometry, matBlue ), [ 0, 0, 1 ], [ - Math.PI / 2, 0, 0 ], null, 'bwd' ], - [ translationDotsOnly ? null : new Line( lineGeometry, matLineBlue ), null, [ 0, - Math.PI / 2, 0 ]] - ], - XYZ: [ - [ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ], [ 0, 0, 0 ]] - ], - XY: [ - [ new Mesh( new PlaneGeometry( 0.295, 0.295 ), matYellowTransparent.clone() ), [ 0.15, 0.15, 0 ]], - [ new Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ]], - [ new Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]] - ], - YZ: [ - [ new Mesh( new PlaneGeometry( 0.295, 0.295 ), matCyanTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]], - [ new Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]], - [ new Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]] - ], - XZ: [ - [ new Mesh( new PlaneGeometry( 0.295, 0.295 ), matMagentaTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]], - [ new Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ]], - [ new Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]] - ] - }; - - var pickerTranslate = { - X: [ - [ new Mesh( new CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ]] - ], - Y: [ - [ new Mesh( new CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0.6, 0 ]] - ], - Z: [ - [ new Mesh( new CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ]] - ], - XYZ: [ - [ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ] - ], - XY: [ - [ new Mesh( new PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ]] - ], - YZ: [ - [ new Mesh( new PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]] - ], - XZ: [ - [ new Mesh( new PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]] - ] - }; - - var helperTranslate = { - START: [ - [ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ] - ], - END: [ - [ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ] - ], - DELTA: [ - [ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ] - ], - X: [ - [ translationDotsOnly ? null : new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ] - ], - Y: [ - [ translationDotsOnly ? null : new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ] - ], - Z: [ - [ translationDotsOnly ? null : new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ] - ] - }; - - var gizmoRotate = { - X: [ - [ new Line( CircleGeometry( 1, 0.5 ), matLineRed ) ], - [ new Mesh( new OctahedronGeometry( 0.04, 0 ), matRed ), [ 0, 0, 0.99 ], null, [ 1, 3, 1 ]], - ], - Y: [ - [ new Line( CircleGeometry( 1, 0.5 ), matLineGreen ), null, [ 0, 0, - Math.PI / 2 ]], - [ new Mesh( new OctahedronGeometry( 0.04, 0 ), matGreen ), [ 0, 0, 0.99 ], null, [ 3, 1, 1 ]], - ], - Z: [ - [ new Line( CircleGeometry( 1, 0.5 ), matLineBlue ), null, [ 0, Math.PI / 2, 0 ]], - [ new Mesh( new OctahedronGeometry( 0.04, 0 ), matBlue ), [ 0.99, 0, 0 ], null, [ 1, 3, 1 ]], - ], - E: [ - [ new Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]], - [ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 1.17, 0, 0 ], [ 0, 0, - Math.PI / 2 ], [ 1, 1, 0.001 ]], - [ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ - 1.17, 0, 0 ], [ 0, 0, Math.PI / 2 ], [ 1, 1, 0.001 ]], - [ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, - 1.17, 0 ], [ Math.PI, 0, 0 ], [ 1, 1, 0.001 ]], - [ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]], - ], - XYZE: [ - [ new Line( CircleGeometry( 1, 1 ), matLineGray ), null, [ 0, Math.PI / 2, 0 ]] - ] - }; - - var helperRotate = { - AXIS: [ - [ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ] - ] - }; - - var pickerRotate = { - X: [ - [ new Mesh( new TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]], - ], - Y: [ - [ new Mesh( new TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]], - ], - Z: [ - [ new Mesh( new TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], - ], - E: [ - [ new Mesh( new TorusGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ] - ], - XYZE: [ - [ new Mesh( new SphereGeometry( 0.7, 10, 8 ), matInvisible ) ] - ] - }; - - var gizmoScale = { - X: [ - [ new Mesh( scaleHandleGeometry, matRed ), [ 0.8, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], - [ new Line( lineGeometry, matLineRed ), null, null, [ 0.8, 1, 1 ]] - ], - Y: [ - [ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.8, 0 ]], - [ new Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ], [ 0.8, 1, 1 ]] - ], - Z: [ - [ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.8 ], [ Math.PI / 2, 0, 0 ]], - [ new Line( lineGeometry, matLineBlue ), null, [ 0, - Math.PI / 2, 0 ], [ 0.8, 1, 1 ]] - ], - XY: [ - [ new Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ]], - [ new Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ]], - [ new Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]] - ], - YZ: [ - [ new Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ]], - [ new Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]], - [ new Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]] - ], - XZ: [ - [ new Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ]], - [ new Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ]], - [ new Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]] - ], - XYZX: [ - [ new Mesh( new BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 1.1, 0, 0 ]], - ], - XYZY: [ - [ new Mesh( new BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 1.1, 0 ]], - ], - XYZZ: [ - [ new Mesh( new BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 0, 1.1 ]], - ] - }; - - var pickerScale = { - X: [ - [ new Mesh( new CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]] - ], - Y: [ - [ new Mesh( new CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0.5, 0 ]] - ], - Z: [ - [ new Mesh( new CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]] - ], - XY: [ - [ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ]], - ], - YZ: [ - [ new Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ]], - ], - XZ: [ - [ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ]], - ], - XYZX: [ - [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ]], - ], - XYZY: [ - [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ]], - ], - XYZZ: [ - [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ]], - ] - }; - - var helperScale = { - X: [ - [ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ] - ], - Y: [ - [ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ] - ], - Z: [ - [ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ] - ] - }; - - // Creates an Object3D with gizmos described in custom hierarchy definition. - - var setupGizmo = function ( gizmoMap ) { - - var gizmo = new Object3D(); - - for ( var name in gizmoMap ) { - - for ( var i = gizmoMap[ name ].length; i --; ) { - - var object = gizmoMap[ name ][ i ][ 0 ] - if( object ) object = object.clone(); - else continue - - var position = gizmoMap[ name ][ i ][ 1 ]; - var rotation = gizmoMap[ name ][ i ][ 2 ]; - var scale = gizmoMap[ name ][ i ][ 3 ]; - var tag = gizmoMap[ name ][ i ][ 4 ]; - - // name and tag properties are essential for picking and updating logic. - object.name = name; - object.tag = tag; - - if ( position ) { - - object.position.set( position[ 0 ], position[ 1 ], position[ 2 ] ); - - } - - if ( rotation ) { - - object.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] ); - - } - - if ( scale ) { - - object.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] ); - - } - - object.updateMatrix(); - - if( !translationDotsOnly ) { - - var tempGeometry = object.geometry.clone(); - - tempGeometry.applyMatrix4( object.matrix ); - - object.geometry = tempGeometry; - - } - - object.renderOrder = Infinity; - - object.position.set( 0, 0, 0 ); - object.rotation.set( 0, 0, 0 ); - object.scale.set( 1, 1, 1 ); - - gizmo.add( object ); - - } - - } - - return gizmo; - - }; - - // Reusable utility variables - - var tempVector = new Vector3( 0, 0, 0 ); - var tempEuler = new Euler(); - var alignVector = new Vector3( 0, 1, 0 ); - var zeroVector = new Vector3( 0, 0, 0 ); - var lookAtMatrix = new Matrix4(); - var tempQuaternion = new Quaternion(); - var tempQuaternion2 = new Quaternion(); - var identityQuaternion = new Quaternion(); - - var unitX = new Vector3( 1, 0, 0 ); - var unitY = new Vector3( 0, 1, 0 ); - var unitZ = new Vector3( 0, 0, 1 ); - - // Gizmo creation - - this.gizmo = {}; - this.picker = {}; - this.helper = {}; - - this.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) ); - this.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) ); - this.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) ); - this.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) ); - this.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) ); - this.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) ); - this.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) ); - this.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) ); - this.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) ); - - // Pickers should be hidden always - - this.picker[ 'translate' ].visible = false; - this.picker[ 'rotate' ].visible = false; - this.picker[ 'scale' ].visible = false; - - // updateMatrixWorld will update transformations and appearance of individual handles - - this.updateMatrixWorld = function () { - - var space = this.space; - - if ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation - - var quaternion = space === 'local' ? this.worldQuaternion : identityQuaternion; - - // Show only gizmos for current transform mode - - this.gizmo[ 'translate' ].visible = this.mode === 'translate'; - this.gizmo[ 'rotate' ].visible = this.mode === 'rotate'; - this.gizmo[ 'scale' ].visible = this.mode === 'scale'; - - this.helper[ 'translate' ].visible = this.mode === 'translate'; - this.helper[ 'rotate' ].visible = this.mode === 'rotate'; - this.helper[ 'scale' ].visible = this.mode === 'scale'; - - - var handles = []; - handles = handles.concat( this.picker[ this.mode ].children ); - handles = handles.concat( this.gizmo[ this.mode ].children ); - handles = handles.concat( this.helper[ this.mode ].children ); - - for ( var i = 0; i < handles.length; i ++ ) { - - var handle = handles[ i ]; - - // hide aligned to camera - - handle.visible = true; - handle.rotation.set( 0, 0, 0 ); - handle.position.copy( this.worldPosition ); - - var factor; - - if ( this.camera.isOrthographicCamera ) { - - factor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom; - - } else { - - factor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 ); - - } - - handle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 7 ); - - // TODO: simplify helpers and consider decoupling from gizmo - - if ( handle.tag === 'helper' ) { - - handle.visible = false; - - if ( handle.name === 'AXIS' ) { - - handle.position.copy( this.worldPositionStart ); - handle.visible = !! this.axis; - - if ( this.axis === 'X' ) { - - tempQuaternion.setFromEuler( tempEuler.set( 0, 0, 0 ) ); - handle.quaternion.copy( quaternion ).multiply( tempQuaternion ); - - if ( Math.abs( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) { - - handle.visible = false; - - } - - } - - if ( this.axis === 'Y' ) { - - tempQuaternion.setFromEuler( tempEuler.set( 0, 0, Math.PI / 2 ) ); - handle.quaternion.copy( quaternion ).multiply( tempQuaternion ); - - if ( Math.abs( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) { - - handle.visible = false; - - } - - } - - if ( this.axis === 'Z' ) { - - tempQuaternion.setFromEuler( tempEuler.set( 0, Math.PI / 2, 0 ) ); - handle.quaternion.copy( quaternion ).multiply( tempQuaternion ); - - if ( Math.abs( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) { - - handle.visible = false; - - } - - } - - if ( this.axis === 'XYZE' ) { - - tempQuaternion.setFromEuler( tempEuler.set( 0, Math.PI / 2, 0 ) ); - alignVector.copy( this.rotationAxis ); - handle.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( zeroVector, alignVector, unitY ) ); - handle.quaternion.multiply( tempQuaternion ); - handle.visible = this.dragging; - - } - - if ( this.axis === 'E' ) { - - handle.visible = false; - - } - - - } else if ( handle.name === 'START' ) { - - handle.position.copy( this.worldPositionStart ); - handle.visible = this.dragging; - - } else if ( handle.name === 'END' ) { - - handle.position.copy( this.worldPosition ); - handle.visible = this.dragging; - - } else if ( handle.name === 'DELTA' ) { - - handle.position.copy( this.worldPositionStart ); - handle.quaternion.copy( this.worldQuaternionStart ); - tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 ); - tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() ); - handle.scale.copy( tempVector ); - handle.visible = this.dragging; - - } else { - - handle.quaternion.copy( quaternion ); - - if ( this.dragging ) { - - handle.position.copy( this.worldPositionStart ); - - } else { - - handle.position.copy( this.worldPosition ); - - } - - if ( this.axis ) { - - handle.visible = this.axis.search( handle.name ) !== - 1; - - } - - } - - // If updating helper, skip rest of the loop - continue; - - } - - // Align handles to current local or world rotation - - handle.quaternion.copy( quaternion ); - - if ( this.mode === 'translate' || this.mode === 'scale' ) { - - // Hide translate and scale axis facing the camera - - var AXIS_HIDE_TRESHOLD = 0.99; - var PLANE_HIDE_TRESHOLD = 0.2; - var AXIS_FLIP_TRESHOLD = 0.0; - - - if ( handle.name === 'X' || handle.name === 'XYZX' ) { - - if ( Math.abs( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) { - - handle.scale.set( 1e-10, 1e-10, 1e-10 ); - handle.visible = false; - - } - - } - - if ( handle.name === 'Y' || handle.name === 'XYZY' ) { - - if ( Math.abs( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) { - - handle.scale.set( 1e-10, 1e-10, 1e-10 ); - handle.visible = false; - - } - - } - - if ( handle.name === 'Z' || handle.name === 'XYZZ' ) { - - if ( Math.abs( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) { - - handle.scale.set( 1e-10, 1e-10, 1e-10 ); - handle.visible = false; - - } - - } - - if ( handle.name === 'XY' ) { - - if ( Math.abs( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) { - - handle.scale.set( 1e-10, 1e-10, 1e-10 ); - handle.visible = false; - - } - - } - - if ( handle.name === 'YZ' ) { - - if ( Math.abs( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) { - - handle.scale.set( 1e-10, 1e-10, 1e-10 ); - handle.visible = false; - - } - - } - - if ( handle.name === 'XZ' ) { - - if ( Math.abs( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) { - - handle.scale.set( 1e-10, 1e-10, 1e-10 ); - handle.visible = false; - - } - - } - - // Flip translate and scale axis ocluded behind another axis - - if ( handle.name.search( 'X' ) !== - 1 ) { - - if ( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) { - - if ( handle.tag === 'fwd' ) { - - handle.visible = false; - - } else { - - handle.scale.x *= - 1; - - } - - } else if ( handle.tag === 'bwd' ) { - - handle.visible = false; - - } - - } - - if ( handle.name.search( 'Y' ) !== - 1 ) { - - if ( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) { - - if ( handle.tag === 'fwd' ) { - - handle.visible = false; - - } else { - - handle.scale.y *= - 1; - - } - - } else if ( handle.tag === 'bwd' ) { - - handle.visible = false; - - } - - } - - if ( handle.name.search( 'Z' ) !== - 1 ) { - - if ( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) { - - if ( handle.tag === 'fwd' ) { - - handle.visible = false; - - } else { - - handle.scale.z *= - 1; - - } - - } else if ( handle.tag === 'bwd' ) { - - handle.visible = false; - - } - - } - - } else if ( this.mode === 'rotate' ) { - - // Align handles to current local or world rotation - - tempQuaternion2.copy( quaternion ); - alignVector.copy( this.eye ).applyQuaternion( tempQuaternion.copy( quaternion ).invert() ); - - if ( handle.name.search( 'E' ) !== - 1 ) { - - handle.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( this.eye, zeroVector, unitY ) ); - - } - - if ( handle.name === 'X' ) { - - tempQuaternion.setFromAxisAngle( unitX, Math.atan2( - alignVector.y, alignVector.z ) ); - tempQuaternion.multiplyQuaternions( tempQuaternion2, tempQuaternion ); - handle.quaternion.copy( tempQuaternion ); - - } - - if ( handle.name === 'Y' ) { - - tempQuaternion.setFromAxisAngle( unitY, Math.atan2( alignVector.x, alignVector.z ) ); - tempQuaternion.multiplyQuaternions( tempQuaternion2, tempQuaternion ); - handle.quaternion.copy( tempQuaternion ); - - } - - if ( handle.name === 'Z' ) { - - tempQuaternion.setFromAxisAngle( unitZ, Math.atan2( alignVector.y, alignVector.x ) ); - tempQuaternion.multiplyQuaternions( tempQuaternion2, tempQuaternion ); - handle.quaternion.copy( tempQuaternion ); - - } - - } - - // Hide disabled axes - handle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX ); - handle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY ); - handle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ ); - handle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) ); - - // highlight selected axis - - handle.material._opacity = handle.material._opacity || handle.material.opacity; - handle.material._color = handle.material._color || handle.material.color.clone(); - - handle.material.color.copy( handle.material._color ); - handle.material.opacity = handle.material._opacity; - - if ( ! this.enabled ) { - - handle.material.opacity *= 0.5; - handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 ); - - } else if ( this.axis ) { - - if ( handle.name === this.axis ) { - - handle.material.opacity = 1.0; - handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 ); - - } else if ( this.axis.split( '' ).some( function ( a ) { - - return handle.name === a; - - } ) ) { - - handle.material.opacity = 1.0; - handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 ); - - } else { - - handle.material.opacity *= 0.25; - handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 ); - - } - - } - - } - - Object3D.prototype.updateMatrixWorld.call( this ); - - }; - -}; - -TransformControlsGizmo.prototype = Object.assign( Object.create( Object3D.prototype ), { - - constructor: TransformControlsGizmo, - - isTransformControlsGizmo: true - -} ); - - -var TransformControlsPlane = function () { - - 'use strict'; - - Mesh.call( this, - new PlaneGeometry( 100000, 100000, 2, 2 ), - new MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false } ) - ); - - this.type = 'TransformControlsPlane'; - - var unitX = new Vector3( 1, 0, 0 ); - var unitY = new Vector3( 0, 1, 0 ); - var unitZ = new Vector3( 0, 0, 1 ); - - var tempVector = new Vector3(); - var dirVector = new Vector3(); - var alignVector = new Vector3(); - var tempMatrix = new Matrix4(); - var identityQuaternion = new Quaternion(); - - this.updateMatrixWorld = function () { - - var space = this.space; - - this.position.copy( this.worldPosition ); - - if ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation - - unitX.set( 1, 0, 0 ).applyQuaternion( space === 'local' ? this.worldQuaternion : identityQuaternion ); - unitY.set( 0, 1, 0 ).applyQuaternion( space === 'local' ? this.worldQuaternion : identityQuaternion ); - unitZ.set( 0, 0, 1 ).applyQuaternion( space === 'local' ? this.worldQuaternion : identityQuaternion ); - - // Align the plane for current transform mode, axis and space. - - alignVector.copy( unitY ); - - switch ( this.mode ) { - - case 'translate': - case 'scale': - switch ( this.axis ) { - - case 'X': - alignVector.copy( this.eye ).cross( unitX ); - dirVector.copy( unitX ).cross( alignVector ); - break; - case 'Y': - alignVector.copy( this.eye ).cross( unitY ); - dirVector.copy( unitY ).cross( alignVector ); - break; - case 'Z': - alignVector.copy( this.eye ).cross( unitZ ); - dirVector.copy( unitZ ).cross( alignVector ); - break; - case 'XY': - dirVector.copy( unitZ ); - break; - case 'YZ': - dirVector.copy( unitX ); - break; - case 'XZ': - alignVector.copy( unitZ ); - dirVector.copy( unitY ); - break; - case 'XYZ': - case 'E': - dirVector.set( 0, 0, 0 ); - break; - - } - - break; - case 'rotate': - default: - // special case for rotate - dirVector.set( 0, 0, 0 ); - - } - - if ( dirVector.length() === 0 ) { - - // If in rotate mode, make the plane parallel to camera - this.quaternion.copy( this.cameraQuaternion ); - - } else { - - tempMatrix.lookAt( tempVector.set( 0, 0, 0 ), dirVector, alignVector ); - - this.quaternion.setFromRotationMatrix( tempMatrix ); - - } - - Object3D.prototype.updateMatrixWorld.call( this ); - - }; - -}; - -TransformControlsPlane.prototype = Object.assign( Object.create( Mesh.prototype ), { - - constructor: TransformControlsPlane, - - isTransformControlsPlane: true - -} ); - -export { TransformControls, TransformControlsGizmo, TransformControlsPlane }; From a5e626b17b3d7154427cda87fdb22aadd8e90c16 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sun, 14 Nov 2021 11:14:02 +0000 Subject: [PATCH 15/75] feat(viewer): tyding up a bit --- .../viewer/src/modules/InteractionHandler.js | 2 +- packages/viewer/src/modules/SceneObjects.js | 2 - packages/viewer/src/modules/SectionBox.js | 22 +-- .../viewer/src/modules/SectionPlaneHelper.js | 143 ------------------ .../viewer/src/modules/SelectionHelper.js | 8 +- packages/viewer/src/modules/Viewer.js | 10 +- .../viewer/src/modules/ViewerObjectLoader.js | 2 +- .../src/modules/context/CameraHanlder.js | 5 +- .../src/modules/{ => converter}/Converter.js | 0 .../modules/{ => converter}/ObjectWrapper.js | 0 .../src/modules/{ => converter}/Units.js | 0 11 files changed, 28 insertions(+), 166 deletions(-) delete mode 100644 packages/viewer/src/modules/SectionPlaneHelper.js rename packages/viewer/src/modules/{ => converter}/Converter.js (100%) rename packages/viewer/src/modules/{ => converter}/ObjectWrapper.js (100%) rename packages/viewer/src/modules/{ => converter}/Units.js (100%) diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 58678db1c..bee789ad6 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -197,7 +197,7 @@ export default class InteractionHandler { } getViews() { - return this.viewer.sceneManager.views.map( v => { return { name: v.applicationId, id: v.id } } ) + return this.viewer.sceneManager.views.map( v => { return { name: v.applicationId, id: v.id, view: v } } ) } setView( id, transition = true ) { diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index 2660b0b9d..c8a1236a3 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -1,7 +1,5 @@ import * as THREE from 'three' import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' -// import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils' -import debounce from 'lodash.debounce' import FilteringManager from './Filtering' /** diff --git a/packages/viewer/src/modules/SectionBox.js b/packages/viewer/src/modules/SectionBox.js index d6af28e8d..78c30253f 100644 --- a/packages/viewer/src/modules/SectionBox.js +++ b/packages/viewer/src/modules/SectionBox.js @@ -29,6 +29,7 @@ export default class SectionBox { // we're attaching the gizmo mover to this sphere in the box centre let sphere = new THREE.SphereGeometry( 0.01, 10, 10 ) this.sphere = new THREE.Mesh( sphere, new THREE.MeshStandardMaterial( { color:0x00ffff } ) ) + this.sphere.visible = false this.display.add( this.sphere ) // plane @@ -61,18 +62,19 @@ export default class SectionBox { this.prevPosition = null this.attachedToBox = true - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true } ) + this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true, checkForSectionBoxInclusion: false } ) this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) this.selectionHelper.on( 'hovered', ( objs ) =>{ - if( !this.attachedToBox ) return - if( objs.length === 0 ) { - this.controls.visible = false - this.viewer.needsRender = true - } - else if( objs.length !== 0 ) { - this.controls.visible = true - this.viewer.needsRender = true - } + // TODO: cannot get this to work reliably + // if( !this.attachedToBox ) return + // if( objs.length === 0 ) { + // this.controls.visible = false + // this.viewer.needsRender = true + // } + // else if( objs.length !== 0 ) { + // this.controls.visible = true + // this.viewer.needsRender = true + // } } ) document.addEventListener( 'keydown', ( e ) => { diff --git a/packages/viewer/src/modules/SectionPlaneHelper.js b/packages/viewer/src/modules/SectionPlaneHelper.js deleted file mode 100644 index 12e13c7cf..000000000 --- a/packages/viewer/src/modules/SectionPlaneHelper.js +++ /dev/null @@ -1,143 +0,0 @@ -import * as THREE from 'three' -import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js' - -/** - * WIP: A utility class for adding section planes to the scene. - * - 'S' shows/hides section planes - * - 's' toggles controls from translate to rotate - */ -export default class SectionPlaneHelper { - - constructor( parent ) { - this.viewer = parent - this.cutters = [] - this.visible = false - - window.addEventListener( 'keydown', ( event ) => { - if ( event.key === 's' ) { - this.toggleTransformControls() - } - if ( event.key === 'S' ) { - this.toggleSectionPlanes() - } - }, false ) - } - - get planes() { - return this.cutters.map( cutter => cutter.plane ) - } - - get activePlanes() { - return this.cutters.filter( cutter => cutter.visible ).map( cutter => cutter.plane ) - } - - toggleTransformControls() { - this.cutters.forEach( cutter => { - if ( cutter.control.mode === 'rotate' ) { - cutter.control.setMode( 'translate' ) - cutter.control.showX = false - cutter.control.showY = false - cutter.control.showZ = true - return - } - cutter.control.setMode( 'rotate' ) - cutter.control.showX = true - cutter.control.showY = true - cutter.control.showZ = false - } ) - } - - createSectionPlane() { - let cutter = { } - - cutter.id = this.cutters.length - cutter.visible = false - cutter.plane = new THREE.Plane( new THREE.Vector3( 0, 0, -1 ), 1 ) - - cutter.helper = new THREE.Mesh( new THREE.PlaneGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: 0xAFAFAF, transparent: true, opacity: 0.1, side: THREE.DoubleSide } ) ) - cutter.helper.visible = false - this.viewer.scene.add( cutter.helper ) - - cutter.control = new TransformControls( this.viewer.camera, this.viewer.renderer.domElement ) - cutter.control.setSize( 0.5 ) - cutter.control.space = 'local' - cutter.control.showX = false - cutter.control.showY = false - cutter.control.setRotationSnap( THREE.MathUtils.degToRad( 15 ) ) - - cutter.control.addEventListener( 'change', () => this.viewer.render ) - cutter.control.addEventListener( 'dragging-changed', ( event ) => { - if ( !cutter.visible ) return - this.viewer.controls.enabled = !event.value - - // Reference: https://stackoverflow.com/a/52124409 - let normal = new THREE.Vector3() - let point = new THREE.Vector3() - normal.set( 0, 0, -1 ).applyQuaternion( cutter.helper.quaternion ) - point.copy( cutter.helper.position ) - cutter.plane.setFromNormalAndCoplanarPoint( normal, point ) - } ) - - cutter.control.attach( cutter.helper ) - cutter.control.visible = false - this.viewer.scene.add( cutter.control ) - - this.cutters.push( cutter ) - - // adds local clipping planes to all materials - let objs = this.viewer.sceneManager.filteredObjects - objs.forEach( obj => { - obj.material.clippingPlanes = this.cutters.map( c => c.plane ) - } ) - } - - toggleSectionPlanes() { - if ( this.visible ) this.hideSectionPlanes() - else this.showSectionPlanes() - - this.visible = !this.visible - } - - showSectionPlanes() { - this._matchSceneSize() - - this.cutters.forEach( cutter => { - cutter.visible = true - cutter.helper.visible = true - cutter.control.visible = true - } ) - - this.viewer.renderer.localClippingEnabled = true - } - - hideSectionPlanes() { - this.cutters.forEach( cutter => { - cutter.visible = false - cutter.helper.visible = false - cutter.control.visible = false - } ) - this.viewer.renderer.localClippingEnabled = false - } - - _matchSceneSize() { - // Scales and translate helper to scene bbox center and origin - const sceneBox = new THREE.Box3().setFromObject( this.viewer.sceneManager.userObjects ) - const sceneSize = new THREE.Vector3() - sceneBox.getSize( sceneSize ) - const sceneCenter = new THREE.Vector3() - sceneBox.getCenter( sceneCenter ) - - this.cutters.forEach( cutter => { - cutter.helper.scale.set( sceneSize.x > 0 ? sceneSize.x : 1, sceneSize.y > 0 ? sceneSize.y : 1, sceneSize.z >0 ? sceneSize.z : 1 ) - cutter.helper.position.set( sceneCenter.x, sceneCenter.y, sceneCenter.z ) - - let normal = new THREE.Vector3() - let point = new THREE.Vector3() - normal.set( 0, 0, -1 ).applyQuaternion( cutter.helper.quaternion ) - point.copy( cutter.helper.position ) - cutter.plane.setFromNormalAndCoplanarPoint( normal, point ) - } ) - - } - -} diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 001e35399..3e6ad848f 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -53,9 +53,9 @@ export default class SelectionHelper extends EventEmitter { }, 100 ) ) } - this.sectionBox = null - if ( typeof _options !== 'undefined' && _options.sectionBox ) { - this.sectionBox = _options.sectionBox + this.checkForSectionBoxInclusion = true + if ( typeof _options !== 'undefined' && _options.checkForSectionBoxInclusion ) { + this.sectionBox = _options.checkForSectionBoxInclusion } // Handle mouseclicks @@ -139,7 +139,7 @@ export default class SelectionHelper extends EventEmitter { let intersectedObjects = this.raycaster.intersectObjects( targetObjects ) // filters objects in section box mode - if ( this.viewer.sectionBox.display.visible ) { + if ( this.viewer.sectionBox.display.visible && this.checkForSectionBoxInclusion ) { let box = new THREE.Box3().setFromObject( this.viewer.sectionBox.cube ) intersectedObjects = intersectedObjects.filter( obj => { return box.containsPoint( obj.point ) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 795c5527b..39bd32929 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -30,7 +30,7 @@ export default class Viewer extends EventEmitter { this.container.appendChild( this.renderer.domElement ) - this.cameraHandler = new CameraHandler(this) + this.cameraHandler = new CameraHandler( this ) this.reflections = reflections this.reflectionsNeedUpdate = true @@ -183,6 +183,10 @@ export default class Viewer extends EventEmitter { this.sectionBox.toggle() } + setProjectionMode( mode ) { + this.cameraHandler.activeCam = mode + } + async loadObject( url, token ) { let loader = new ViewerObjectLoader( this, url, token ) this.loaders[ url ] = loader @@ -195,7 +199,7 @@ export default class Viewer extends EventEmitter { } async unloadAll() { - for(let key of Object.keys(this.loaders)) { + for( let key of Object.keys( this.loaders ) ) { await this.loaders[key].unload() delete this.loaders[key] } @@ -210,6 +214,6 @@ export default class Viewer extends EventEmitter { } dispose() { - // TODO: currently it's easier to simply refresh the page + // TODO: currently it's easier to simply refresh the page :) } } diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index d029a7ce2..c9e973ea8 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -1,5 +1,5 @@ import ObjectLoader from '@speckle/objectloader' -import Converter from './Converter' +import Converter from './converter/Converter' /** * Helper wrapper around the ObjectLoader class, with some built in assumptions. diff --git a/packages/viewer/src/modules/context/CameraHanlder.js b/packages/viewer/src/modules/context/CameraHanlder.js index 18790422e..b313f67b9 100644 --- a/packages/viewer/src/modules/context/CameraHanlder.js +++ b/packages/viewer/src/modules/context/CameraHanlder.js @@ -53,10 +53,11 @@ export default class CameraHandler { } set activeCam( val ) { - if( val === 'perspective' ) + if( val === 'perspective' ) this.setPerspectiveCameraOn() - if( val === 'ortho' ) + else if( val === 'ortho' ) this.setOrthoCameraOn() + else throw new Error( `'${val}' projection mode is invalid. Try with 'perspective' or 'ortho'.` ) } set enabled( val ) { diff --git a/packages/viewer/src/modules/Converter.js b/packages/viewer/src/modules/converter/Converter.js similarity index 100% rename from packages/viewer/src/modules/Converter.js rename to packages/viewer/src/modules/converter/Converter.js diff --git a/packages/viewer/src/modules/ObjectWrapper.js b/packages/viewer/src/modules/converter/ObjectWrapper.js similarity index 100% rename from packages/viewer/src/modules/ObjectWrapper.js rename to packages/viewer/src/modules/converter/ObjectWrapper.js diff --git a/packages/viewer/src/modules/Units.js b/packages/viewer/src/modules/converter/Units.js similarity index 100% rename from packages/viewer/src/modules/Units.js rename to packages/viewer/src/modules/converter/Units.js From 961e3aa9f564b7b2c166ec546cb75f8cc45fbc16 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sun, 14 Nov 2021 11:28:07 +0000 Subject: [PATCH 16/75] feat(viewer): various improvements + made eslint less annoying --- packages/viewer/.eslintrc.js | 5 +++-- .../viewer/src/modules/{Filtering.js => FilteringManager.js} | 0 packages/viewer/src/modules/SceneObjects.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) rename packages/viewer/src/modules/{Filtering.js => FilteringManager.js} (100%) diff --git a/packages/viewer/.eslintrc.js b/packages/viewer/.eslintrc.js index 9a4e2d2f8..ad8874db8 100644 --- a/packages/viewer/.eslintrc.js +++ b/packages/viewer/.eslintrc.js @@ -18,13 +18,14 @@ module.exports = { 'space-before-blocks': 'error', 'space-infix-ops': 'error', 'comma-dangle': [ 'error', 'never' ], - 'no-console': [ 'error', { allow: [ 'warn', 'error' ] } ], + 'no-console': [ 'warn', { allow: [ 'warn', 'error' ] } ], 'space-unary-ops': 'error', 'no-var': 'error', 'no-alert': 'error', 'no-param-reassign': 'warn', semi: [ 'error', 'never' ], quotes: [ 'error', 'single' ], - eqeqeq: 'warn' + eqeqeq: 'warn', + 'no-unused-vars': 'warn' } } diff --git a/packages/viewer/src/modules/Filtering.js b/packages/viewer/src/modules/FilteringManager.js similarity index 100% rename from packages/viewer/src/modules/Filtering.js rename to packages/viewer/src/modules/FilteringManager.js diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index c8a1236a3..34c3c421a 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -1,6 +1,6 @@ import * as THREE from 'three' import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils' -import FilteringManager from './Filtering' +import FilteringManager from './FilteringManager' /** * Container for the scene objects, to allow loading/unloading/filtering/coloring/grouping From b589508fdb1ca0d463083bc6230aef88251965c5 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sun, 14 Nov 2021 20:09:58 +0000 Subject: [PATCH 17/75] feat(viewer): fixes ortho camera zooms/bounding/etc --- packages/viewer/src/assets/example.html | 2 +- .../viewer/src/modules/InteractionHandler.js | 23 +++++++++++++------ packages/viewer/src/modules/Viewer.js | 16 +++++++++++++ .../src/modules/context/CameraHanlder.js | 8 +++++++ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index 341453768..af10fb471 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -20,7 +20,7 @@ - +
diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index bee789ad6..f1736944b 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -122,7 +122,7 @@ export default class InteractionHandler { zoomToBox( box, fit = 1.2, transition = true ) { if( box.max.x === Infinity || box.max.x === -Infinity ) { - box = new THREE.Box3( new THREE.Vector3( -5,-5,-5 ), new THREE.Vector3( 5,5,5 ) ) + box = new THREE.Box3( new THREE.Vector3( -1,-1,-1 ), new THREE.Vector3( 1,1,1 ) ) } const fitOffset = fit @@ -130,8 +130,8 @@ export default class InteractionHandler { let target = new THREE.Sphere() box.getBoundingSphere( target ) target.radius = target.radius * fitOffset - - this.viewer.cameraHandler.activeCam.controls.fitToSphere( target, transition ) + + this.viewer.cameraHandler.controls.fitToSphere( target, transition ) const maxSize = Math.max( size.x, size.y, size.z ) const fitHeightDistance = maxSize / ( 2 * Math.atan( Math.PI * this.viewer.cameraHandler.camera.fov / 360 ) ) @@ -143,13 +143,22 @@ export default class InteractionHandler { this.viewer.cameraHandler.camera.near = distance / 100 this.viewer.cameraHandler.camera.far = distance * 100 this.viewer.cameraHandler.camera.updateProjectionMatrix() - this.viewer.cameraHandler.orthoCamera.near = distance / 100 - this.viewer.cameraHandler.orthoCamera.far = distance * 100 - this.viewer.cameraHandler.orthoCamera.updateProjectionMatrix() + + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) { + if( box.containsPoint( this.viewer.cameraHandler.orthoCamera.position ) ) { + let p = this.viewer.cameraHandler.orthoCamera.position + this.viewer.cameraHandler.controls.setPosition( p.x * target.radius, p.y * target.radius, p.z * target.radius, false ) + } + + this.viewer.cameraHandler.orthoCamera.near = distance / 100 + this.viewer.cameraHandler.orthoCamera.far = distance * 100 + this.viewer.cameraHandler.orthoCamera.updateProjectionMatrix() + } + } rotateCamera( azimuthAngle = 0.261799, polarAngle = 0, transition = true ) { - this.viewer.controls.rotate( azimuthAngle, polarAngle, transition ) + this.viewer.cameraHandler.controls.rotate( azimuthAngle, polarAngle, transition ) } screenshot() { diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 39bd32929..def8c324f 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -183,10 +183,26 @@ export default class Viewer extends EventEmitter { this.sectionBox.toggle() } + sectionBoxOff() { + this.sectionBox.off() + } + + sectionBoxOn() { + this.sectionBox.on() + } + + zoomExtents( fit, transition ) { + this.interactions.zoomExtents( fit, transition ) + } + setProjectionMode( mode ) { this.cameraHandler.activeCam = mode } + toggleCameras() { + this.cameraHandler.toggleCameras() + } + async loadObject( url, token ) { let loader = new ViewerObjectLoader( this, url, token ) this.loaders[ url ] = loader diff --git a/packages/viewer/src/modules/context/CameraHanlder.js b/packages/viewer/src/modules/context/CameraHanlder.js index b313f67b9..4612ed36b 100644 --- a/packages/viewer/src/modules/context/CameraHanlder.js +++ b/packages/viewer/src/modules/context/CameraHanlder.js @@ -109,10 +109,18 @@ export default class CameraHandler { this.orthoCamera.top = height / 2 this.orthoCamera.bottom = height / -2 this.orthoCamera.far = this.camera.far + this.orthoCamera.near = 0.0001 this.orthoCamera.updateProjectionMatrix() this.orthoCamera.position.copy( this.camera.position ) this.orthoCamera.quaternion.copy( this.camera.quaternion ) + this.controls.camera = this.orthoCamera + + let box = new THREE.Box3().setFromObject( this.viewer.sceneManager.sceneObjects.allObjects ) + if( box.containsPoint( this.orthoCamera.position ) ) { + this.viewer.zoomExtents() + } + this.viewer.emit( 'projection-change', 'ortho' ) } From 77038046db7460d8a2b3f6e0a38dbadd2861de3c Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sun, 14 Nov 2021 21:15:17 +0000 Subject: [PATCH 18/75] feat(viewer): adds special handling of front/top/etc views in ortho mode --- packages/viewer/src/assets/example.html | 2 + .../viewer/src/modules/InteractionHandler.js | 69 +++++++++++++------ packages/viewer/src/modules/Viewer.js | 2 +- .../src/modules/context/CameraHanlder.js | 10 ++- 4 files changed, 61 insertions(+), 22 deletions(-) diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index af10fb471..21b17f38f 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -45,6 +45,8 @@
View: + + diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index f1736944b..5189c0b70 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -177,31 +177,60 @@ export default class InteractionHandler { const DEG180 = Math.PI switch ( side ) { - case 'front': - this.viewer.cameraHandler.activeCam.controls.rotateTo( 0, DEG90, transition ) - break + case 'front': + this.viewer.cameraHandler.controls.rotateTo( 0, DEG90, transition ) + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) + this.viewer.cameraHandler.disableRotations() + break - case 'back': - this.viewer.cameraHandler.activeCam.controls.rotateTo( DEG180, DEG90, transition ) - break + case 'back': + this.viewer.cameraHandler.controls.rotateTo( DEG180, DEG90, transition ) + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) + this.viewer.cameraHandler.disableRotations() + break - case 'up': - case 'top': - this.viewer.cameraHandler.activeCam.controls.rotateTo( 0, 0, transition ) - break + case 'up': + case 'top': + this.viewer.cameraHandler.controls.rotateTo( 0, 0, transition ) + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) + this.viewer.cameraHandler.disableRotations() + break - case 'down': - case 'bottom': - this.viewer.cameraHandler.activeCam.controls.rotateTo( 0, DEG180, transition ) - break + case 'down': + case 'bottom': + this.viewer.cameraHandler.controls.rotateTo( 0, DEG180, transition ) + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) + this.viewer.cameraHandler.disableRotations() + break - case 'right': - this.viewer.cameraHandler.activeCam.controls.rotateTo( DEG90, DEG90, transition ) - break + case 'right': + this.viewer.cameraHandler.controls.rotateTo( DEG90, DEG90, transition ) + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) + this.viewer.cameraHandler.disableRotations() + break - case 'left': - this.viewer.cameraHandler.activeCam.controls.rotateTo( -DEG90, DEG90, transition ) - break + case 'left': + this.viewer.cameraHandler.controls.rotateTo( -DEG90, DEG90, transition ) + if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) + this.viewer.cameraHandler.disableRotations() + break + + case '3d': + case '3D': + default: { + let box + if ( this.viewer.sceneManager.sceneObjects.allObjects.children.length === 0 ) + box = new THREE.Box3( new THREE.Vector3( -1,-1,-1 ), new THREE.Vector3( 1,1,1 ) ) + else + box = new THREE.Box3().setFromObject( this.viewer.sceneManager.sceneObjects.allObjects ) + if( box.max.x === Infinity || box.max.x === -Infinity ) { + box = new THREE.Box3( new THREE.Vector3( -1,-1,-1 ), new THREE.Vector3( 1,1,1 ) ) + } + this.viewer.cameraHandler.controls.setPosition( box.max.x, box.max.y, box.max.z, transition ) + this.zoomExtents() + this.viewer.cameraHandler.enableRotations() + break + } } } diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index def8c324f..eb8450d13 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -199,7 +199,7 @@ export default class Viewer extends EventEmitter { this.cameraHandler.activeCam = mode } - toggleCameras() { + toggleCameraProjection() { this.cameraHandler.toggleCameras() } diff --git a/packages/viewer/src/modules/context/CameraHanlder.js b/packages/viewer/src/modules/context/CameraHanlder.js index 4612ed36b..f3ec46d1c 100644 --- a/packages/viewer/src/modules/context/CameraHanlder.js +++ b/packages/viewer/src/modules/context/CameraHanlder.js @@ -120,7 +120,6 @@ export default class CameraHandler { if( box.containsPoint( this.orthoCamera.position ) ) { this.viewer.zoomExtents() } - this.viewer.emit( 'projection-change', 'ortho' ) } @@ -132,9 +131,18 @@ export default class CameraHandler { this.controls.distance = this.previousDistance this.controls.camera = this.camera this.controls.zoomTo( 1 ) + this.enableRotations() this.viewer.emit( 'projection-change', 'perspective' ) } + disableRotations() { + this.controls.mouseButtons.left = CameraControls.ACTION.TRUCK + } + + enableRotations() { + this.controls.mouseButtons.left = CameraControls.ACTION.ROTATE + } + setupWASDControls() { const KEYCODE = { W: 87, A: 65, S: 83, D: 68 } From f5e6e14dd451737ca590cc6918789cf0a2bea1f9 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Mon, 15 Nov 2021 09:09:45 +0000 Subject: [PATCH 19/75] feat(viewer): better ortho clipping handling --- packages/viewer/src/modules/InteractionHandler.js | 15 +++++++++------ .../viewer/src/modules/context/CameraHanlder.js | 13 +++++++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 5189c0b70..d4c9e0cef 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -145,14 +145,17 @@ export default class InteractionHandler { this.viewer.cameraHandler.camera.updateProjectionMatrix() if( this.viewer.cameraHandler.activeCam.name === 'ortho' ) { - if( box.containsPoint( this.viewer.cameraHandler.orthoCamera.position ) ) { - let p = this.viewer.cameraHandler.orthoCamera.position - this.viewer.cameraHandler.controls.setPosition( p.x * target.radius, p.y * target.radius, p.z * target.radius, false ) - } - - this.viewer.cameraHandler.orthoCamera.near = distance / 100 this.viewer.cameraHandler.orthoCamera.far = distance * 100 this.viewer.cameraHandler.orthoCamera.updateProjectionMatrix() + + // fit the camera inside, so we don't have clipping plane issues. + // WIP implementation + let camPos = this.viewer.cameraHandler.orthoCamera.position + let dist = target.distanceToPoint( camPos ) + if( dist < 0 ) { + dist *= -1 + this.viewer.cameraHandler.controls.setPosition( camPos.x + dist, camPos.y + dist, camPos.z + dist ) + } } } diff --git a/packages/viewer/src/modules/context/CameraHanlder.js b/packages/viewer/src/modules/context/CameraHanlder.js index f3ec46d1c..8b5752dd4 100644 --- a/packages/viewer/src/modules/context/CameraHanlder.js +++ b/packages/viewer/src/modules/context/CameraHanlder.js @@ -116,10 +116,19 @@ export default class CameraHandler { this.controls.camera = this.orthoCamera + // fit the camera inside, so we don't have clipping plane issues. + // WIP implementation + let camPos = this.orthoCamera.position let box = new THREE.Box3().setFromObject( this.viewer.sceneManager.sceneObjects.allObjects ) - if( box.containsPoint( this.orthoCamera.position ) ) { - this.viewer.zoomExtents() + let sphere = new THREE.Sphere() + box.getBoundingSphere( sphere ) + + let dist = sphere.distanceToPoint( camPos ) + if( dist < 0 ) { + dist *= -1 + this.controls.setPosition( camPos.x + dist, camPos.y + dist, camPos.z + dist ) } + this.viewer.emit( 'projection-change', 'ortho' ) } From 279db7d60cf7db1ddbbb3c7260a6ce1c32c60928 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Mon, 15 Nov 2021 09:34:24 +0000 Subject: [PATCH 20/75] feat(viewer): exposes caching param for loader --- packages/viewer/src/modules/Viewer.js | 4 ++-- packages/viewer/src/modules/ViewerObjectLoader.js | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index eb8450d13..d610a3b2f 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -203,8 +203,8 @@ export default class Viewer extends EventEmitter { this.cameraHandler.toggleCameras() } - async loadObject( url, token ) { - let loader = new ViewerObjectLoader( this, url, token ) + async loadObject( url, token, enableCaching = true ) { + let loader = new ViewerObjectLoader( this, url, token, enableCaching ) this.loaders[ url ] = loader await loader.load() } diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index c9e973ea8..e8eadf989 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -8,7 +8,7 @@ import Converter from './converter/Converter' export default class ViewerObjectLoader { - constructor( parent, objectUrl, authToken ) { + constructor( parent, objectUrl, authToken, enableCahcing ) { this.objectUrl = objectUrl this.viewer = parent this.token = null @@ -38,7 +38,8 @@ export default class ViewerObjectLoader { serverUrl: this.serverUrl, token: this.token, streamId: this.streamId, - objectId: this.objectId + objectId: this.objectId, + options: { enableCahcing: enableCahcing } } ) this.converter = new Converter( this.loader ) @@ -57,7 +58,7 @@ export default class ViewerObjectLoader { this.existingAsyncPause = new Promise( resolve => setTimeout( resolve, 0 ) ) await this.existingAsyncPause this.existingAsyncPause = null - if (Date.now() - this.lastAsyncPause > 500) console.log("VObjLoader Event loop lag: ", Date.now() - this.lastAsyncPause) + if ( Date.now() - this.lastAsyncPause > 500 ) console.log( 'VObjLoader Event loop lag: ', Date.now() - this.lastAsyncPause ) } } From 5b0c511ea695a238d280c6771d15eb31797d98c6 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Mon, 15 Nov 2021 09:46:23 +0000 Subject: [PATCH 21/75] feat(viewer): prelim load cancellation (re #108) --- packages/viewer/src/modules/Viewer.js | 7 +++++++ packages/viewer/src/modules/ViewerObjectLoader.js | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index d610a3b2f..59a708d2e 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -209,6 +209,13 @@ export default class Viewer extends EventEmitter { await loader.load() } + async cancelLoad( url, unload = false ) { + this.loaders[url].cancelLoad() + if( unload ) { + await this.unloadObject( url ) + } + } + async unloadObject( url ) { await this.loaders[ url ].unload() delete this.loaders[ url ] diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index e8eadf989..3feb9d610 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -46,6 +46,7 @@ export default class ViewerObjectLoader { this.lastAsyncPause = Date.now() this.existingAsyncPause = null + this.cancel = false } async asyncPause() { @@ -69,6 +70,11 @@ export default class ViewerObjectLoader { let viewerLoads = 0 let firstObjectPromise = null for await ( let obj of this.loader.getObjectIterator() ) { + if( this.cancel ) { + this.viewer.emit( 'load-progress', { progress: 1, id: this.objectId, url: this.objectUrl } ) // to hide progress bar, easier on the frontend + this.viewer.emit( 'load-cancelled', { id: this.objectId, url: this.objectUrl } ) + return + } await this.converter.asyncPause() if ( first ) { firstObjectPromise = this.converter.traverseAndConvert( obj, async ( objectWrapper ) => { @@ -99,4 +105,8 @@ export default class ViewerObjectLoader { async unload( ) { await this.viewer.sceneManager.removeImportedObject( this.objectUrl ) } + + cancelLoad() { + this.cancel = true + } } From 63fde55360ef223301ad3f0db77de727b0cae68b Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Mon, 15 Nov 2021 09:53:35 +0000 Subject: [PATCH 22/75] feat(viewer): loader ensures cancellation on unload basically cancels loading if unload is called while loading is still in progress --- packages/viewer/src/modules/Viewer.js | 1 + packages/viewer/src/modules/ViewerObjectLoader.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 59a708d2e..6cfa327d4 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -214,6 +214,7 @@ export default class Viewer extends EventEmitter { if( unload ) { await this.unloadObject( url ) } + return } async unloadObject( url ) { diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index 3feb9d610..d7c550ba7 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -103,6 +103,7 @@ export default class ViewerObjectLoader { } async unload( ) { + this.cancel = true await this.viewer.sceneManager.removeImportedObject( this.objectUrl ) } From 51c9bede699063dc086d36f9fc2c5129177ae61c Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Mon, 15 Nov 2021 09:58:56 +0000 Subject: [PATCH 23/75] feat: formatting --- packages/viewer/src/modules/Viewer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 6cfa327d4..d76703b56 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -207,6 +207,7 @@ export default class Viewer extends EventEmitter { let loader = new ViewerObjectLoader( this, url, token, enableCaching ) this.loaders[ url ] = loader await loader.load() + return } async cancelLoad( url, unload = false ) { @@ -220,6 +221,7 @@ export default class Viewer extends EventEmitter { async unloadObject( url ) { await this.loaders[ url ].unload() delete this.loaders[ url ] + return } async unloadAll() { @@ -227,6 +229,7 @@ export default class Viewer extends EventEmitter { await this.loaders[key].unload() delete this.loaders[key] } + return } async applyFilter( filter ) { From 5de4f381c612a480dff864fd0a7aefe19522b80e Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Nov 2021 13:22:16 +0200 Subject: [PATCH 24/75] viewer api docs in readme --- packages/viewer/readme.md | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/packages/viewer/readme.md b/packages/viewer/readme.md index 5e4c0327f..a7fa415eb 100644 --- a/packages/viewer/readme.md +++ b/packages/viewer/readme.md @@ -30,6 +30,48 @@ To build the library, you should run: npm run build ``` +## API + +Syntax and examples for supported API methods. The examples assume a Viewer instance named `v`. + +### Load/Unload an object +`v.loadObject( objectUrl )` / `v.unloadObject( objectUrl )` + +Example: `v.loadObject( 'https://speckle.xyz/streams/3073b96e86/objects/e05c5834368931c9d9a4e2087b4da670' )` + +### Get properties of loaded objects +`v.getObjectsProperties()` + +This returns a dictionary with `{ propertyName: propertyInfo }` elements. The property information provided is: + - `type` ( == `'string'` / `'number'` / `'boolean'`): the property type + - `objectCount` (int): How many objects in the scene have this property + - `allValues` (array of `objectCount` elements): The values for this property of all objects that have this property + - `minValue` - the smallest value (using `<` operator, works also on strings) + - `maxValue` - the largest value + - `uniqueValues` - a dictionary of `{ uniqueValue: occurenceCount }` elements, secifying how many objects have the property set to that specific value + +### Filtering and coloring +Those calls filter and color the objects loaded in the scene, and drops the previous applied filters (filtering is not additive). + +Syntax: `await v.applyFilter( { filterBy, colorBy, ghostOthers } )` + +The 3 optional parameters are: + - `filterBy`: A dictionary that specify the filter. Elements are in the form `{ propertyName: propertyValueFilter }`. The propertyValueFilter can be one of: + - A specific value: (only objects with that property value pass the filter) + - An array of values: An object passes the filter if its value is in the array + - A range of values, specified by `{ 'gte': value1, 'lte': value2 }` (greater than or equal, lower than or equal) + - An exclusion list, specified by `{ 'not': excludedValuesArray }` + + - `colorBy`: A dictionary that makes all objects colored based on a property value. Two types of coloring are supported: + - Gradient (from a numeric property): `{ 'type': 'gradient', 'property': propertyName, 'minValue': propertyMinValue, 'maxValue': propertyMaxValue, 'gradientColors': [color1, color2] }` + - Category (for coloring each unique value differently): `{ 'type': 'category', 'property': propertyName, 'values': { value1: color1, value2: color2, ... }, 'default': colorForAnyOtherValue }`. The `values` and the `default` parameters are optional: Random colors are generated if they are ommited. + + - `ghostOthers`: A boolean (default `false`). If set to `true`, then the objects that are filtered out are actually shown with very low opacity, so that the remaining objects have a better context. + + +To remove all filters: `await v.applyFilter( null )` + + ## Community If in trouble, the Speckle Community hangs out on [the forum](https://speckle.community). Do join and introduce yourself! We're happy to help. From 6b1d6ece4280ff83a1581bf05ed9e98619176707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Mon, 15 Nov 2021 12:33:03 +0100 Subject: [PATCH 25/75] chore(server): add duplicate user migration script --- .../server/scripts/duplicateUserMigration.js | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 packages/server/scripts/duplicateUserMigration.js diff --git a/packages/server/scripts/duplicateUserMigration.js b/packages/server/scripts/duplicateUserMigration.js new file mode 100644 index 000000000..9901c521b --- /dev/null +++ b/packages/server/scripts/duplicateUserMigration.js @@ -0,0 +1,102 @@ +const appRoot = require( 'app-root-path' ) +const knex = require( `${appRoot}/db/knex` ) +const bcrypt = require( 'bcrypt' ) +const crs = require( 'crypto-random-string' ) + +const Users = ( ) => knex( 'users' ) +const Acl = ( ) => knex( 'server_acl' ) + +// tableName, columnName that need migration +const migrationTargets = [ + [ 'api_tokens' , 'owner' ], + [ 'authorization_codes' , 'userId' ], + [ 'branches' , 'authorId' ], + [ 'commits' , 'author' ], + [ 'file_uploads' , 'userId' ], + [ 'personal_api_tokens' , 'userId' ], + [ 'refresh_tokens' , 'userId' ], + [ 'server_acl' , 'userId' ], //userId is a PrimaryKey in this table, act accordingly + [ 'server_apps' , 'authorId' ], + [ 'server_invites' , 'inviterId' ], + [ 'stream_acl' , 'userId' ],//userId, with resourceId is a PrimaryKey in this table, act accordingly + [ 'stream_activity' , 'userId' ], +] + +const migrateColumnValue = async( tableName, columnName, oldUser, newUser ) => { + try { + const query = knex( tableName ).where( { [columnName]: oldUser.id } ).update( { [columnName]: newUser.id } ) + console.log( `${query}` ) + await query + } catch ( err ) { + console.log( err ) + } +} + +const createMigrations = ( { lowerUser, upperUser } ) => migrationTargets.map( ( [ tableName, columnName ] ) => { + migrateColumnValue( tableName, columnName, upperUser,lowerUser ) } ) + + +const userByEmailQuery = email => Users( ).where( { email } ) +const createUser = async user => { + user.id = crs( { length: 10 } ) + + if ( user.password ) { + user.passwordDigest = await bcrypt.hash( user.password, 10 ) + } + delete user.password + + let usr = await userByEmailQuery( user.email ).select( 'id' ).first( ) + if ( usr ) throw new Error( 'Email taken. Try logging in?' ) + + let res = await Users( ).returning( 'id' ).insert( user ) + + let userRole = 'server:user' + + await Acl( ).insert( { userId: res[ 0 ], role: userRole } ) + + return res[ 0 ] +} + +const createData = async ( ) => { + const users = [ + { email: 'asdf@asdf.asdf', password: '12345678', name: 'Asdf Asdf' } , + { email: 'AsDf@asdf.asdf', password: '12345678', name: 'Asdf Asdf' } , + { email: 'fdsa@asdf.asdf', password: '12345678', name: 'Asdf Asdf' } , + { email: 'Fdsa@asdf.asdf', password: '12345678', name: 'Asdf Asdf' } + ] + users.map( async user => { + try { + await createUser( user ) + } catch ( err ) { + console.log( err ) + } + } ) +} + +const getDuplicateUsers = async ( ) => { + let duplicates = await knex.raw( 'select lower(email) as lowered, count(id) as reg_count from users group by lowered having count(id) > 1' ) + return await Promise.all( duplicates.rows.map( async dup => { + let lowerEmail = dup.lowered + + let lowerUser = await userByEmailQuery( lowerEmail ).first( ) + let upperUser = await Users( ).whereRaw( 'lower(email) = lower(?)',[ lowerEmail ] ).whereNot( { id: lowerUser.id } ).first( ) + return { lowerUser,upperUser } + } ) ) +} + +const runMigrations = async ( ) => { + const duplicateUsers = await getDuplicateUsers( ) + await Promise.all( duplicateUsers.map( async userDouble => { + const migrations = createMigrations( userDouble ) + await Promise.all( migrations.map( async migrationStep => await migrationStep ) ) + } ) ) +} + +( async function () { + try { + await createData() + await runMigrations() + } catch ( err ) { + console.log( err ) + } finally { process.exit() } +}() ) From 21a4cfee8782d00a4795fdf5c2bb89e58992e7a0 Mon Sep 17 00:00:00 2001 From: cristi8 Date: Mon, 15 Nov 2021 19:16:32 +0200 Subject: [PATCH 26/75] viewer small fixes --- packages/viewer/src/modules/FilteringManager.js | 11 ++++++++++- packages/viewer/src/modules/SceneObjects.js | 3 +++ packages/viewer/src/modules/Viewer.js | 4 ++-- packages/viewer/src/modules/ViewerObjectLoader.js | 4 ++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/viewer/src/modules/FilteringManager.js b/packages/viewer/src/modules/FilteringManager.js index cadce8633..269917999 100644 --- a/packages/viewer/src/modules/FilteringManager.js +++ b/packages/viewer/src/modules/FilteringManager.js @@ -20,8 +20,10 @@ export default class FilteringManager { transparent: false, clippingPlanes: this.viewer.sectionBox.planes } ) - } + this.colorLegend = {} + } + filterAndColorObject( obj, filter ) { if ( !filter ) return obj.clone() @@ -86,6 +88,9 @@ export default class FilteringManager { color = `hsl(${colorHue}, 50%, 30%)` } + if ( objValue !== undefined && objValue !== null ) + this.colorLegend[ objValue.toString() ] = color + let material = this.ColoredMaterial.clone() material.color = new THREE.Color( color ) return material @@ -142,5 +147,9 @@ export default class FilteringManager { // Can also filter by specific value return objValue === valueFilter } + + initFilterOperation() { + this.colorLegend = {} + } } diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index 34c3c421a..fda27ae6f 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -169,6 +169,7 @@ export default class SceneObjects { this.objectsInScene = this.allObjects } else { // A filter is to be applied + this.filteringManager.initFilterOperation() let newFilteredObjects = new THREE.Group() newFilteredObjects.name = 'FilteredObjects' @@ -204,6 +205,8 @@ export default class SceneObjects { this.appliedFilter = filter this.viewer.needsRender = true + + return { colorLegend: this.filteringManager.colorLegend } } async groupSolidObjects( threejsGroup ) { diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index d76703b56..5b20ca952 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -236,8 +236,8 @@ export default class Viewer extends EventEmitter { return await this.sceneManager.sceneObjects.applyFilter( filter ) } - async getObjectsProperties() { - return await this.sceneManager.sceneObjects.getObjectsProperties() + getObjectsProperties() { + return this.sceneManager.sceneObjects.getObjectsProperties() } dispose() { diff --git a/packages/viewer/src/modules/ViewerObjectLoader.js b/packages/viewer/src/modules/ViewerObjectLoader.js index d7c550ba7..3df1f3ef3 100644 --- a/packages/viewer/src/modules/ViewerObjectLoader.js +++ b/packages/viewer/src/modules/ViewerObjectLoader.js @@ -8,7 +8,7 @@ import Converter from './converter/Converter' export default class ViewerObjectLoader { - constructor( parent, objectUrl, authToken, enableCahcing ) { + constructor( parent, objectUrl, authToken, enableCaching ) { this.objectUrl = objectUrl this.viewer = parent this.token = null @@ -39,7 +39,7 @@ export default class ViewerObjectLoader { token: this.token, streamId: this.streamId, objectId: this.objectId, - options: { enableCahcing: enableCahcing } + options: { enableCaching: enableCaching } } ) this.converter = new Converter( this.loader ) From 5ac2ff3f80ced132a48942f4056681f671345cc3 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Tue, 16 Nov 2021 07:10:12 +0000 Subject: [PATCH 27/75] feat(viewer): clipping planes: impl in filtering materials; hidden in screenshots --- packages/viewer/src/modules/FilteringManager.js | 7 +++++-- packages/viewer/src/modules/InteractionHandler.js | 12 +++++++++++- packages/viewer/src/modules/SectionBox.js | 8 ++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/viewer/src/modules/FilteringManager.js b/packages/viewer/src/modules/FilteringManager.js index 269917999..0c804e145 100644 --- a/packages/viewer/src/modules/FilteringManager.js +++ b/packages/viewer/src/modules/FilteringManager.js @@ -10,9 +10,9 @@ export default class FilteringManager { side: THREE.DoubleSide, transparent: true, opacity: 0.04, - wireframe: true, - clippingPlanes: this.viewer.sectionBox.planes + wireframe: true } ) + // console.log(this.viewer.sectionBox.planes) this.ColoredMaterial = new THREE.MeshStandardMaterial( { color: 0x7080A0, @@ -33,6 +33,7 @@ export default class FilteringManager { let clone = obj.clone() // clone.material = WireframeMaterial clone.material = obj.material.clone() + clone.material.clippingPlanes = null clone.material.transparent = true clone.material.opacity = 0.05 clone.userData = null @@ -45,8 +46,10 @@ export default class FilteringManager { if ( filter.colorBy ) { if ( filter.colorBy.type === 'category' ) { clone.material = this.colorWithCategory( obj.userData, filter.colorBy ) + clone.material.clippingPlanes = this.viewer.sectionBox.planes } else if ( filter.colorBy.type === 'gradient' ) { clone.material = this.colorWithGradient( obj, filter.colorBy ) + clone.material.clippingPlanes = this.viewer.sectionBox.planes } } return clone diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index d4c9e0cef..a01ecdb12 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -165,7 +165,17 @@ export default class InteractionHandler { } screenshot() { - return this.viewer.renderer.domElement.toDataURL( 'image/png' ) + let sectionBoxVisible = this.viewer.sectionBox.display.visible + if( sectionBoxVisible ) { + this.viewer.sectionBox.displayOff() + this.viewer.needsRender = true + this.viewer.render() + } + const screenshot = this.viewer.renderer.domElement.toDataURL( 'image/png' ) + if( sectionBoxVisible ) { + this.viewer.sectionBox.displayOn() + } + return screenshot } /** diff --git a/packages/viewer/src/modules/SectionBox.js b/packages/viewer/src/modules/SectionBox.js index 78c30253f..70dd9a5ab 100644 --- a/packages/viewer/src/modules/SectionBox.js +++ b/packages/viewer/src/modules/SectionBox.js @@ -370,4 +370,12 @@ export default class SectionBox { this.viewer.needsRender = true } + displayOff() { + this.display.visible = false + } + + displayOn() { + this.display.visible = true + } + } From 008bf2cd241e89e3980a2427a19ce5badfe43d13 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Tue, 16 Nov 2021 07:22:55 +0000 Subject: [PATCH 28/75] fix(viewer): converter module path export --- packages/viewer/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/viewer/src/index.js b/packages/viewer/src/index.js index e238d53ee..e29f2d6b5 100644 --- a/packages/viewer/src/index.js +++ b/packages/viewer/src/index.js @@ -1,4 +1,4 @@ import Viewer from './modules/Viewer' -import Converter from './modules/Converter' +import Converter from './modules/converter/Converter' export { Viewer, Converter } From 8d143406306a277c7f199e719021e7cce62f2d48 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Tue, 16 Nov 2021 08:00:16 +0000 Subject: [PATCH 29/75] feat(frontend): prelim viewer implementation --- packages/frontend/src/components/Renderer.vue | 12 ++++++++---- packages/viewer/src/modules/Viewer.js | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/frontend/src/components/Renderer.vue b/packages/frontend/src/components/Renderer.vue index 95b9508a9..c2dcae4ea 100644 --- a/packages/frontend/src/components/Renderer.vue +++ b/packages/frontend/src/components/Renderer.vue @@ -44,7 +44,8 @@ :class="`${fullScreen ? 'fullscreen' : ''} ${darkMode ? 'dark' : ''}`" > -
+ +
@@ -322,13 +323,16 @@ export default { this.$refs.rendererparent.appendChild(renderDomElement) if (!window.__viewer) { - window.__viewer = new Viewer({ container: renderDomElement }) + // let v = new Viewer({ container: renderDomElement, showStats: false }) + // console.log(v) + // window.v = v + window.__viewer = new Viewer({ container: renderDomElement, showStats: false }) } window.__viewer.onWindowResize() if (window.__viewerLastLoadedUrl !== this.objectUrl) { - window.__viewer.sceneManager.removeAllObjects() + window.__viewer.unloadAll() window.__viewerLastLoadedUrl = null this.getPreviewImage().then().catch() } else { @@ -378,7 +382,7 @@ export default { window.__viewer.interactions.setView(id) }, sectionToggle() { - window.__viewer.interactions.toggleSectionBox() + window.__viewer.toggleSectionBox() }, setupEvents() { window.__viewer.on('load-warning', ({ message }) => { diff --git a/packages/viewer/src/modules/Viewer.js b/packages/viewer/src/modules/Viewer.js index 5b20ca952..e4c9475e4 100644 --- a/packages/viewer/src/modules/Viewer.js +++ b/packages/viewer/src/modules/Viewer.js @@ -147,7 +147,8 @@ export default class Viewer extends EventEmitter { this.needsRender = false if ( this.stats ) this.stats.begin() this.render() - document.getElementById( 'info-draws' ).textContent = '' + this.renderer.info.render.calls + if(this.stats && document.getElementById( 'info-draws' )) + document.getElementById( 'info-draws' ).textContent = '' + this.renderer.info.render.calls if ( this.stats ) this.stats.end() } From 0f7ced8c11183e02aa5d363e9be82e330127da5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Tue, 16 Nov 2021 10:59:05 +0100 Subject: [PATCH 30/75] feat(user migration): update with proper stream and server acl, user cleanup --- .../server/scripts/duplicateUserMigration.js | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/packages/server/scripts/duplicateUserMigration.js b/packages/server/scripts/duplicateUserMigration.js index 9901c521b..d3d9b45d1 100644 --- a/packages/server/scripts/duplicateUserMigration.js +++ b/packages/server/scripts/duplicateUserMigration.js @@ -2,6 +2,7 @@ const appRoot = require( 'app-root-path' ) const knex = require( `${appRoot}/db/knex` ) const bcrypt = require( 'bcrypt' ) const crs = require( 'crypto-random-string' ) +const roles = require( `${appRoot}/modules/core/roles.js` ) const Users = ( ) => knex( 'users' ) const Acl = ( ) => knex( 'server_acl' ) @@ -15,10 +16,10 @@ const migrationTargets = [ [ 'file_uploads' , 'userId' ], [ 'personal_api_tokens' , 'userId' ], [ 'refresh_tokens' , 'userId' ], - [ 'server_acl' , 'userId' ], //userId is a PrimaryKey in this table, act accordingly + // [ 'server_acl' , 'userId' ], //userId is a PrimaryKey in this table, act accordingly [ 'server_apps' , 'authorId' ], [ 'server_invites' , 'inviterId' ], - [ 'stream_acl' , 'userId' ],//userId, with resourceId is a PrimaryKey in this table, act accordingly + // [ 'stream_acl' , 'userId' ],//userId, with resourceId is a PrimaryKey in this table, act accordingly [ 'stream_activity' , 'userId' ], ] @@ -32,6 +33,38 @@ const migrateColumnValue = async( tableName, columnName, oldUser, newUser ) => { } } +const serverAclMigration = async ( { lowerUser, upperUser } ) => { + const oldAcl = await knex( 'server_acl' ).where( { userId: upperUser.id } ).first() + // if the old user was admin, make the target admin too + if ( oldAcl.role === 'server:admin' ) await knex( 'server_acl' ).where( { userId: lowerUser.id } ).update( { role: 'server:admin' } ) +} + +const _migrateSingleStreamAccess = async ( { lowerUser, upperUser, upperStreamAcl } ) => { + const upperRole = roles.filter( r => r.name === upperStreamAcl.role )[0] + const lowerAcl = await knex( 'stream_acl' ).where( { userId: lowerUser.id, resourceId: upperStreamAcl.resourceId } ).first() + // see if the lowerUser has access to the stream + if ( lowerAcl ) { + // if the upper user had more access, migrate the lower user up + const lowerRole = roles.filter( r => r.name === lowerAcl.role )[0] + if ( lowerRole.weight < upperRole.weight ) + await knex( 'stream_acl' ) + .where( { userId: lowerUser.id, resourceId: upperStreamAcl.resourceId } ) + .update( { role: upperRole.name } ) + } else { + // if it didn't have access, just add it + let lowerStreamAcl = { ...upperStreamAcl } + lowerStreamAcl.userId = lowerUser.id + await knex( 'stream_acl' ).insert( lowerStreamAcl ) + } +} + +const streamAclMigration = async ( { lowerUser, upperUser } ) => { + const upperAcl = await knex( 'stream_acl' ).where( { userId: upperUser.id } ) + + await Promise.all( upperAcl.map( async upperStreamAcl => await _migrateSingleStreamAccess( { lowerUser, upperUser, upperStreamAcl } ) ) ) +} + + const createMigrations = ( { lowerUser, upperUser } ) => migrationTargets.map( ( [ tableName, columnName ] ) => { migrateColumnValue( tableName, columnName, upperUser,lowerUser ) } ) @@ -41,7 +74,8 @@ const createUser = async user => { user.id = crs( { length: 10 } ) if ( user.password ) { - user.passwordDigest = await bcrypt.hash( user.password, 10 ) + let pwdigest =await bcrypt.hash( user.password, 10 ) + user.passwordDigest = pwdigest } delete user.password @@ -64,13 +98,14 @@ const createData = async ( ) => { { email: 'fdsa@asdf.asdf', password: '12345678', name: 'Asdf Asdf' } , { email: 'Fdsa@asdf.asdf', password: '12345678', name: 'Asdf Asdf' } ] - users.map( async user => { + await Promise.all( users.map( async user => { try { - await createUser( user ) + let userId = await createUser( user ) + console.log( userId ) } catch ( err ) { console.log( err ) } - } ) + } ) ) } const getDuplicateUsers = async ( ) => { @@ -79,6 +114,10 @@ const getDuplicateUsers = async ( ) => { let lowerEmail = dup.lowered let lowerUser = await userByEmailQuery( lowerEmail ).first( ) + // if no user found migrate to a random one? + // TODO: decide 👆 + // my idea, take the first one and run with it + if ( !lowerUser ) lowerUser = await Users( ).whereRaw( 'lower(email) = lower(?)',[ lowerEmail ] ).first() let upperUser = await Users( ).whereRaw( 'lower(email) = lower(?)',[ lowerEmail ] ).whereNot( { id: lowerUser.id } ).first( ) return { lowerUser,upperUser } } ) ) @@ -89,6 +128,11 @@ const runMigrations = async ( ) => { await Promise.all( duplicateUsers.map( async userDouble => { const migrations = createMigrations( userDouble ) await Promise.all( migrations.map( async migrationStep => await migrationStep ) ) + await serverAclMigration( userDouble ) + await streamAclMigration( userDouble ) + + // remove the now defunct user + await Users( ).where( { email: userDouble.upperUser.email } ).delete( ) } ) ) } From 8c580d34a8f9bfc7cdb8290209ead71769b47074 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Tue, 16 Nov 2021 11:47:09 +0000 Subject: [PATCH 31/75] fix(viewer): various fixes with @cristi8 --- packages/viewer/src/assets/example.html | 2 +- .../viewer/src/modules/FilteringManager.js | 4 +- packages/viewer/src/modules/SceneObjects.js | 64 +++++++++++++------ .../viewer/src/modules/SelectionHelper.js | 2 +- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/packages/viewer/src/assets/example.html b/packages/viewer/src/assets/example.html index 21b17f38f..daa287c18 100644 --- a/packages/viewer/src/assets/example.html +++ b/packages/viewer/src/assets/example.html @@ -20,7 +20,7 @@ - +
diff --git a/packages/viewer/src/modules/FilteringManager.js b/packages/viewer/src/modules/FilteringManager.js index 0c804e145..49444ffb6 100644 --- a/packages/viewer/src/modules/FilteringManager.js +++ b/packages/viewer/src/modules/FilteringManager.js @@ -27,6 +27,7 @@ export default class FilteringManager { filterAndColorObject( obj, filter ) { if ( !filter ) return obj.clone() + if ( !this.passesFilter( obj.userData, filter.filterBy ) ) { if ( filter.ghostOthers && obj.type === 'Mesh' ) { @@ -36,12 +37,13 @@ export default class FilteringManager { clone.material.clippingPlanes = null clone.material.transparent = true clone.material.opacity = 0.05 - clone.userData = null + // clone.userData = null return clone } return null } + // TODO: Cristi rezolva jmecheria let clone = obj.clone() if ( filter.colorBy ) { if ( filter.colorBy.type === 'category' ) { diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index fda27ae6f..b6a5faa0f 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -209,36 +209,62 @@ export default class SceneObjects { return { colorLegend: this.filteringManager.colorLegend } } + flattenGroup( group ) { + let acc = [] + for( let child of group.children ) { + if( child instanceof THREE.Group ) { + acc.push( ...this.flattenGroup( child ) ) + + } else { + acc.push( child ) + } + } + for( let element of acc ) { + element.geometry.applyMatrix4( group.matrix ) + } + return acc + } + async groupSolidObjects( threejsGroup ) { let materialIdToBufferGeometry = {} let materialIdToMaterial = {} let materialIdToMeshes = {} - for ( let mesh of threejsGroup.children ) { - let m = mesh.material - let materialId = `${m.type}/${m.vertexColors}/${m.color.toJSON()}/${m.side}/${m.transparent}/${m.opactiy}/${m.emissive}/${m.metalness}/${m.roughness}` - - if ( !( materialId in materialIdToBufferGeometry ) ) { - materialIdToBufferGeometry[ materialId ] = [] - materialIdToMaterial[ materialId ] = m - materialIdToMeshes[ materialId ] = [] + for ( let obj of threejsGroup.children ) { + let meshes = [] + if( obj instanceof THREE.Group ) { + meshes = this.flattenGroup( obj ) + } else { + meshes = [ obj ] } - materialIdToBufferGeometry[ materialId ].push( mesh.geometry ) - materialIdToMeshes[ materialId ].push( mesh ) + for( let mesh of meshes ) { + let m = mesh.material + let materialId = `${m.type}/${m.vertexColors}/${m.color.toJSON()}/${m.side}/${m.transparent}/${m.opactiy}/${m.emissive}/${m.metalness}/${m.roughness}` - // Max 1024 objects per group (mergeBufferGeometries is sync and can freeze for large data) - if ( materialIdToBufferGeometry[ materialId ].length >= 1024 ) { - let archivedMaterialId = `arch//${materialId}//${mesh.id}` - materialIdToBufferGeometry[ archivedMaterialId ] = materialIdToBufferGeometry[ materialId ] - materialIdToMaterial[ archivedMaterialId ] = materialIdToMaterial[ materialId ] - materialIdToMeshes[ archivedMaterialId ] = materialIdToMeshes[ materialId ] - delete materialIdToBufferGeometry[ materialId ] - delete materialIdToMaterial[ materialId ] - delete materialIdToMeshes[ materialId ] + if ( !( materialId in materialIdToBufferGeometry ) ) { + materialIdToBufferGeometry[ materialId ] = [] + materialIdToMaterial[ materialId ] = m + materialIdToMeshes[ materialId ] = [] + } + + materialIdToBufferGeometry[ materialId ].push( mesh.geometry ) + materialIdToMeshes[ materialId ].push( mesh ) + + // Max 1024 objects per group (mergeBufferGeometries is sync and can freeze for large data) + if ( materialIdToBufferGeometry[ materialId ].length >= 1024 ) { + let archivedMaterialId = `arch//${materialId}//${mesh.id}` + materialIdToBufferGeometry[ archivedMaterialId ] = materialIdToBufferGeometry[ materialId ] + materialIdToMaterial[ archivedMaterialId ] = materialIdToMaterial[ materialId ] + materialIdToMeshes[ archivedMaterialId ] = materialIdToMeshes[ materialId ] + delete materialIdToBufferGeometry[ materialId ] + delete materialIdToMaterial[ materialId ] + delete materialIdToMeshes[ materialId ] + } } } + let groupedObjects = new THREE.Group() groupedObjects.name = 'GroupedSolidObjects' diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 3e6ad848f..02275ebbc 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -134,7 +134,7 @@ export default class SelectionHelper extends EventEmitter { if ( this.subset ) { targetObjects = this._getGroupChildren( this.subset ) } else { - targetObjects = this.viewer.sceneManager.filteredObjects.filter( obj => !!obj.userData ) + targetObjects = this.viewer.sceneManager.filteredObjects // .filter( obj => !!obj.userData ) } let intersectedObjects = this.raycaster.intersectObjects( targetObjects ) From c53789fd8968cdda95d8d4234cc76c553281e6e0 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Tue, 16 Nov 2021 18:33:39 +0000 Subject: [PATCH 32/75] feat(viewer): latest changes with @cristi8's help on block selection (still WIP) --- packages/viewer/src/modules/FilteringManager.js | 3 +-- packages/viewer/src/modules/InteractionHandler.js | 14 ++++++++++---- packages/viewer/src/modules/SceneObjectManager.js | 5 +++-- packages/viewer/src/modules/SceneObjects.js | 4 +++- packages/viewer/src/modules/SectionBox.js | 3 ++- packages/viewer/src/modules/SelectionHelper.js | 15 ++++++--------- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/viewer/src/modules/FilteringManager.js b/packages/viewer/src/modules/FilteringManager.js index 49444ffb6..25ff56b4d 100644 --- a/packages/viewer/src/modules/FilteringManager.js +++ b/packages/viewer/src/modules/FilteringManager.js @@ -32,12 +32,11 @@ export default class FilteringManager { { if ( filter.ghostOthers && obj.type === 'Mesh' ) { let clone = obj.clone() - // clone.material = WireframeMaterial clone.material = obj.material.clone() clone.material.clippingPlanes = null clone.material.transparent = true clone.material.opacity = 0.05 - // clone.userData = null + clone.userData = { hidden: true } return clone } return null diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index a01ecdb12..0507b5d72 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -6,10 +6,11 @@ export default class InteractionHandler { constructor( viewer ) { this.viewer = viewer this.preventSelection = false - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.viewer.sceneManager.userObjects, sectionBox: this.sectionBox } ) + + this.selectionHelper = new SelectionHelper( this.viewer, { sectionBox: this.sectionBox, hover: false } ) this.selectionMeshMaterial = new THREE.MeshLambertMaterial( { color: 0x0B55D2, emissive: 0x0B55D2, side: THREE.DoubleSide } ) this.selectionMeshMaterial.clippingPlanes = this.viewer.sectionBox.planes - + // console.log(this.viewer.sceneManager.allObjects) this.selectionLineMaterial = new THREE.LineBasicMaterial( { color: 0x0B55D2 } ) this.selectionLineMaterial.clippingPlanes = this.viewer.sectionBox.planes @@ -46,9 +47,8 @@ export default class InteractionHandler { } _handleSelect( objs ) { - console.log( this.viewer.cameraHandler.orbiting ) if( this.viewer.cameraHandler.orbiting ) return - if ( this.preventSelection ) return + if( this.preventSelection ) return if ( objs.length === 0 ) { this.deselectObjects() @@ -92,6 +92,12 @@ export default class InteractionHandler { this.viewer.emit( 'select', this.selectedObjectsUserData ) } + getParentBlock( block ) { + if( block.parent instanceof THREE.Group && block.parent?.userData?.speckle_type?.toLowerCase().includes( 'blockinstance' ) ) + return this.getParentBlock( block.parent ) + else return block + } + deselectObjects() { this.selectedObjects.clear() this.selectedObjectsUserData = [] diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 0a494379d..0efc0a184 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -62,11 +62,11 @@ export default class SceneObjectManager { get filteredObjects() { let ret = [] for ( let objectGroup of this.sceneObjects.objectsInScene.children ) { - if ( objectGroup.name === 'GroupedObjects' ) + if ( objectGroup.name === 'GroupedSolidObjects' ) continue ret.push( ...objectGroup.children ) } - return ret + return ret.filter( obj => !obj.userData.hidden ) } get materials() { @@ -237,6 +237,7 @@ export default class SceneObjectManager { group.applyMatrix4( wrapper.extras.scaleMatrix ) // this.objectIds.push() this.sceneObjects.allSolidObjects.add( group ) + console.log( group ) } return group diff --git a/packages/viewer/src/modules/SceneObjects.js b/packages/viewer/src/modules/SceneObjects.js index b6a5faa0f..0fae0ab13 100644 --- a/packages/viewer/src/modules/SceneObjects.js +++ b/packages/viewer/src/modules/SceneObjects.js @@ -216,10 +216,11 @@ export default class SceneObjects { acc.push( ...this.flattenGroup( child ) ) } else { - acc.push( child ) + acc.push( child.clone() ) } } for( let element of acc ) { + element.geometry = element.geometry.clone() element.geometry.applyMatrix4( group.matrix ) } return acc @@ -234,6 +235,7 @@ export default class SceneObjects { let meshes = [] if( obj instanceof THREE.Group ) { meshes = this.flattenGroup( obj ) + } else { meshes = [ obj ] } diff --git a/packages/viewer/src/modules/SectionBox.js b/packages/viewer/src/modules/SectionBox.js index 70dd9a5ab..7740431c4 100644 --- a/packages/viewer/src/modules/SectionBox.js +++ b/packages/viewer/src/modules/SectionBox.js @@ -12,6 +12,7 @@ export default class SectionBox { this.dragging = false this.display = new THREE.Group() + this.display.name = 'SectionBox' this.viewer.scene.add( this.display ) // box @@ -62,7 +63,7 @@ export default class SectionBox { this.prevPosition = null this.attachedToBox = true - this.selectionHelper = new SelectionHelper( this.viewer, { subset: this.cube, hover: true, checkForSectionBoxInclusion: false } ) + this.selectionHelper = new SelectionHelper( this.viewer, { subset: [ this.cube ], hover: false, checkForSectionBoxInclusion: false } ) this.selectionHelper.on( 'object-clicked', this._clickHandler.bind( this ) ) this.selectionHelper.on( 'hovered', ( objs ) =>{ // TODO: cannot get this to work reliably diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 02275ebbc..9dab6fea2 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -31,7 +31,6 @@ export default class SelectionHelper extends EventEmitter { // doesn't feel good when debounced, might be necessary tho this.viewer.renderer.domElement.addEventListener( 'pointermove', debounce( ( e ) => { let hovered = this.getClickedObjects( e ) - // dragging event, this shouldn't be under the "hover option" if ( this.pointerDown ) { this.emit( 'object-drag', hovered, this._getNormalisedClickPosition( e ) ) @@ -129,15 +128,13 @@ export default class SelectionHelper extends EventEmitter { getClickedObjects( e ) { const normalizedPosition = this._getNormalisedClickPosition( e ) this.raycaster.setFromCamera( normalizedPosition, this.viewer.cameraHandler.activeCam.camera ) - - let targetObjects - if ( this.subset ) { - targetObjects = this._getGroupChildren( this.subset ) - } else { - targetObjects = this.viewer.sceneManager.filteredObjects // .filter( obj => !!obj.userData ) - } + let targetObjects = this.subset ? this.subset : this.viewer.sceneManager.filteredObjects + + console.log(this.name, targetObjects) + let intersectedObjects = this.raycaster.intersectObjects( targetObjects ) - + + console.log( this.name, intersectedObjects ) // filters objects in section box mode if ( this.viewer.sectionBox.display.visible && this.checkForSectionBoxInclusion ) { let box = new THREE.Box3().setFromObject( this.viewer.sectionBox.cube ) From aa493632bcfeca401383df2e7097090a49209f23 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Tue, 16 Nov 2021 20:14:44 +0000 Subject: [PATCH 33/75] feat(viewer): handles block selection correctly --- .../viewer/src/modules/InteractionHandler.js | 56 +++++++++++++------ .../viewer/src/modules/SelectionHelper.js | 3 - 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/packages/viewer/src/modules/InteractionHandler.js b/packages/viewer/src/modules/InteractionHandler.js index 0507b5d72..686881c00 100644 --- a/packages/viewer/src/modules/InteractionHandler.js +++ b/packages/viewer/src/modules/InteractionHandler.js @@ -58,34 +58,41 @@ export default class InteractionHandler { if ( !this.selectionHelper.multiSelect ) this.deselectObjects() let selType = objs[0].object.type - + let rootBlock = null if ( objs[0].object.parent?.userData?.speckle_type?.toLowerCase().includes( 'blockinstance' ) ) { selType = 'Block' + rootBlock = this.getParentBlock( objs[0].object.parent ) } switch ( selType ) { - case 'Block': - // TODO: maybe just leave the bounding box for now - break - case 'Mesh': - this.selectedObjects.add( new THREE.Mesh( objs[0].object.geometry, this.selectionMeshMaterial ) ) - break - case 'Line': - this.selectedObjects.add( new THREE.Line( objs[0].object.geometry, this.selectionMeshMaterial ) ) - break - case 'Point': - console.warn( 'Point selection not implemented.' ) - return // exit the whole func here, points cause all sorts of trouble when being selected (ie, bbox stuff) + case 'Block': { + let blockObjs = this.getBlockObjectsCloned( rootBlock ) + for( let child of blockObjs ) { + child.material = this.selectionMeshMaterial + this.selectedObjects.add( child ) + } + break + } + case 'Mesh': + this.selectedObjects.add( new THREE.Mesh( objs[0].object.geometry, this.selectionMeshMaterial ) ) + break + case 'Line': + this.selectedObjects.add( new THREE.Line( objs[0].object.geometry, this.selectionMeshMaterial ) ) + break + case 'Point': + console.warn( 'Point selection not implemented.' ) + return // exit the whole func here, points cause all sorts of trouble when being selected (ie, bbox stuff) } - this.selectedObjectsUserData.push( objs[0].object.userData ) - let box if ( selType === 'Block' ) { - box = new THREE.BoxHelper( objs[0].object.parent, 0x23F3BD ) + this.selectedObjectsUserData.push( rootBlock.userData ) + box = new THREE.BoxHelper( rootBlock, 0x23F3BD ) } else { + this.selectedObjectsUserData.push( objs[0].object.userData ) box = new THREE.BoxHelper( objs[0].object, 0x23F3BD ) } + box.material = this.selectionEdgesMaterial this.selectedObjects.add( box ) this.viewer.needsRender = true @@ -93,11 +100,26 @@ export default class InteractionHandler { } getParentBlock( block ) { - if( block.parent instanceof THREE.Group && block.parent?.userData?.speckle_type?.toLowerCase().includes( 'blockinstance' ) ) + if( block.parent?.userData?.speckle_type?.toLowerCase().includes( 'blockinstance' ) ) { return this.getParentBlock( block.parent ) + } else return block } + getBlockObjectsCloned( block, objects = [] ) { + for( let child of block.children ) { + if( child instanceof THREE.Group ) { + objects.push( ...this.getBlockObjectsCloned( child ) ) + } else { + objects.push( child.clone() ) + } + } + for( let child of objects ) { + child.geometry = child.geometry.clone().applyMatrix4( block.matrix ) + } + return objects + } + deselectObjects() { this.selectedObjects.clear() this.selectedObjectsUserData = [] diff --git a/packages/viewer/src/modules/SelectionHelper.js b/packages/viewer/src/modules/SelectionHelper.js index 9dab6fea2..463724629 100644 --- a/packages/viewer/src/modules/SelectionHelper.js +++ b/packages/viewer/src/modules/SelectionHelper.js @@ -130,11 +130,8 @@ export default class SelectionHelper extends EventEmitter { this.raycaster.setFromCamera( normalizedPosition, this.viewer.cameraHandler.activeCam.camera ) let targetObjects = this.subset ? this.subset : this.viewer.sceneManager.filteredObjects - console.log(this.name, targetObjects) - let intersectedObjects = this.raycaster.intersectObjects( targetObjects ) - console.log( this.name, intersectedObjects ) // filters objects in section box mode if ( this.viewer.sectionBox.display.visible && this.checkForSectionBoxInclusion ) { let box = new THREE.Box3().setFromObject( this.viewer.sectionBox.cube ) From 3ffc156b79fb2cb5c90f73272445cb50fe8bd594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Wed, 17 Nov 2021 13:22:50 +0100 Subject: [PATCH 34/75] fix(server local auth): user is created before the invite is used, so stream permissions can be set fix #470 --- .../server/modules/auth/strategies/local.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/server/modules/auth/strategies/local.js b/packages/server/modules/auth/strategies/local.js index 27fcd093e..0d75d19d7 100644 --- a/packages/server/modules/auth/strategies/local.js +++ b/packages/server/modules/auth/strategies/local.js @@ -44,19 +44,21 @@ module.exports = async ( app, session, sessionAppId, finalizeAuth ) => { let user = req.body - if ( serverInfo.inviteOnly && !req.session.inviteId ) { - throw new Error( 'This server is invite only. Please provide an invite id.' ) - } - - if ( req.session.inviteId ) { - const valid = await validateInvite( { id: req.session.inviteId, email: user.email } ) - if ( !valid ) + let userId + // go ahead with register + if ( !serverInfo.inviteOnly ){ + userId = await createUser( user ) + } else { + if ( !req.session.inviteId ) + throw new Error( 'This server is invite only. Please provide an invite id.' ) + + if ( !await validateInvite( { id: req.session.inviteId, email: user.email } ) ) throw new Error( 'Invite email mismatch. Please use the original email the invite was sent to register.' ) + userId = await createUser( user ) await useInvite( { id: req.session.inviteId, email: user.email } ) } - let userId = await createUser( user ) req.user = { id: userId, email: user.email } return next( ) From 6e24debfd0c956085ba8bfdc326c20aa0645f605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Wed, 17 Nov 2021 13:23:56 +0100 Subject: [PATCH 35/75] feat(frontend): add WIP stream admin page --- packages/frontend/src/router/index.js | 10 +- packages/frontend/src/views/admin/Admin.vue | 11 ++ .../frontend/src/views/admin/AdminStreams.vue | 131 ++++++++++++++++-- 3 files changed, 138 insertions(+), 14 deletions(-) diff --git a/packages/frontend/src/router/index.js b/packages/frontend/src/router/index.js index 74c29d49a..baaab09c8 100644 --- a/packages/frontend/src/router/index.js +++ b/packages/frontend/src/router/index.js @@ -226,11 +226,11 @@ const routes = [ component: () => import('@/views/admin/AdminUsers.vue'), props: (route) => ({ ...route.query, ...route.props }) }, - // { - // name: 'Admin | Streams', - // path: 'streams', - // component: () => import('@/views/admin/AdminStreams.vue') - // }, + { + name: 'Admin | Streams', + path: 'streams', + component: () => import('@/views/admin/AdminStreams.vue') + }, { name: 'Admin | Settings', path: 'settings', diff --git a/packages/frontend/src/views/admin/Admin.vue b/packages/frontend/src/views/admin/Admin.vue index 2d992fd5c..15c86523a 100644 --- a/packages/frontend/src/views/admin/Admin.vue +++ b/packages/frontend/src/views/admin/Admin.vue @@ -49,6 +49,7 @@ Edit server user details. + mdi-account-multiple-plus-outline @@ -58,6 +59,16 @@ Manage server invitations. + + + + mdi-blur + + + Streams + Manage streams. + + diff --git a/packages/frontend/src/views/admin/AdminStreams.vue b/packages/frontend/src/views/admin/AdminStreams.vue index 305b2676a..94f08d42c 100644 --- a/packages/frontend/src/views/admin/AdminStreams.vue +++ b/packages/frontend/src/views/admin/AdminStreams.vue @@ -1,15 +1,128 @@ -