diff --git a/.eslintrc.js b/.eslintrc.js index e13cf7864b..7f2ba0089d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -26,6 +26,10 @@ module.exports = { // see https://github.com/nodesecurity/eslint-plugin-security/issues/21 "security/detect-object-injection": "off", "@typescript-eslint/no-var-requires": "error", + // Use typescript-eslint’s version of the no-redeclare rule, which isn’t triggered by overload signatures. + // TODO remove this once we start using the full @typescript-eslint/recommended ruleset in #958 + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', }, overrides: [ { diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 8247cb59b4..675343c945 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -21,6 +21,5 @@ jobs: - run: npm ci - run: npm run lint - run: npm run format:check - - run: npm run check-closure-compiler - run: npx tsc --noEmit ably.d.ts build/ably-webworker.min.d.ts - run: npm audit --production diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4dce45af00..81ac97069e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,9 +8,8 @@ 4. Commit your changes (`git commit -am 'Add some feature'`) 5. Ensure you have added suitable tests and the test suite is passing(`npm test`) 6. Ensure the [type definitions](https://github.com/ably/ably-js/blob/main/ably.d.ts) have been updated if the public API has changed -7. Ensure you stick to the version of JS used by the library (currently ES5). (The minfication task (`npm run grunt -- closureCompiler:ably.js`) will enforce that you stick to ES5 syntax, but will not enforce that you don't use, for example, new methods) -8. Push the branch (`git push origin my-new-feature`) -9. Create a new Pull Request +7. Push the branch (`git push origin my-new-feature`) +8. Create a new Pull Request ## Release Process diff --git a/Gruntfile.js b/Gruntfile.js index ac233ce0b2..ca1f636f9a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -3,10 +3,12 @@ var fs = require('fs'); var path = require('path'); var webpackConfig = require('./webpack.config'); +var esbuild = require('esbuild'); +var umdWrapper = require('esbuild-plugin-umd-wrapper'); +var banner = require('./src/fragments/license'); module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-closure-tools'); grunt.loadNpmTasks('grunt-bump'); grunt.loadNpmTasks('grunt-webpack'); @@ -16,8 +18,6 @@ module.exports = function (grunt) { fragments: 'src/platform/web/fragments', static: 'build', dest: 'build', - crypto_js: 'node_modules/crypto-js/src', - tools_compiler: __dirname + '/node_modules/google-closure-compiler/compiler.jar', }; function compilerSpec(src, dest) { @@ -52,24 +52,6 @@ module.exports = function (grunt) { }, }; - gruntConfig['closureCompiler'] = { - options: { - compilerFile: dirs.tools_compiler, - compilerOpts: { - compilation_level: 'SIMPLE_OPTIMIZATIONS', - /* By default, the compiler assumes you're using es6 and transpiles to - * es5, adding various (unnecessary and undesired) polyfills. Specify - * both in and out to es5 to avoid transpilation */ - language_in: 'ECMASCRIPT5', - language_out: 'ECMASCRIPT5', - strict_mode_input: true, - checks_only: true, - warning_level: 'QUIET', - }, - }, - 'ably.js': compilerSpec('<%= dirs.static %>/ably.js'), - }; - gruntConfig.bump = { options: { files: ['package.json', 'README.md'], @@ -107,15 +89,52 @@ module.exports = function (grunt) { }); }); - grunt.registerTask('build', ['checkGitSubmodules', 'webpack:all']); + grunt.registerTask('build', ['checkGitSubmodules', 'webpack:all', 'build:browser']); grunt.registerTask('build:node', ['checkGitSubmodules', 'webpack:node']); grunt.registerTask('build:browser', ['checkGitSubmodules', 'webpack:browser']); - grunt.registerTask('check-closure-compiler', ['build', 'closureCompiler:ably.js']); + grunt.registerTask('all', ['build', 'requirejs']); + + grunt.registerTask('build:browser', function () { + var done = this.async(); + + var baseConfig = { + entryPoints: ['src/platform/web/index.ts'], + outfile: 'build/ably.js', + bundle: true, + sourcemap: true, + format: 'umd', + banner: { js: '/*' + banner + '*/' }, + plugins: [umdWrapper.default()], + target: 'es6', + }; - grunt.registerTask('all', ['build', 'check-closure-compiler', 'requirejs']); + Promise.all([ + esbuild.build(baseConfig), + esbuild.build({ + ...baseConfig, + outfile: 'build/ably.min.js', + minify: true, + }), + esbuild.build({ + ...baseConfig, + entryPoints: ['src/platform/web-noencryption/index.ts'], + outfile: 'build/ably.noencryption.js', + }), + + esbuild.build({ + ...baseConfig, + entryPoints: ['src/platform/web-noencryption/index.ts'], + outfile: 'build/ably.noencryption.min.js', + minify: true, + }), + ]).then(() => { + console.log('esbuild succeeded'); + done(true); + }); + }); grunt.loadTasks('test/tasks'); diff --git a/README.md b/README.md index b9fb92c9f7..f8d4607101 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ We regression-test the library against a selection of those (which will change o However, we aim to be compatible with a much wider set of platforms and browsers than we can possibly test on. That means we'll happily support (and investigate reported problems with) any reasonably-widely-used browser. So if you find any compatibility issues, please do [raise an issue](https://github.com/ably/ably-js/issues) in this repository or [contact Ably customer support](https://support.ably.com) for advice. -Ably-js has fallback mechanisms in order to be able to support older browsers; specifically it supports comet-based connections for browsers that do not support websockets, and this includes JSONP for browsers that do not support cross-origin XHR. Each of these fallback transport mechanisms is supported and tested on all the browsers we test against, even when those browsers do not themselves require those fallbacks. These mean that the library should be compatible with nearly any browser on most platforms. +Ably-js has fallback mechanisms in order to be able to support older browsers; specifically it supports comet-based connections for browsers that do not support websockets. Each of these fallback transport mechanisms is supported and tested on all the browsers we test against, even when those browsers do not themselves require those fallbacks. These mean that the library should be compatible with nearly any browser on most platforms. Known browser incompatibilities will be documented as an issue in this repository using the ["compatibility" label](https://github.com/ably/ably-js/issues?q=is%3Aissue+is%3Aopen+label%3A%22compatibility%22). For complete API documentation, see the [Ably documentation](https://www.ably.com/docs). @@ -55,8 +55,6 @@ and require as: var Ably = require('ably'); ``` -For the version of the library where async methods return promises, use `var Ably = require('ably/promises');` instead. For the explicitly-callback-based variant use `require('ably/callbacks')`– see [Async API style](#async-api-style). - For usage, jump to [Using the Realtime API](#using-the-realtime-api) or [Using the REST API](#using-the-rest-api). #### Serverside usage with webpack @@ -81,7 +79,7 @@ For usage, jump to [Using the Realtime API](#using-the-realtime-api) or [Using t WebPack will search your `node_modules` folder by default, so if you include `ably` in your `package.json` file, when running Webpack the following will allow you to `require('ably')` (or if using typescript or ES6 modules, `import * as Ably from 'ably';`). If your webpack target is set to 'browser', this will automatically use the browser commonjs distribution. -If that doesn't work for some reason (e.g. you are using a custom webpack target), you can reference the `ably-commonjs.js` static file directly: `require('ably/build/ably-commonjs.js');` (or `import * as Ably from 'ably/build/ably-commonjs.js'` for typescript / ES6 modules). +If that doesn't work for some reason (e.g. you are using a custom webpack target), you can reference the `ably.js` static file directly: `require('ably/build/ably.js');` (or `import * as Ably from 'ably/build/ably.js'` for typescript / ES6 modules). ### TypeScript @@ -95,21 +93,11 @@ let client = new Ably.Realtime(options); /* inferred type Ably.Realtime */ let channel = client.channels.get('feed'); /* inferred type Ably.Types.RealtimeChannel */ ``` -For the version of the library where async methods return promises, use `import * as Ably from 'ably/promises';` instead. For the explicitly-callback-based variant use `import * as Ably from 'ably/callbacks'` – see [Async API style](#async-api-style). - Intellisense in IDEs with TypeScript support is supported: ![TypeScript suggestions](./resources/typescript-demo.gif) -If you need to explicitly import the type definitions, see [ably.d.ts](./ably.d.ts) (or `promises.d.ts` if you're requiring the library as `ably/promises`). - -## Async API style - -This library exposes two API variants. Firstly, the original (and presently the default) callback-based API, which follows the usual Node.js error-first callback style. Second, a promises-based API. With the promises variant, you can still pass a callback to methods and the callback will work as expected, but if you do not pass a callback, the method will return a promise. The API in use can be selected explicitly by requiring that specific variant when requiring/importing the library (or in the case of the browser version, when instantiating it). The usage instructions below make reference to both variants. - -For this library version, and for all future 1.x versions, the callback-based API will be the default. This means that the promises-based variant will need to be explicitly selected, to avoid breaking backwards compatibility. A move to the promises-based variant as the default is likely at the next major release (i.e. 2.x onwards). - -For usage, jump to [Using the async API style](#using-the-async-api-style). +If you need to explicitly import the type definitions, see [ably.d.ts](./ably.d.ts). ## NativeScript @@ -131,13 +119,6 @@ var client = new Ably.Realtime(key: string); // which must contain at least one auth option, i.e. at least // one of: key, token, tokenDetails, authUrl, or authCallback var client = new Ably.Realtime(options: ClientOptions); - -// For a version of the library where async methods return promises if -// you don't pass a callback: -var client = new Ably.Realtime.Promise(options: string | ClientOptions); - -// For the explicitly-callback-based variant (see 'Async API style' below): -var client = new Ably.Rest.Callbacks(options: string | ClientOptions); ``` ### Connection @@ -198,36 +179,26 @@ If you would like to inspect the `Message` instances in order to identify whethe ```javascript // Publish a single message with name and data -channel.publish('greeting', 'Hello World!'); - -// Optionally, you can use a callback to be notified of success or failure -channel.publish('greeting', 'Hello World!', function(err) { - if(err) { - console.log('publish failed with error ' + err); - } else { - console.log('publish succeeded'); - } -}) +await channel.publish('greeting', 'Hello World!'); // Publish several messages at once -channel.publish([{name: 'greeting', data: 'Hello World!'}, ...], callback); +await channel.publish([{name: 'greeting', data: 'Hello World!'}, ...]); ``` ### Querying the History ```javascript -channel.history(function(err, messagesPage) { - messagesPage // PaginatedResult - messagesPage.items // array of Message - messagesPage.items[0].data // payload for first message - messagesPage.items.length // number of messages in the current page of history - messagesPage.hasNext() // true if there are further pages - messagesPage.isLast() // true if this page is the last page - messagesPage.next(function(nextPage) { ... }); // retrieves the next page as PaginatedResult -}); +const messagesPage = channel.history() +messagesPage // PaginatedResult +messagesPage.items // array of Message +messagesPage.items[0].data // payload for first message +messagesPage.items.length // number of messages in the current page of history +messagesPage.hasNext() // true if there are further pages +messagesPage.isLast() // true if this page is the last page +const nextPage = await messagesPage.next(); // retrieves the next page as PaginatedResult // Can optionally take an options param, see https://www.ably.com/docs/rest-api/#message-history -channel.history({start: ..., end: ..., limit: ..., direction: ...}, function(err, messagesPage) { ...}); +const messagesPage = await channel.history({start: ..., end: ..., limit: ..., direction: ...}); ``` ### Presence on a channel @@ -235,9 +206,8 @@ channel.history({start: ..., end: ..., limit: ..., direction: ...}, function(err Getting presence: ```javascript -channel.presence.get(function (err, presenceSet) { - presenceSet; // array of PresenceMessages -}); +const presenceSet = channel.presence.get(); +presenceSet; // array of PresenceMessages ``` Note that presence#get on a realtime channel does not return a @@ -246,17 +216,14 @@ PaginatedResult, as the library maintains a local copy of the presence set. Entering (and leaving) the presence set: ```javascript -channel.presence.enter('my status', function (err) { - // now I am entered -}); +await channel.presence.enter('my status'); +// now I am entered -channel.presence.update('new status', function (err) { - // my presence data is updated -}); +await channel.presence.update('new status'); +// my presence data is updated -channel.presence.leave(function (err) { - // I've left the presence set -}); +await channel.presence.leave() +// I've left the presence set ``` If you are using a client which is allowed to use any clientId -- @@ -266,24 +233,23 @@ https://www.ably.com/docs/general/authentication for more information), you can use ```javascript -channel.presence.enterClient('myClientId', 'status', function(err) { ... }); +await channel.presence.enterClient('myClientId', 'status'); // and similarly, updateClient and leaveClient ``` ### Querying the Presence History ```javascript -channel.presence.history(function(err, messagesPage) { // PaginatedResult - messagesPage.items // array of PresenceMessage - messagesPage.items[0].data // payload for first message - messagesPage.items.length // number of messages in the current page of history - messagesPage.hasNext() // true if there are further pages - messagesPage.isLast() // true if this page is the last page - messagesPage.next(function(nextPage) { ... }); // retrieves the next page as PaginatedResult -}); +const messagesPage = channel.presence.history(); // PaginatedResult +messagesPage.items // array of PresenceMessage +messagesPage.items[0].data // payload for first message +messagesPage.items.length // number of messages in the current page of history +messagesPage.hasNext() // true if there are further pages +messagesPage.isLast() // true if this page is the last page +const nextPage = await messagesPage.next(); // retrieves the next page as PaginatedResult // Can optionally take an options param, see https://www.ably.com/docs/rest-api/#message-history -channel.presence.history({start: ..., end: ..., limit: ..., direction: ...}, function(err, messagesPage) { ...}); +const messagesPage = await channel.presence.history({start: ..., end: ..., limit: ..., direction: ...); ``` ### Symmetrical end-to-end encrypted payloads on a channel @@ -293,24 +259,22 @@ When a 128 bit or 256 bit key is provided to the library, the `data` attributes ```javascript // Generate a random 256-bit key for demonstration purposes (in // practice you need to create one and distribute it to clients yourselves) -Ably.Realtime.Crypto.generateRandomKey(function (err, key) { - var channel = client.channels.get('channelName', { cipher: { key: key } }); +const key = await Ably.Realtime.Crypto.generateRandomKey(); +var channel = client.channels.get('channelName', { cipher: { key: key } }); - channel.subscribe(function (message) { - message.name; // 'name is not encrypted' - message.data; // 'sensitive data is encrypted' - }); - - channel.publish('name is not encrypted', 'sensitive data is encrypted'); +channel.subscribe(function (message) { + message.name; // 'name is not encrypted' + message.data; // 'sensitive data is encrypted' }); + +channel.publish('name is not encrypted', 'sensitive data is encrypted'); ``` -You can also change the key on an existing channel using setOptions (which takes a callback which is called after the new encryption settings have taken effect): +You can also change the key on an existing channel using setOptions (which completes after the new encryption settings have taken effect): ```javascript -channel.setOptions({cipher: {key: }}, function() { - // New encryption settings are in effect -}) +await channel.setOptions({cipher: {key: }}); +// New encryption settings are in effect ``` ### Message interactions @@ -343,13 +307,6 @@ var client = new Ably.Rest(key: string); // which must contain at least one auth option, i.e. at least // one of: key, token, tokenDetails, authUrl, or authCallback var client = new Ably.Rest(options: ClientOptions); - -// For a version of the library where async methods return promises if -// you don't pass a callback: -var client = new Ably.Rest.Promise(options: string | ClientOptions); - -// For the explicitly-callback-based variant (see 'Async API style' above): -var client = new Ably.Rest.Callbacks(options: string | ClientOptions); ``` Given: @@ -362,75 +319,67 @@ var channel = client.channels.get('test'); ```javascript // Publish a single message with name and data -channel.publish('greeting', 'Hello World!'); - -// Optionally, you can use a callback to be notified of success or failure -channel.publish('greeting', 'Hello World!', function(err) { - if(err) { - console.log('publish failed with error ' + err); - } else { - console.log('publish succeeded'); - } -}) +try { + channel.publish('greeting', 'Hello World!'); + console.log('publish succeeded'); +} catch (err) { + console.log('publish failed with error ' + err); +} // Publish several messages at once -channel.publish([{name: 'greeting', data: 'Hello World!'}, ...], callback); +await channel.publish([{name: 'greeting', data: 'Hello World!'}, ...]); ``` ### Querying the History ```javascript -channel.history(function(err, messagesPage) { - messagesPage // PaginatedResult - messagesPage.items // array of Message - messagesPage.items[0].data // payload for first message - messagesPage.items.length // number of messages in the current page of history - messagesPage.hasNext() // true if there are further pages - messagesPage.isLast() // true if this page is the last page - messagesPage.next(function(nextPage) { ... }); // retrieves the next page as PaginatedResult -}); +const messagesPage = await channel.history(); +messagesPage // PaginatedResult +messagesPage.items // array of Message +messagesPage.items[0].data // payload for first message +messagesPage.items.length // number of messages in the current page of history +messagesPage.hasNext() // true if there are further pages +messagesPage.isLast() // true if this page is the last page +const nextPage = await messagesPage.next(); // retrieves the next page as PaginatedResult // Can optionally take an options param, see https://www.ably.com/docs/rest-api/#message-history -channel.history({start: ..., end: ..., limit: ..., direction: ...}, function(err, messagesPage) { ...}); +await channel.history({start: ..., end: ..., limit: ..., direction: ...}); ``` ### Presence on a channel ```javascript -channel.presence.get(function(err, presencePage) { // PaginatedResult - presencePage.items // array of PresenceMessage - presencePage.items[0].data // payload for first message - presencePage.items.length // number of messages in the current page of members - presencePage.hasNext() // true if there are further pages - presencePage.isLast() // true if this page is the last page - presencePage.next(function(nextPage) { ... }); // retrieves the next page as PaginatedResult -}); +const presencePage = await channel.presence.get() // PaginatedResult +presencePage.items // array of PresenceMessage +presencePage.items[0].data // payload for first message +presencePage.items.length // number of messages in the current page of members +presencePage.hasNext() // true if there are further pages +presencePage.isLast() // true if this page is the last page +const nextPage = await presencePage.next(); // retrieves the next page as PaginatedResult ``` ### Querying the Presence History ```javascript -channel.presence.history(function(err, messagesPage) { // PaginatedResult - messagesPage.items // array of PresenceMessage - messagesPage.items[0].data // payload for first message - messagesPage.items.length // number of messages in the current page of history - messagesPage.hasNext() // true if there are further pages - messagesPage.isLast() // true if this page is the last page - messagesPage.next(function(nextPage) { ... }); // retrieves the next page as PaginatedResult -}); +const messagesPage = channel.presence.history(); // PaginatedResult +messagesPage.items // array of PresenceMessage +messagesPage.items[0].data // payload for first message +messagesPage.items.length // number of messages in the current page of history +messagesPage.hasNext() // true if there are further pages +messagesPage.isLast() // true if this page is the last page +const nextPage = await messagesPage.next(); // retrieves the next page as PaginatedResult // Can optionally take an options param, see https://www.ably.com/docs/rest-api/#message-history -channel.history({start: ..., end: ..., limit: ..., direction: ...}, function(err, messagesPage) { ...}); +const messagesPage = channel.history({start: ..., end: ..., limit: ..., direction: ...}); ``` ### Getting the status of a channel ```javascript -channel.status(function(err, channelDetails) { - channelDetails.channelId // The name of the channel - channelDetails.status.isActive // A boolean indicating whether the channel is active - channelDetails.status.occupancy // Contains metadata relating to the occupants of the channel -}); +const channelDetails = await channel.status(); +channelDetails.channelId // The name of the channel +channelDetails.status.isActive // A boolean indicating whether the channel is active +channelDetails.status.occupancy // Contains metadata relating to the occupants of the channel ``` ### Generate Token and Token Request @@ -441,134 +390,49 @@ explanation of Ably's authentication mechanism. Requesting a token: ```javascript -client.auth.requestToken(function(err, tokenDetails) { - // tokenDetails is instance of TokenDetails - // see https://www.ably.com/docs/rest/authentication/#token-details for its properties +const tokenDetails = await client.auth.requestToken(); +// tokenDetails is instance of TokenDetails +// see https://www.ably.com/docs/rest/authentication/#token-details for its properties - // Now we have the token, we can send it to someone who can instantiate a client with it: - var clientUsingToken = new Ably.Realtime(tokenDetails.token); -}); +// Now we have the token, we can send it to someone who can instantiate a client with it: +var clientUsingToken = new Ably.Realtime(tokenDetails.token); // requestToken can take two optional params // tokenParams: https://www.ably.com/docs/rest/authentication/#token-params // authOptions: https://www.ably.com/docs/rest/authentication/#auth-options -client.auth.requestToken(tokenParams, authOptions, function(err, tokenDetails) { ... }); +const tokenDetails = await client.auth.requestToken(tokenParams, authOptions); ``` Creating a token request (for example, on a server in response to a request by a client using the `authCallback` or `authUrl` mechanisms): ```javascript -client.auth.createTokenRequest(function(err, tokenRequest) { - // now send the tokenRequest back to the client, which will - // use it to request a token and connect to Ably -}); +const tokenRequest = await client.auth.createTokenRequest(); +// now send the tokenRequest back to the client, which will +// use it to request a token and connect to Ably // createTokenRequest can take two optional params // tokenParams: https://www.ably.com/docs/rest/authentication/#token-params // authOptions: https://www.ably.com/docs/rest/authentication/#auth-options -client.auth.createTokenRequest(tokenParams, authOptions, function(err, tokenRequest) { ... }); +const tokenRequest = await client.auth.createTokenRequest(tokenParams, authOptions); ``` ### Fetching your application's stats ```javascript -client.stats(function(err, statsPage) { // statsPage as PaginatedResult - statsPage.items // array of Stats - statsPage.items[0].inbound.rest.messages.count; // total messages published over REST - statsPage.items.length; // number of stats in the current page of history - statsPage.hasNext() // true if there are further pages - statsPage.isLast() // true if this page is the last page - statsPage.next(function(nextPage) { ... }); // retrieves the next page as PaginatedResult -}); +const statsPage = await client.stats() // statsPage as PaginatedResult +statsPage.items // array of Stats +statsPage.items[0].inbound.rest.messages.count; // total messages published over REST +statsPage.items.length; // number of stats in the current page of history +statsPage.hasNext() // true if there are further pages +statsPage.isLast() // true if this page is the last page +const nextPage = await statsPage.next(); // retrieves the next page as PaginatedResult ``` ### Fetching the Ably service time ```javascript -client.time(function(err, time) { ... }); // time is in ms since epoch -``` - -## Using the async API style - -### Realtime Example - -```ts -import * as Ably from 'ably/promises'; - -const client = new Ably.Realtime.Promise(options); - -const ablyRealtimePromiseExample = async () => { - const channel = client.channels.get('myChannel'); - - // Attaching to a channel - await channel.attach(); - - // Getting presence on a channel - const presenceMessage = await channel.presence.get(); - console.log(presenceMessage); - - // Updating presence on a client - await channel.presence.enter(); - await channel.presence.update('new status'); - await channel.presence.leave(); - - // Publishing a message - await channel.publish('greeting', 'Hello, World!'); - - // Querying history - const history = await channel.history({ limit: 25 }); - console.log(history); - - client.close(); -}; - -ablyRealtimePromiseExample(); -``` - -### REST Example - -```ts -import * as Ably from 'ably/promises'; - -const client = new Ably.Rest.Promise(options); - -const ablyRestPromiseExample = async () => { - const channel = client.channels.get('myChannel'); - - // Publishing a message - await channel.publish('greeting', 'Hello, World!'); - - // Getting presence on a channel - const presenceMessage = await channel.presence.get(); - console.log(presenceMessage); - - // Querying history - const history = await channel.history({ limit: 25 }); - console.log(await history.current()); - - // Getting the status of a channel - const channelDetails = await channel.status(); - console.log(channelDetails); - - // Requesting a token - const token = await client.auth.requestToken(tokenParams); - - // Creating a token request - const tokenRequest = await client.auth.createTokenRequest(); - - // Fetching your application's stats - const stats = await client.stats(); - console.log(stats); - - // Fetching the Ably service time - const time = await client.time(); - console.log(`Ably service time: ${time}`); - - client.close(); -}; - -ablyRestPromiseExample(); +const time = await client.time(); // time is in ms since epoch ``` ## Delta Plugin diff --git a/ably.d.ts b/ably.d.ts index 08088741a1..c938527491 100644 --- a/ably.d.ts +++ b/ably.d.ts @@ -41,7 +41,7 @@ declare namespace Types { type FAILED = 'failed'; } /** - * Describes the possible states of a {@link ChannelBase} or {@link RealtimeChannelBase} object. + * Describes the possible states of a {@link Channel} or {@link RealtimeChannel} object. */ type ChannelState = | ChannelState.FAILED @@ -90,7 +90,7 @@ declare namespace Types { type UPDATE = 'update'; } /** - * Describes the events emitted by a {@link ChannelBase} or {@link RealtimeChannelBase} object. An event is either an `UPDATE` or a {@link ChannelState}. + * Describes the events emitted by a {@link Channel} or {@link RealtimeChannel} object. An event is either an `UPDATE` or a {@link ChannelState}. */ type ChannelEvent = | ChannelEvent.FAILED @@ -123,7 +123,7 @@ declare namespace Types { */ type DISCONNECTED = 'disconnected'; /** - * A long term failure condition. No current connection exists because there is no network connectivity or no host is available. The suspended state is entered after a failed connection attempt if there has then been no connection for a period of two minutes. In the suspended state, the library will periodically attempt to open a new connection every 30 seconds. Developers are unable to publish messages in this state. A new connection attempt can also be triggered by an explicit call to {@link ConnectionBase.connect | `connect()`}. Once the connection has been re-established, channels will be automatically re-attached. The client has been disconnected for too long for them to resume from where they left off, so if it wants to catch up on messages published by other clients while it was disconnected, it needs to use the [History API](https://ably.com/docs/realtime/history). + * A long term failure condition. No current connection exists because there is no network connectivity or no host is available. The suspended state is entered after a failed connection attempt if there has then been no connection for a period of two minutes. In the suspended state, the library will periodically attempt to open a new connection every 30 seconds. Developers are unable to publish messages in this state. A new connection attempt can also be triggered by an explicit call to {@link Connection.connect | `connect()`}. Once the connection has been re-established, channels will be automatically re-attached. The client has been disconnected for too long for them to resume from where they left off, so if it wants to catch up on messages published by other clients while it was disconnected, it needs to use the [History API](https://ably.com/docs/realtime/history). */ type SUSPENDED = 'suspended'; /** @@ -131,16 +131,16 @@ declare namespace Types { */ type CLOSING = 'closing'; /** - * The connection has been explicitly closed by the client. In the closed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. No connection state is preserved by the service or by the library. A new connection attempt can be triggered by an explicit call to {@link ConnectionBase.connect | `connect()`}, which results in a new connection. + * The connection has been explicitly closed by the client. In the closed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. No connection state is preserved by the service or by the library. A new connection attempt can be triggered by an explicit call to {@link Connection.connect | `connect()`}, which results in a new connection. */ type CLOSED = 'closed'; /** - * This state is entered if the client library encounters a failure condition that it cannot recover from. This may be a fatal connection error received from the Ably service, for example an attempt to connect with an incorrect API key, or a local terminal error, for example the token in use has expired and the library does not have any way to renew it. In the failed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. A new connection attempt can be triggered by an explicit call to {@link ConnectionBase.connect | `connect()`}. + * This state is entered if the client library encounters a failure condition that it cannot recover from. This may be a fatal connection error received from the Ably service, for example an attempt to connect with an incorrect API key, or a local terminal error, for example the token in use has expired and the library does not have any way to renew it. In the failed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. A new connection attempt can be triggered by an explicit call to {@link Connection.connect | `connect()`}. */ type FAILED = 'failed'; } /** - * Describes the realtime {@link ConnectionBase} object states. + * Describes the realtime {@link Connection} object states. */ type ConnectionState = | ConnectionState.INITIALIZED @@ -173,7 +173,7 @@ declare namespace Types { */ type DISCONNECTED = 'disconnected'; /** - * A long term failure condition. No current connection exists because there is no network connectivity or no host is available. The suspended state is entered after a failed connection attempt if there has then been no connection for a period of two minutes. In the suspended state, the library will periodically attempt to open a new connection every 30 seconds. Developers are unable to publish messages in this state. A new connection attempt can also be triggered by an explicit call to {@link ConnectionBase.connect | `connect()`}. Once the connection has been re-established, channels will be automatically re-attached. The client has been disconnected for too long for them to resume from where they left off, so if it wants to catch up on messages published by other clients while it was disconnected, it needs to use the [History API](https://ably.com/docs/realtime/history). + * A long term failure condition. No current connection exists because there is no network connectivity or no host is available. The suspended state is entered after a failed connection attempt if there has then been no connection for a period of two minutes. In the suspended state, the library will periodically attempt to open a new connection every 30 seconds. Developers are unable to publish messages in this state. A new connection attempt can also be triggered by an explicit call to {@link Connection.connect | `connect()`}. Once the connection has been re-established, channels will be automatically re-attached. The client has been disconnected for too long for them to resume from where they left off, so if it wants to catch up on messages published by other clients while it was disconnected, it needs to use the [History API](https://ably.com/docs/realtime/history). */ type SUSPENDED = 'suspended'; /** @@ -181,11 +181,11 @@ declare namespace Types { */ type CLOSING = 'closing'; /** - * The connection has been explicitly closed by the client. In the closed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. No connection state is preserved by the service or by the library. A new connection attempt can be triggered by an explicit call to {@link ConnectionBase.connect | `connect()`}, which results in a new connection. + * The connection has been explicitly closed by the client. In the closed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. No connection state is preserved by the service or by the library. A new connection attempt can be triggered by an explicit call to {@link Connection.connect | `connect()`}, which results in a new connection. */ type CLOSED = 'closed'; /** - * This state is entered if the client library encounters a failure condition that it cannot recover from. This may be a fatal connection error received from the Ably service, for example an attempt to connect with an incorrect API key, or a local terminal error, for example the token in use has expired and the library does not have any way to renew it. In the failed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. A new connection attempt can be triggered by an explicit call to {@link ConnectionBase.connect | `connect()`}. + * This state is entered if the client library encounters a failure condition that it cannot recover from. This may be a fatal connection error received from the Ably service, for example an attempt to connect with an incorrect API key, or a local terminal error, for example the token in use has expired and the library does not have any way to renew it. In the failed state, no reconnection attempts are made automatically by the library, and clients may not publish messages. A new connection attempt can be triggered by an explicit call to {@link Connection.connect | `connect()`}. */ type FAILED = 'failed'; /** @@ -194,7 +194,7 @@ declare namespace Types { type UPDATE = 'update'; } /** - * Describes the events emitted by a {@link ConnectionBase} object. An event is either an `UPDATE` or a {@link ConnectionState}. + * Describes the events emitted by a {@link Connection} object. An event is either an `UPDATE` or a {@link ConnectionState}. */ type ConnectionEvent = | ConnectionEvent.INITIALIZED @@ -293,10 +293,10 @@ declare namespace Types { /** * A type which specifies the valid transport names. [See here](https://faqs.ably.com/which-transports-are-supported) for more information. */ - type Transport = 'web_socket' | 'xhr_streaming' | 'xhr_polling' | 'jsonp' | 'comet'; + type Transport = 'web_socket' | 'xhr_streaming' | 'xhr_polling' | 'comet'; /** - * Contains the details of a {@link ChannelBase} or {@link RealtimeChannelBase} object such as its ID and {@link ChannelStatus}. + * Contains the details of a {@link Channel} or {@link RealtimeChannel} object such as its ID and {@link ChannelStatus}. */ interface ChannelDetails { /** @@ -310,7 +310,7 @@ declare namespace Types { } /** - * Contains the status of a {@link ChannelBase} or {@link RealtimeChannelBase} object such as whether it is active and its {@link ChannelOccupancy}. + * Contains the status of a {@link Channel} or {@link RealtimeChannel} object such as whether it is active and its {@link ChannelOccupancy}. */ interface ChannelStatus { /** @@ -324,7 +324,7 @@ declare namespace Types { } /** - * Contains the metrics of a {@link ChannelBase} or {@link RealtimeChannelBase} object. + * Contains the metrics of a {@link Channel} or {@link RealtimeChannel} object. */ interface ChannelOccupancy { /** @@ -334,7 +334,7 @@ declare namespace Types { } /** - * Contains the metrics associated with a {@link ChannelBase} or {@link RealtimeChannelBase}, such as the number of publishers, subscribers and connections it has. + * Contains the metrics associated with a {@link Channel} or {@link RealtimeChannel}, such as the number of publishers, subscribers and connections it has. */ interface ChannelMetrics { /** @@ -364,11 +364,11 @@ declare namespace Types { } /** - * Passes additional client-specific properties to the REST {@link RestBase.constructor | `constructor()`} or the Realtime {@link RealtimeBase.constructor | `constructor()`}. + * Passes additional client-specific properties to the REST {@link Rest.constructor | `constructor()`} or the Realtime {@link Realtime.constructor | `constructor()`}. */ interface ClientOptions extends AuthOptions { /** - * When `true`, the client connects to Ably as soon as it is instantiated. You can set this to `false` and explicitly connect to Ably using the {@link ConnectionBase.connect | `connect()`} method. The default is `true`. + * When `true`, the client connects to Ably as soon as it is instantiated. You can set this to `false` and explicitly connect to Ably using the {@link Connection.connect | `connect()`} method. The default is `true`. * * @defaultValue `true` */ @@ -392,9 +392,16 @@ declare namespace Types { environment?: string; /** - * Parameters to control the log output of the library, such as the log handler and log level. + * Controls the verbosity of the logs output from the library. Valid values are: 0 (no logs), 1 (errors only), 2 (errors plus connection and channel state changes), 3 (high-level debug output), and 4 (full debug output). + */ + logLevel?: number; + + /** + * Controls the log output of the library. This is a function to handle each line of log output. If you do not set this value, then `console.log` will be used. + * + * @param msg - The log message emitted by the library. */ - log?: LogInfo; + logHandler?: (msg: string) => void; /** * Enables a non-default Ably port to be specified. For development environments only. The default value is 80. @@ -431,11 +438,6 @@ declare namespace Types { */ fallbackHosts?: string[]; - /** - * @deprecated This property is deprecated and will be removed in a future version. Enables default fallback hosts to be used. - */ - fallbackHostsUseDefault?: boolean; - /** * Set of configurable options to set on the HTTP(S) agent used for REST requests. * @@ -525,7 +527,7 @@ declare namespace Types { transportParams?: { [k: string]: string | number }; /** - * An array of transports to use, in descending order of preference. In the browser environment the available transports are: `web_socket`, `xhr`, and `jsonp`. + * An array of transports to use, in descending order of preference. In the browser environment the available transports are: `web_socket` and `xhr`. */ transports?: Transport[]; @@ -702,7 +704,7 @@ declare namespace Types { } /** - * Sets the properties to configure encryption for a {@link ChannelBase} or {@link RealtimeChannelBase} object. + * Sets the properties to configure encryption for a {@link Channel} or {@link RealtimeChannel} object. */ interface CipherParams { /** @@ -714,7 +716,7 @@ declare namespace Types { /** * The private key used to encrypt and decrypt payloads. You should not set this value directly; rather, you should pass a `key` of type {@link Types.CipherKeyParam} to {@link Crypto.getDefaultParams}. */ - key: CipherKey; + key: unknown; /** * The length of the key in bits; either 128 or 256. */ @@ -902,7 +904,7 @@ declare namespace Types { } /** - * Contains the properties of a request for a token to Ably. Tokens are generated using {@link AuthCallbacks.requestToken} or {@link AuthPromise.requestToken}. + * Contains the properties of a request for a token to Ably. Tokens are generated using {@link Auth.requestToken}. */ interface TokenRequest { /** @@ -983,11 +985,11 @@ declare namespace Types { type ChannelModes = Array; /** - * Passes additional properties to a {@link ChannelBase} or {@link RealtimeChannelBase} object, such as encryption, {@link ChannelMode} and channel parameters. + * Passes additional properties to a {@link Channel} or {@link RealtimeChannel} object, such as encryption, {@link ChannelMode} and channel parameters. */ interface ChannelOptions { /** - * Requests encryption for this channel when not null, and specifies encryption-related parameters (such as algorithm, chaining mode, key length and key). See [an example](https://ably.com/docs/realtime/encryption#getting-started). + * Requests encryption for this channel when not null, and specifies encryption-related parameters (such as algorithm, chaining mode, key length and key). See [an example](https://ably.com/docs/realtime/encryption#getting-started). When running in a browser, encryption is only available when the current environment is a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts). */ cipher?: CipherParamOptions | CipherParams; /** @@ -1001,7 +1003,7 @@ declare namespace Types { } /** - * Passes additional properties to a {@link RealtimeChannelBase} name to produce a new derived channel + * Passes additional properties to a {@link RealtimeChannel} name to produce a new derived channel */ interface DeriveOptions { /** @@ -1013,10 +1015,8 @@ declare namespace Types { /** * The `RestHistoryParams` interface describes the parameters accepted by the following methods: * - * - {@link PresenceCallbacks.history} - * - {@link PresencePromise.history} - * - {@link ChannelCallbacks.history} - * - {@link ChannelPromise.history} + * - {@link Presence.history} + * - {@link Channel.history} */ interface RestHistoryParams { /** @@ -1044,10 +1044,7 @@ declare namespace Types { } /** - * The `RestPresenceParams` interface describes the parameters accepted by the following methods: - * - * - {@link PresenceCallbacks.get} - * - {@link PresencePromise.get} + * The `RestPresenceParams` interface describes the parameters accepted by {@link Presence.get}. */ interface RestPresenceParams { /** @@ -1067,10 +1064,7 @@ declare namespace Types { } /** - * The `RealtimePresenceParams` interface describes the parameters accepted by the following methods: - * - * - {@link RealtimePresenceCallbacks.get} - * - {@link RealtimePresencePromise.get} + * The `RealtimePresenceParams` interface describes the parameters accepted by {@link RealtimePresence.get}. */ interface RealtimePresenceParams { /** @@ -1092,10 +1086,8 @@ declare namespace Types { /** * The `RealtimeHistoryParams` interface describes the parameters accepted by the following methods: * - * - {@link RealtimePresenceCallbacks.history} - * - {@link RealtimePresencePromise.history} - * - {@link RealtimeChannelCallbacks.history} - * - {@link RealtimeChannelPromise.history} + * - {@link RealtimePresence.history} + * - {@link RealtimeChannel.history} */ interface RealtimeHistoryParams { /** @@ -1127,24 +1119,7 @@ declare namespace Types { } /** - * Settings which control the log output of the library. - */ - interface LogInfo { - /** - * Controls the verbosity of the logs output from the library. Valid values are: 0 (no logs), 1 (errors only), 2 (errors plus connection and channel state changes), 3 (high-level debug output), and 4 (full debug output). - */ - level?: number; - - /** - * Controls the log output of the library. This is a function to handle each line of log output. If you do not set this value, then `console.log` will be used. - * - * @param msg - The log message emitted by the library. - */ - handler?: (msg: string) => void; - } - - /** - * Contains state change information emitted by {@link ChannelBase} and {@link RealtimeChannelBase} objects. + * Contains state change information emitted by {@link Channel} and {@link RealtimeChannel} objects. */ interface ChannelStateChange { /** @@ -1170,7 +1145,7 @@ declare namespace Types { } /** - * Contains {@link ConnectionState} change information emitted by the {@link ConnectionBase} object. + * Contains {@link ConnectionState} change information emitted by the {@link Connection} object. */ interface ConnectionStateChange { /** @@ -1343,10 +1318,8 @@ declare namespace Types { /** * The `DeviceRegistrationParams` interface describes the parameters accepted by the following methods: * - * - {@link PushDeviceRegistrationsCallbacks.list} - * - {@link PushDeviceRegistrationsCallbacks.removeWhere} - * - {@link PushDeviceRegistrationsPromise.list} - * - {@link PushDeviceRegistrationsPromise.removeWhere} + * - {@link PushDeviceRegistrations.list} + * - {@link PushDeviceRegistrations.removeWhere} */ interface DeviceRegistrationParams { /** @@ -1370,10 +1343,8 @@ declare namespace Types { /** * The `PushChannelSubscriptionParams` interface describes the parameters accepted by the following methods: * - * - {@link PushChannelSubscriptionsCallbacks.list} - * - {@link PushChannelSubscriptionsCallbacks.removeWhere} - * - {@link PushChannelSubscriptionsPromise.list} - * - {@link PushChannelSubscriptionsPromise.removeWhere} + * - {@link PushChannelSubscriptions.list} + * - {@link PushChannelSubscriptions.removeWhere} */ interface PushChannelSubscriptionParams { /** @@ -1395,10 +1366,7 @@ declare namespace Types { } /** - * The `PushChannelsParams` interface describes the parameters accepted by the following methods: - * - * - {@link PushChannelSubscriptionsCallbacks.listChannels} - * - {@link PushChannelSubscriptionsPromise.listChannels} + * The `PushChannelsParams` interface describes the parameters accepted by {@link PushChannelSubscriptions.listChannels}. */ interface PushChannelsParams { /** @@ -1410,10 +1378,8 @@ declare namespace Types { /** * The `StatsParams` interface describes the parameters accepted by the following methods: * - * - {@link RestCallbacks.stats} - * - {@link RestPromise.stats} - * - {@link RealtimeCallbacks.stats} - * - {@link RealtimePromise.stats} + * - {@link Rest.stats} + * - {@link Realtime.stats} */ interface StatsParams { /** @@ -1537,10 +1503,7 @@ declare namespace Types { } /** - * The `TokenRevocationOptions` interface describes the additional options accepted by the following methods: - * - * - {@link AuthCallbacks.revokeTokens} - * - {@link AuthPromise.revokeTokens} + * The `TokenRevocationOptions` interface describes the additional options accepted by {@link Auth.revokeTokens}. */ interface TokenRevocationOptions { /** @@ -1601,64 +1564,23 @@ declare namespace Types { // Common Listeners /** - * A standard callback format used in most areas of the callback API. - * - * @param err - An error object if the request failed. - * @param result - The result of the request, if any. - */ - type StandardCallback = (err: ErrorInfo | null, result?: T) => void; - /** - * A {@link StandardCallback} which returns a {@link PaginatedResult}. - */ - type paginatedResultCallback = StandardCallback>; - /** - * A callback which returns only a single argument, used for {@link RealtimeChannelBase} subscriptions. + * A callback which returns only a single argument, used for {@link RealtimeChannel} subscriptions. * * @param message - The message which triggered the callback. */ type messageCallback = (message: T) => void; /** - * A callback which returns only an error, or null, when complete. - * - * @param error - The error if the request failed, or null not. - */ - type errorCallback = (error?: ErrorInfo | null) => void; - /** - * The callback used by {@link RealtimeChannelCallbacks.whenState}. + * The callback used for the events emitted by {@link RealtimeChannel}. * * @param changeStateChange - The state change that occurred. */ type channelEventCallback = (changeStateChange: ChannelStateChange) => void; /** - * The callback used by {@link ConnectionCallbacks.whenState}. + * The callback used for the events emitted by {@link Connection}. * * @param connectionStateChange - The state change that occurred. */ type connectionEventCallback = (connectionStateChange: ConnectionStateChange) => void; - /** - * The callback used by {@link RestCallbacks.time} and {@link RealtimeCallbacks.time}. - * - * @param timeCallback - The time in milliseconds since the Unix epoch. - */ - type timeCallback = StandardCallback; - /** - * The callback used by {@link RealtimePresenceCallbacks.get}. - * - * @param realtimePresenceGetCallback - An array of {@link PresenceMessage} objects. - */ - type realtimePresenceGetCallback = StandardCallback; - /** - * The callback used by {@link AuthCallbacks.authorize}. - * - * @param tokenDetailsCallback - A {@link TokenDetails} object. - */ - type tokenDetailsCallback = StandardCallback; - /** - * The callback used by {@link AuthCallbacks.createTokenRequest}. - * - * @param tokenRequestCallback - A {@link TokenRequest} object - */ - type tokenRequestCallback = StandardCallback; /** * The callback used by {@link recoverConnectionCallback}. * @@ -1692,16 +1614,6 @@ declare namespace Types { }, callback: recoverConnectionCompletionCallback ) => void; - /** - * @ignore - * @deprecated No longer used by this library - kept here since it used to be part of our public API. Will be removed in next major version release. - */ - type fromEncoded = (JsonObject: any, channelOptions?: ChannelOptions) => T; - /** - * @ignore - * @deprecated No longer used by this library - kept here since it used to be part of our public API. Will be removed in next major version release. - */ - type fromEncodedArray = (JsonArray: any[], channelOptions?: ChannelOptions) => T[]; // Internal Classes @@ -1710,7 +1622,7 @@ declare namespace Types { // that returns a Promise if desired, EventEmitter uses method overloading to // present both methods /** - * A generic interface for event registration and delivery used in a number of the types in the Realtime client library. For example, the {@link ConnectionBase} object emits events for connection state using the `EventEmitter` pattern. + * A generic interface for event registration and delivery used in a number of the types in the Realtime client library. For example, the {@link Connection} object emits events for connection state using the `EventEmitter` pattern. */ class EventEmitter { /** @@ -1786,9 +1698,9 @@ declare namespace Types { // Classes /** - * The `RestBase` class acts as a base class for the {@link RestCallbacks} and {@link RestPromise} classes. + * A client that offers a simple stateless API to interact directly with Ably's REST API. */ - class RestBase { + class Rest { /** * Construct a client object using an Ably {@link Types.ClientOptions} object. * @@ -1813,126 +1725,21 @@ declare namespace Types { * Static utilities related to presence messages. */ static PresenceMessage: Types.PresenceMessageStatic; - } - - /** - * A client that offers a simple stateless API to interact directly with Ably's REST API. - */ - class RestCallbacks extends RestBase { - /** - * A promisified version of the library (use this if you prefer to use Promises or async/await instead of callbacks) - */ - static Promise: typeof Types.RestPromise; - /** - * A callback based version of the library - */ - static Callbacks: typeof Types.RestCallbacks; - /** - * An {@link Types.AuthCallbacks} object. - */ - auth: Types.AuthCallbacks; - /** - * A {@link Types.Channels} object. - */ - channels: Types.Channels; - /** - * Makes a REST request to a provided path. This is provided as a convenience for developers who wish to use REST API functionality that is either not documented or is not yet included in the public API, without having to directly handle features such as authentication, paging, fallback hosts, MsgPack and JSON support. - * - * @param method - The request method to use, such as `GET`, `POST`. - * @param path - The request path. - * @param params - The parameters to include in the URL query of the request. The parameters depend on the endpoint being queried. See the [REST API reference](https://ably.com/docs/api/rest-api) for the available parameters of each endpoint. - * @param body - The JSON body of the request. - * @param headers - Additional HTTP headers to include in the request. - * @param callback - A function which, upon success, will be called with an {@link Types.HttpPaginatedResponse} response object returned by the HTTP request. This response object will contain an empty or JSON-encodable object. Upon failure, the function will be called with information about the error. - */ - request( - method: string, - path: string, - params?: any, - body?: any[] | any, - headers?: any, - callback?: Types.StandardCallback> - ): void; - /** - * Queries the REST `/stats` API and retrieves your application's usage statistics. Returns a {@link Types.PaginatedResult} object, containing an array of {@link Types.Stats} objects. See the [Stats docs](https://ably.com/docs/general/statistics). - * - * @param params - A set of parameters which are used to specify which statistics should be retrieved. This parameter should be a {@link Types.StatsParams} object. For reasons of backwards compatibility this parameter will also accept `any`; this ability will be removed in the next major release of this SDK. If you do not provide this argument, then this method will use the default parameters described in the {@link Types.StatsParams} interface. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Types.Stats} objects. Upon failure, the function will be called with information about the error. - */ - stats(params?: StatsParams | any, callback?: Types.paginatedResultCallback): void; - /** - * Queries the REST `/stats` API and retrieves your application's usage statistics, using the default parameters described in the {@link Types.StatsParams} interface. Returns a {@link Types.PaginatedResult} object, containing an array of {@link Types.Stats} objects. See the [Stats docs](https://ably.com/docs/general/statistics). - * - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Types.Stats} objects. Upon failure, the function will be called with information about the error. - */ - stats(callback?: Types.paginatedResultCallback): void; - /** - * Retrieves the time from the Ably service as milliseconds since the Unix epoch. Clients that do not have access to a sufficiently well maintained time source and wish to issue Ably {@link Types.TokenRequest | `TokenRequest`s} with a more accurate timestamp should use the {@link Types.ClientOptions.queryTime} property instead of this method. - * - * @param callback - A function which, upon success, will be called with the time as milliseconds since the Unix epoch. Upon failure, the function will be called with information about the error. - */ - time(callback?: Types.timeCallback): void; - /** - * Publishes a {@link Types.BatchPublishSpec} object to one or more channels, up to a maximum of 100 channels. - * - * @param spec - A {@link Types.BatchPublishSpec} object. - * @param callback - A function which, upon success, will be called with a {@link Types.BatchResult} object containing information about the result of the batch publish for each requested channel. Upon failure, the function will be called with information about the error. - */ - batchPublish( - spec: BatchPublishSpec, - callback: StandardCallback> - ): void; - /** - * Publishes one or more {@link Types.BatchPublishSpec} objects to one or more channels, up to a maximum of 100 channels. - * - * @param specs - An array of {@link Types.BatchPublishSpec} objects. - * @param callback - A function which, upon success, will be called with an array of {@link Types.BatchResult} objects containing information about the result of the batch publish for each requested channel for each provided {@link Types.BatchPublishSpec}. This array is in the same order as the provided {@link Types.BatchPublishSpec} array. Upon failure, the function will be called with information about the error. - */ - batchPublish( - specs: BatchPublishSpec[], - callback: StandardCallback[]> - ): void; - /** - * Retrieves the presence state for one or more channels, up to a maximum of 100 channels. Presence state includes the `clientId` of members and their current {@link Types.PresenceAction}. - * - * @param channels - An array of one or more channel names, up to a maximum of 100 channels. - * @param callback - A function which, upon success, will be called with a {@link Types.BatchResult} object containing information about the result of the batch presence request for each requested channel. Upon failure, the function will be called with information about the error. - */ - batchPresence( - channels: string[], - callback: StandardCallback> - ): void; - /** - * A {@link Types.PushCallbacks} object. - */ - push: Types.PushCallbacks; - } - /** - * A client that offers a simple stateless API to interact directly with Ably's REST API. - */ - class RestPromise extends RestBase { - /** - * A promisified version of the library (use this if you prefer to use Promises or async/await instead of callbacks) - */ - static Promise: typeof Types.RestPromise; - /** - * A callback based version of the library - */ - static Callbacks: typeof Types.RestCallbacks; /** - * An {@link Types.AuthPromise} object. + * An {@link Types.Auth} object. */ - auth: Types.AuthPromise; + auth: Types.Auth; /** * A {@link Types.Channels} object. */ - channels: Types.Channels; + channels: Types.Channels; /** * Makes a REST request to a provided path. This is provided as a convenience for developers who wish to use REST API functionality that is either not documented or is not yet included in the public API, without having to directly handle features such as authentication, paging, fallback hosts, MsgPack and JSON support. * * @param method - The request method to use, such as `GET`, `POST`. * @param path - The request path. + * @param version - The major version of the Ably REST API to use. See the [REST API reference](https://ably.com/docs/api/rest-api#versioning) for information on versioning. * @param params - The parameters to include in the URL query of the request. The parameters depend on the endpoint being queried. See the [REST API reference](https://ably.com/docs/api/rest-api) for the available parameters of each endpoint. * @param body - The JSON body of the request. * @param headers - Additional HTTP headers to include in the request. @@ -1941,6 +1748,7 @@ declare namespace Types { request( method: string, path: string, + version: number, params?: any, body?: any[] | any, headers?: any @@ -1983,147 +1791,70 @@ declare namespace Types { */ batchPresence(channels: string[]): Promise[]>; /** - * A {@link Types.PushPromise} object. - */ - push: Types.PushPromise; - } - - /** - * A base class used internally for Realtime APIs. - */ - class RealtimeBase extends RestBase { - /** - * A promisified version of the library (use this if you prefer to use Promises or async/await instead of callbacks) - */ - static Promise: typeof Types.RealtimePromise; - /** - * A callback based version of the library - */ - static Callbacks: typeof Types.RealtimeCallbacks; - /** - * A client ID, used for identifying this client when publishing messages or for presence purposes. The `clientId` can be any non-empty string, except it cannot contain a `*`. This option is primarily intended to be used in situations where the library is instantiated with a key. A `clientId` may also be implicit in a token used to instantiate the library; an error will be raised if a `clientId` specified here conflicts with the `clientId` implicit in the token. - */ - clientId: string; - /** - * Calls {@link Types.ConnectionBase.close | `connection.close()`} and causes the connection to close, entering the closing state. Once closed, the library will not attempt to re-establish the connection without an explicit call to {@link Types.ConnectionBase.connect | `connect()`}. - */ - close(): void; - /** - * Calls {@link Types.ConnectionBase.connect | `connection.connect()`} and causes the connection to open, entering the connecting state. Explicitly calling `connect()` is unnecessary unless the {@link Types.ClientOptions.autoConnect} property is disabled. + * A {@link Types.Push} object. */ - connect(): void; + push: Types.Push; } /** - * A client that extends the functionality of {@link RestCallbacks} and provides additional realtime-specific features. + * A client that extends the functionality of {@link Rest} and provides additional realtime-specific features. */ - class RealtimeCallbacks extends RealtimeBase { - /** - * An {@link Types.AuthCallbacks} object. - */ - auth: Types.AuthCallbacks; - /** - * A {@link Types.Channels} object. - */ - channels: Types.Channels; - /** - * A {@link Types.ConnectionCallbacks} object. - */ - connection: Types.ConnectionCallbacks; + class Realtime { /** - * Makes a REST request to a provided path. This is provided as a convenience for developers who wish to use REST API functionality that is either not documented or is not yet included in the public API, without having to directly handle features such as authentication, paging, fallback hosts, MsgPack and JSON support. + * Construct a client object using an Ably {@link Types.ClientOptions} object. * - * @param method - The request method to use, such as `GET`, `POST`. - * @param path - The request path. - * @param params - The parameters to include in the URL query of the request. The parameters depend on the endpoint being queried. See the [REST API reference](https://ably.com/docs/api/rest-api) for the available parameters of each endpoint. - * @param body - The JSON body of the request. - * @param headers - Additional HTTP headers to include in the request. - * @param callback - A function which, upon success, will be called with the {@link Types.HttpPaginatedResponse} response object returned by the HTTP request. This response object will contain an empty or JSON-encodable object. Upon failure, the function will be called with information about the error. + * @param options - A {@link Types.ClientOptions} object to configure the client connection to Ably. */ - request( - method: string, - path: string, - params?: any, - body?: any[] | any, - headers?: any, - callback?: Types.StandardCallback> - ): void; + constructor(options: Types.ClientOptions); /** - * Queries the REST `/stats` API and retrieves your application's usage statistics. Returns a {@link Types.PaginatedResult} object, containing an array of {@link Types.Stats} objects. See the [Stats docs](https://ably.com/docs/general/statistics). + * Constructs a client object using an Ably API key or token string. * - * @param params - A set of parameters which are used to specify which statistics should be retrieved. This parameter should be a {@link Types.StatsParams} object. For reasons of backwards compatibility this parameter will also accept `any`; this ability will be removed in the next major release of this SDK. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Types.Stats} objects. Upon failure, the function will be called with information about the error. + * @param keyOrToken - The Ably API key or token string used to validate the client. */ - stats(params: StatsParams | any, callback: Types.paginatedResultCallback): void; + constructor(keyOrToken: string); /** - * Queries the REST `/stats` API and retrieves your application's usage statistics, using the default parameters described in the {@link Types.StatsParams} interface. Returns a {@link Types.PaginatedResult} object, containing an array of {@link Types.Stats} objects. See the [Stats docs](https://ably.com/docs/general/statistics). - * - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Types.Stats} objects. Upon failure, the function will be called with information about the error. + * The cryptographic functions available in the library. */ - stats(callback: Types.paginatedResultCallback): void; + static Crypto: Types.Crypto; /** - * Retrieves the time from the Ably service as milliseconds since the Unix epoch. Clients that do not have access to a sufficiently well maintained time source and wish to issue Ably {@link Types.TokenRequest | `TokenRequest`s} with a more accurate timestamp should use the {@link Types.ClientOptions.queryTime} property instead of this method. - * - * @param callback - A function which, upon success, will be called with the time as milliseconds since the Unix epoch. Upon failure, the function will be called with information about the error. + * Static utilities related to messages. */ - time(callback?: Types.timeCallback): void; + static Message: Types.MessageStatic; /** - * Publishes a {@link Types.BatchPublishSpec} object to one or more channels, up to a maximum of 100 channels. - * - * @param spec - A {@link Types.BatchPublishSpec} object. - * @param callback - A function which, upon success, will be called with a {@link Types.BatchResult} object containing information about the result of the batch publish for each requested channel. Upon failure, the function will be called with information about the error. + * Static utilities related to presence messages. */ - batchPublish( - spec: BatchPublishSpec, - callback: StandardCallback> - ): void; + static PresenceMessage: Types.PresenceMessageStatic; /** - * Publishes one or more {@link Types.BatchPublishSpec} objects to one or more channels, up to a maximum of 100 channels. - * - * @param specs - An array of {@link Types.BatchPublishSpec} objects. - * @param callback - A function which, upon success, will be called with an array of {@link Types.BatchResult} objects containing information about the result of the batch publish for each requested channel for each provided {@link Types.BatchPublishSpec}. This array is in the same order as the provided {@link Types.BatchPublishSpec} array. Upon failure, the function will be called with information about the error. + * A client ID, used for identifying this client when publishing messages or for presence purposes. The `clientId` can be any non-empty string, except it cannot contain a `*`. This option is primarily intended to be used in situations where the library is instantiated with a key. A `clientId` may also be implicit in a token used to instantiate the library; an error will be raised if a `clientId` specified here conflicts with the `clientId` implicit in the token. */ - batchPublish( - specs: BatchPublishSpec[], - callback: StandardCallback[]> - ): void; + clientId: string; /** - * Retrieves the presence state for one or more channels, up to a maximum of 100 channels. Presence state includes the `clientId` of members and their current {@link Types.PresenceAction}. - * - * @param channels - An array of one or more channel names, up to a maximum of 100 channels. - * @param callback - A function which, upon success, will be called with a {@link Types.BatchResult} object containing information about the result of the batch presence request for each requested channel. Upon failure, the function will be called with information about the error. + * Calls {@link Types.Connection.close | `connection.close()`} and causes the connection to close, entering the closing state. Once closed, the library will not attempt to re-establish the connection without an explicit call to {@link Types.Connection.connect | `connect()`}. */ - batchPresence( - channels: string[], - callback: StandardCallback[]> - ): void; + close(): void; /** - * A {@link Types.PushCallbacks} object. + * Calls {@link Types.Connection.connect | `connection.connect()`} and causes the connection to open, entering the connecting state. Explicitly calling `connect()` is unnecessary unless the {@link Types.ClientOptions.autoConnect} property is disabled. */ - push: Types.PushCallbacks; - } + connect(): void; - /** - * A client that extends the functionality of {@link RestPromise} and provides additional realtime-specific features. - */ - class RealtimePromise extends RealtimeBase { /** - * An {@link Types.AuthPromise} object. + * An {@link Types.Auth} object. */ - auth: Types.AuthPromise; + auth: Types.Auth; /** * A {@link Types.Channels} object. */ - channels: Types.Channels; + channels: Types.Channels; /** - * A {@link Types.ConnectionPromise} object. + * A {@link Types.Connection} object. */ - connection: Types.ConnectionPromise; + connection: Types.Connection; /** * Makes a REST request to a provided path. This is provided as a convenience for developers who wish to use REST API functionality that is either not documented or is not yet included in the public API, without having to directly handle features such as authentication, paging, fallback hosts, MsgPack and JSON support. * * @param method - The request method to use, such as `GET`, `POST`. * @param path - The request path. + * @param version - The major version of the Ably REST API to use. See the [REST API reference](https://ably.com/docs/api/rest-api#versioning) for information on versioning. * @param params - The parameters to include in the URL query of the request. The parameters depend on the endpoint being queried. See the [REST API reference](https://ably.com/docs/api/rest-api) for the available parameters of each endpoint. * @param body - The JSON body of the request. * @param headers - Additional HTTP headers to include in the request. @@ -2132,6 +1863,7 @@ declare namespace Types { request( method: string, path: string, + version: number, params?: any, body?: any[] | any, headers?: any @@ -2173,207 +1905,81 @@ declare namespace Types { */ batchPresence(channels: string[]): Promise[]>; /** - * A {@link Types.PushPromise} object. + * A {@link Types.Push} object. */ - push: Types.PushPromise; + push: Types.Push; } /** - * The `AuthBase` class acts as a base class for the {@link AuthCallbacks} and {@link AuthPromise} classes. + * Creates Ably {@link TokenRequest} objects and obtains Ably Tokens from Ably to subsequently issue to less trusted clients. */ - class AuthBase { + class Auth { /** * A client ID, used for identifying this client when publishing messages or for presence purposes. The `clientId` can be any non-empty string, except it cannot contain a `*`. This option is primarily intended to be used in situations where the library is instantiated with a key. Note that a `clientId` may also be implicit in a token used to instantiate the library. An error is raised if a `clientId` specified here conflicts with the `clientId` implicit in the token. Find out more about [identified clients](https://ably.com/docs/core-features/authentication#identified-clients). */ clientId: string; - } - /** - * Creates Ably {@link TokenRequest} objects and obtains Ably Tokens from Ably to subsequently issue to less trusted clients. - */ - class AuthCallbacks extends AuthBase { /** * Instructs the library to get a new token immediately. When using the realtime client, it upgrades the current realtime connection to use the new token, or if not connected, initiates a connection to Ably, once the new token has been obtained. Also stores any {@link TokenParams} and {@link AuthOptions} passed in as the new defaults, to be used for all subsequent implicit or explicit token requests. Any {@link TokenParams} and {@link AuthOptions} objects passed in entirely replace, as opposed to being merged with, the current client library saved values. * * @param tokenParams - A {@link TokenParams} object. * @param authOptions - An {@link AuthOptions} object. - * @param callback - A function which, upon success, will be called with a {@link TokenDetails} object. Upon failure, the function will be called with information about the error. - */ - authorize(tokenParams?: TokenParams, authOptions?: AuthOptions, callback?: tokenDetailsCallback): void; - /** - * Instructs the library to get a new token immediately. When using the realtime client, it upgrades the current realtime connection to use the new token, or if not connected, initiates a connection to Ably, once the new token has been obtained. Also stores any {@link TokenParams} passed in as the new default, to be used for all subsequent implicit or explicit token requests. Any {@link TokenParams} object passed in entirely replaces, as opposed to being merged with, the current client library saved value. - * - * @param tokenParams - A {@link TokenParams} object. - * @param callback - A function which, upon success, will be called with a {@link TokenDetails} object. Upon failure, the function will be called with information about the error. - */ - authorize(tokenParams?: TokenParams, callback?: tokenDetailsCallback): void; - /** - * Instructs the library to get a new token immediately. When using the realtime client, it upgrades the current realtime connection to use the new token, or if not connected, initiates a connection to Ably, once the new token has been obtained. - * - * @param callback - A function which, upon success, will be called with a {@link TokenDetails} object. Upon failure, the function will be called with information about the error. + * @returns A promise which, upon success, will be fulfilled with a {@link TokenDetails} object. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. */ - authorize(callback?: tokenDetailsCallback): void; + authorize(tokenParams?: TokenParams, authOptions?: AuthOptions): Promise; /** * Creates and signs an Ably {@link TokenRequest} based on the specified (or if none specified, the client library stored) {@link TokenParams} and {@link AuthOptions}. Note this can only be used when the API `key` value is available locally. Otherwise, the Ably {@link TokenRequest} must be obtained from the key owner. Use this to generate an Ably {@link TokenRequest} in order to implement an Ably Token request callback for use by other clients. Both {@link TokenParams} and {@link AuthOptions} are optional. When omitted or `null`, the default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. Values passed in are used instead of, rather than being merged with, the default values. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). * * @param tokenParams - A {@link TokenParams} object. * @param authOptions - An {@link AuthOptions} object. - * @param callback - A function which, upon success, will be called with a {@link TokenRequest} object. Upon failure, the function will be called with information about the error. - */ - createTokenRequest( - tokenParams?: TokenParams | null, - authOptions?: AuthOptions | null, - callback?: tokenRequestCallback - ): void; - /** - * Creates and signs an Ably {@link TokenRequest} based on the specified (or if none specified, the client library stored) {@link TokenParams}. Note this can only be used when the API `key` value is available locally. Otherwise, the Ably {@link TokenParams} must be obtained from the key owner. Use this to generate an Ably {@link TokenRequest} in order to implement an Ably Token request callback for use by other clients. When the {@link TokenRequest} is omitted or `null`, the default token parameters for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. Values passed in are used instead of, rather than being merged with, the default values. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). - * - * @param tokenParams - A {@link TokenParams} object. - * @param callback - A function which, upon success, will be called with a {@link TokenRequest} object. Upon failure, the function will be called with information about the error. - */ - createTokenRequest(tokenParams?: TokenParams | null, callback?: tokenRequestCallback): void; - /** - * Creates and signs an Ably {@link TokenRequest} based on the the client library stored {@link TokenParams} and {@link AuthOptions}. Note this can only be used when the API `key` value is available locally. Otherwise, the Ably {@link TokenRequest} must be obtained from the key owner. Use this to generate an Ably {@link TokenRequest} in order to implement an Ably Token request callback for use by other clients. The default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). - * - * @param callback - A function which, upon success, will be called with a {@link TokenRequest} object. Upon failure, the function will be called with information about the error. + * @returns A promise which, upon success, will be fulfilled with a {@link TokenRequest} object. Upon failure, the promise will be rejected with an {@link Types.ErrorInfo} object which explains the error. */ - createTokenRequest(callback?: tokenRequestCallback): void; + createTokenRequest(tokenParams?: TokenParams, authOptions?: AuthOptions): Promise; /** * Calls the `requestToken` REST API endpoint to obtain an Ably Token according to the specified {@link TokenParams} and {@link AuthOptions}. Both {@link TokenParams} and {@link AuthOptions} are optional. When omitted or `null`, the default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. Values passed in are used instead of, rather than being merged with, the default values. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). * * @param TokenParams - A {@link TokenParams} object. * @param authOptions - An {@link AuthOptions} object. - * @param callback - A function which, upon success, will be called with a {@link TokenDetails} object. Upon failure, the function will be called with information about the error. - */ - requestToken( - TokenParams?: TokenParams | null, - authOptions?: AuthOptions | null, - callback?: tokenDetailsCallback - ): void; - /** - * Calls the `requestToken` REST API endpoint to obtain an Ably Token according to the specified {@link TokenParams}. When omitted or `null`, the default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. Values passed in are used instead of, rather than being merged with, the default values. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). - * - * @param TokenParams - A {@link TokenParams} object. - * @param callback - A function which, upon success, will be called with a {@link TokenDetails} object. Upon failure, the function will be called with information about the error. - */ - requestToken(TokenParams?: TokenParams | null, callback?: tokenDetailsCallback): void; - /** - * Calls the `requestToken` REST API endpoint to obtain an Ably Token. The default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). - * - * @param callback - A function which, upon success, will be called with a {@link TokenDetails} object. Upon failure, the function will be called with information about the error. + * @returns A promise which, upon success, will be fulfilled with a {@link TokenDetails} object. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. */ - requestToken(callback?: tokenDetailsCallback): void; + requestToken(TokenParams?: TokenParams, authOptions?: AuthOptions): Promise; /** * Revokes the tokens specified by the provided array of {@link TokenRevocationTargetSpecifier}s. Only tokens issued by an API key that had revocable tokens enabled before the token was issued can be revoked. See the [token revocation docs](https://ably.com/docs/core-features/authentication#token-revocation) for more information. * * @param specifiers - An array of {@link TokenRevocationTargetSpecifier} objects. * @param options - A set of options which are used to modify the revocation request. - * @param callback - A function which, upon success, will be called with a {@link Types.BatchResult} containing information about the result of the token revocation request for each provided [`TokenRevocationTargetSpecifier`]{@link TokenRevocationTargetSpecifier}. Upon failure, the function will be called with information about the error. + * @returns A promise which, upon success, will be fulfilled with a {@link Types.BatchResult} containing information about the result of the token revocation request for each provided [`TokenRevocationTargetSpecifier`]{@link TokenRevocationTargetSpecifier}. Upon failure, the promise will be rejected with an {@link Types.ErrorInfo} object which explains the error. */ revokeTokens( specifiers: TokenRevocationTargetSpecifier[], - options?: TokenRevocationOptions, - callback?: StandardCallback> - ): void; + options?: TokenRevocationOptions + ): Promise>; } /** - * Creates Ably {@link TokenRequest} objects and obtains Ably Tokens from Ably to subsequently issue to less trusted clients. + * Enables the retrieval of the current and historic presence set for a channel. */ - class AuthPromise extends AuthBase { + class Presence { /** - * Instructs the library to get a new token immediately. When using the realtime client, it upgrades the current realtime connection to use the new token, or if not connected, initiates a connection to Ably, once the new token has been obtained. Also stores any {@link TokenParams} and {@link AuthOptions} passed in as the new defaults, to be used for all subsequent implicit or explicit token requests. Any {@link TokenParams} and {@link AuthOptions} objects passed in entirely replace, as opposed to being merged with, the current client library saved values. + * Retrieves the current members present on the channel and the metadata for each member, such as their {@link PresenceAction} and ID. Returns a {@link Types.PaginatedResult} object, containing an array of {@link PresenceMessage} objects. * - * @param tokenParams - A {@link TokenParams} object. - * @param authOptions - An {@link AuthOptions} object. - * @returns A promise which, upon success, will be fulfilled with a {@link TokenDetails} object. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. + * @param params - A set of parameters which are used to specify which presence members should be retrieved. + * @returns A promise which, upon success, will be fulfilled with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. */ - authorize(tokenParams?: TokenParams, authOptions?: AuthOptions): Promise; + get(params?: RestPresenceParams): Promise>; /** - * Creates and signs an Ably {@link TokenRequest} based on the specified (or if none specified, the client library stored) {@link TokenParams} and {@link AuthOptions}. Note this can only be used when the API `key` value is available locally. Otherwise, the Ably {@link TokenRequest} must be obtained from the key owner. Use this to generate an Ably {@link TokenRequest} in order to implement an Ably Token request callback for use by other clients. Both {@link TokenParams} and {@link AuthOptions} are optional. When omitted or `null`, the default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. Values passed in are used instead of, rather than being merged with, the default values. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). + * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link PresenceMessage} objects for the channel. If the channel is configured to persist messages, then presence messages can be retrieved from history for up to 72 hours in the past. If not, presence messages can only be retrieved from history for up to two minutes in the past. * - * @param tokenParams - A {@link TokenParams} object. - * @param authOptions - An {@link AuthOptions} object. - * @returns A promise which, upon success, will be fulfilled with a {@link TokenRequest} object. Upon failure, the promise will be rejected with an {@link Types.ErrorInfo} object which explains the error. - */ - createTokenRequest(tokenParams?: TokenParams, authOptions?: AuthOptions): Promise; - /** - * Calls the `requestToken` REST API endpoint to obtain an Ably Token according to the specified {@link TokenParams} and {@link AuthOptions}. Both {@link TokenParams} and {@link AuthOptions} are optional. When omitted or `null`, the default token parameters and authentication options for the client library are used, as specified in the {@link ClientOptions} when the client library was instantiated, or later updated with an explicit `authorize` request. Values passed in are used instead of, rather than being merged with, the default values. To understand why an Ably {@link TokenRequest} may be issued to clients in favor of a token, see [Token Authentication explained](https://ably.com/docs/core-features/authentication/#token-authentication). - * - * @param TokenParams - A {@link TokenParams} object. - * @param authOptions - An {@link AuthOptions} object. - * @returns A promise which, upon success, will be fulfilled with a {@link TokenDetails} object. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. - */ - requestToken(TokenParams?: TokenParams, authOptions?: AuthOptions): Promise; - /** - * Revokes the tokens specified by the provided array of {@link TokenRevocationTargetSpecifier}s. Only tokens issued by an API key that had revocable tokens enabled before the token was issued can be revoked. See the [token revocation docs](https://ably.com/docs/core-features/authentication#token-revocation) for more information. - * - * @param specifiers - An array of {@link TokenRevocationTargetSpecifier} objects. - * @param options - A set of options which are used to modify the revocation request. - * @returns A promise which, upon success, will be fulfilled with a {@link Types.BatchResult} containing information about the result of the token revocation request for each provided [`TokenRevocationTargetSpecifier`]{@link TokenRevocationTargetSpecifier}. Upon failure, the promise will be rejected with an {@link Types.ErrorInfo} object which explains the error. - */ - revokeTokens( - specifiers: TokenRevocationTargetSpecifier[], - options?: TokenRevocationOptions - ): Promise>; - } - - /** - * Enables the retrieval of the current and historic presence set for a channel. - */ - class PresenceCallbacks { - /** - * Retrieves the current members present on the channel and the metadata for each member, such as their {@link PresenceAction} and ID. Returns a {@link Types.PaginatedResult} object, containing an array of {@link PresenceMessage} objects. - * - * @param params - A set of parameters which are used to specify which presence members should be retrieved. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - get(params?: RestPresenceParams, callback?: paginatedResultCallback): void; - /** - * Retrieves the current members present on the channel and the metadata for each member, such as their [PresenceAction]{@link PresenceAction} and ID. - * - * @param callback - A function which, upon success, will be called with a [PaginatedResult]{@link PaginatedResult} object, containing an array of [PresenceMessage]{@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - get(callback?: paginatedResultCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link PresenceMessage} objects for the channel. If the channel is configured to persist messages, then presence messages can be retrieved from history for up to 72 hours in the past. If not, presence messages can only be retrieved from history for up to two minutes in the past. - * - * @param params - A set of parameters which are used to specify which messages should be retrieved. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - history(params: RestHistoryParams, callback?: paginatedResultCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link PresenceMessage} objects for the channel. If the channel is configured to persist messages, then presence messages can be retrieved from history for up to 72 hours in the past. If not, presence messages can only be retrieved from history for up to two minutes in the past. - * - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - history(callback: paginatedResultCallback): void; - } - - /** - * Enables the retrieval of the current and historic presence set for a channel. - */ - class PresencePromise { - /** - * Retrieves the current members present on the channel and the metadata for each member, such as their {@link PresenceAction} and ID. Returns a {@link Types.PaginatedResult} object, containing an array of {@link PresenceMessage} objects. - * - * @param params - A set of parameters which are used to specify which presence members should be retrieved. - * @returns A promise which, upon success, will be fulfilled with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. - */ - get(params?: RestPresenceParams): Promise>; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link PresenceMessage} objects for the channel. If the channel is configured to persist messages, then presence messages can be retrieved from history for up to 72 hours in the past. If not, presence messages can only be retrieved from history for up to two minutes in the past. - * - * @param params - A set of parameters which are used to specify which messages should be retrieved. - * @returns A promise which, upon success, will be fulfilled with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. + * @param params - A set of parameters which are used to specify which messages should be retrieved. + * @returns A promise which, upon success, will be fulfilled with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. */ history(params?: RestHistoryParams): Promise>; } /** - * The `RealtimePresenceBase` class acts as a base class for the {@link RealtimePresenceCallbacks} and {@link RealtimePresencePromise} classes. + * Enables the presence set to be entered and subscribed to, and the historic presence set to be retrieved for a channel. */ - class RealtimePresenceBase { + class RealtimePresence { /** * Indicates whether the presence set synchronization between Ably and the clients on the channel has been completed. Set to `true` when the sync is complete. */ @@ -2414,134 +2020,7 @@ declare namespace Types { * Deregisters all listeners currently receiving {@link PresenceMessage} for the channel. */ unsubscribe(): void; - } - /** - * Enables the presence set to be entered and subscribed to, and the historic presence set to be retrieved for a channel. - */ - class RealtimePresenceCallbacks extends RealtimePresenceBase { - /** - * Retrieves the current members present on the channel and the metadata for each member, such as their {@link PresenceAction} and ID. Returns an array of {@link PresenceMessage} objects. - * - * @param params - A set of parameters which are used to specify which presence members should be retrieved. - * @param callback - A function which, upon success, will be called with an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - get(params?: RealtimePresenceParams, callback?: realtimePresenceGetCallback): void; - /** - * Retrieves the current members present on the channel and the metadata for each member, such as their {@link PresenceAction} and ID. Returns an array of {@link PresenceMessage} objects. - * - * @param callback - A function which, upon success, will be called with an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - get(callback?: realtimePresenceGetCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link PresenceMessage} objects for the channel. If the channel is configured to persist messages, then presence messages can be retrieved from history for up to 72 hours in the past. If not, presence messages can only be retrieved from history for up to two minutes in the past. - * - * @param params - A set of parameters which are used to specify which presence messages should be retrieved. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - history(params?: RealtimeHistoryParams, callback?: paginatedResultCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link PresenceMessage} objects for the channel. If the channel is configured to persist messages, then presence messages can be retrieved from history for up to 72 hours in the past. If not, presence messages can only be retrieved from history for up to two minutes in the past. - * - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link PresenceMessage} objects. Upon failure, the function will be called with information about the error. - */ - history(callback?: paginatedResultCallback): void; - /** - * Registers a listener that is called each time a {@link PresenceMessage} matching a given {@link PresenceAction}, or an action within an array of {@link PresenceAction | `PresenceAction`s}, is received on the channel, such as a new member entering the presence set. - * - * @param presence - A {@link PresenceAction} or an array of {@link PresenceAction | `PresenceAction`s} to register the listener for. - * @param listener - An event listener function. - * @param callbackWhenAttached - A function which will be called upon completion of the channel {@link RealtimeChannelCallbacks.attach | `attach()`} operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - subscribe( - presence: PresenceAction | Array, - listener?: messageCallback, - callbackWhenAttached?: errorCallback - ): void; - /** - * Registers a listener that is called each time a {@link PresenceMessage} is received on the channel, such as a new member entering the presence set. - * - * @param listener - An event listener function. - * @param callbackWhenAttached - A function which will be called upon completion of the channel {@link RealtimeChannelCallbacks.attach | `attach()`} operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - subscribe(listener: messageCallback, callbackWhenAttached?: errorCallback): void; - /** - * Enters the presence set for the channel, passing a `data` payload. A `clientId` is required to be present on a channel. - * - * @param data - The data payload or {@link PresenceMessage} associated with the presence member. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - enter(data?: any, callback?: errorCallback): void; - /** - * Enters the presence set for the channel. A `clientId` is required to be present on a channel. - * - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - enter(callback?: errorCallback): void; - /** - * Updates the `data` payload for a presence member. If called before entering the presence set, this is treated as an {@link PresenceAction.ENTER} event. - * - * @param data - The data payload or {@link PresenceMessage} object to update for the presence member. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - update(data?: any, callback?: errorCallback): void; - /** - * Leaves the presence set for the channel. A client must have previously entered the presence set before they can leave it. - * - * @param data - The data payload or {@link PresenceMessage} associated with the presence member. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - leave(data?: any, callback?: errorCallback): void; - /** - * Leaves the presence set for the channel. A client must have previously entered the presence set before they can leave it. - * - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - leave(callback?: errorCallback): void; - /** - * Enters the presence set of the channel for a given `clientId`. Enables a single client to update presence on behalf of any number of clients using a single connection. The library must have been instantiated with an API key or a token bound to a wildcard `clientId`. - * - * @param clientId - The ID of the client to enter into the presence set. - * @param data - The data payload or {@link PresenceMessage} associated with the presence member. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - enterClient(clientId: string, data?: any, callback?: errorCallback): void; - /** - * Enters the presence set of the channel for a given `clientId`. Enables a single client to update presence on behalf of any number of clients using a single connection. The library must have been instantiated with an API key or a token bound to a wildcard `clientId`. - * - * @param clientId - The ID of the client to enter into the presence set. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - enterClient(clientId: string, callback?: errorCallback): void; - /** - * Updates the `data` payload for a presence member using a given `clientId`. Enables a single client to update presence on behalf of any number of clients using a single connection. The library must have been instantiated with an API key or a token bound to a wildcard `clientId`. - * - * @param clientId - The ID of the client to update in the presence set. - * @param data - The data payload or {@link PresenceMessage} object to update for the presence member. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - updateClient(clientId: string, data?: any, callback?: errorCallback): void; - /** - * Leaves the presence set of the channel for a given `clientId`. Enables a single client to update presence on behalf of any number of clients using a single connection. The library must have been instantiated with an API key or a token bound to a wildcard `clientId`. - * - * @param clientId - The ID of the client to leave the presence set for. - * @param data - The data payload or {@link PresenceMessage} associated with the presence member. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - leaveClient(clientId: string, data?: any, callback?: errorCallback): void; - /** - * Leaves the presence set of the channel for a given `clientId`. Enables a single client to update presence on behalf of any number of clients using a single connection. The library must have been instantiated with an API key or a token bound to a wildcard `clientId`. - * - * @param clientId - The ID of the client to leave the presence set for. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - leaveClient(clientId: string, callback?: errorCallback): void; - } - - /** - * Enables the presence set to be entered and subscribed to, and the historic presence set to be retrieved for a channel. - */ - class RealtimePresencePromise extends RealtimePresenceBase { /** * Retrieves the current members present on the channel and the metadata for each member, such as their {@link PresenceAction} and ID. Returns an array of {@link PresenceMessage} objects. * @@ -2561,7 +2040,7 @@ declare namespace Types { * * @param action - A {@link PresenceAction} or an array of {@link PresenceAction | `PresenceAction`s} to register the listener for. * @param listener - An event listener function. - * @returns A promise which resolves upon success of the channel {@link RealtimeChannelPromise.attach | `attach()`} operation and rejects with an {@link ErrorInfo} object upon its failure. + * @returns A promise which resolves upon success of the channel {@link RealtimeChannel.attach | `attach()`} operation and rejects with an {@link ErrorInfo} object upon its failure. */ subscribe( action: PresenceAction | Array, @@ -2571,7 +2050,7 @@ declare namespace Types { * Registers a listener that is called each time a {@link PresenceMessage} is received on the channel, such as a new member entering the presence set. * * @param listener - An event listener function. - * @returns A promise which resolves upon success of the channel {@link RealtimeChannelPromise.attach | `attach()`} operation and rejects with an {@link ErrorInfo} object upon its failure. + * @returns A promise which resolves upon success of the channel {@link RealtimeChannel.attach | `attach()`} operation and rejects with an {@link ErrorInfo} object upon its failure. */ subscribe(listener?: messageCallback): Promise; /** @@ -2622,83 +2101,18 @@ declare namespace Types { } /** - * The `ChannelBase` class acts as a base class for the {@link ChannelCallbacks} and {@link ChannelPromise} classes. + * Enables messages to be published and historic messages to be retrieved for a channel. */ - class ChannelBase { + class Channel { /** * The channel name. */ name: string; - } - - /** - * Enables messages to be published and historic messages to be retrieved for a channel. - */ - class ChannelCallbacks extends ChannelBase { - /** - * A {@link PresenceCallbacks} object. - */ - presence: PresenceCallbacks; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link Message} objects for the channel. If the channel is configured to persist messages, then messages can be retrieved from history for up to 72 hours in the past. If not, messages can only be retrieved from history for up to two minutes in the past. - * - * @param params - A set of parameters which are used to specify which messages should be retrieved. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Message} objects. Upon failure, the function will be called with information about the error. - */ - history(params?: RestHistoryParams, callback?: paginatedResultCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link Message} objects for the channel. If the channel is configured to persist messages, then messages can be retrieved from history for up to 72 hours in the past. If not, messages can only be retrieved from history for up to two minutes in the past. - * - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Message} objects. Upon failure, the function will be called with information about the error. - */ - history(callback?: paginatedResultCallback): void; - /** - * Publishes a single message to the channel with the given event name and payload. - * - * @param name - The name of the message. - * @param data - The payload of the message. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(name: string, data: any, callback?: errorCallback): void; - /** - * Publishes an array of messages to the channel. - * - * @param messages - An array of {@link Message} objects. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(messages: any[], callback?: errorCallback): void; - /** - * Publishes a message to the channel. - * - * @param message - A {@link Message} object. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(message: any, callback?: errorCallback): void; - /** - * Publishes a single message to the channel with the given event name and payload. - * - * @param name - The name of the message. - * @param data - The payload of the message. - * @param options - Optional parameters, such as [`quickAck`](https://faqs.ably.com/why-are-some-rest-publishes-on-a-channel-slow-and-then-typically-faster-on-subsequent-publishes) sent as part of the query string. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(name: string, data: any, options?: PublishOptions, callback?: errorCallback): void; - /** - * Retrieves a {@link ChannelDetails} object for the channel, which includes status and occupancy metrics. - * - * @param callback - A function which, upon success, will be called a {@link ChannelDetails} object. Upon failure, the function will be called with information about the error. - */ - status(callback: StandardCallback): void; - } - /** - * Enables messages to be published and historic messages to be retrieved for a channel. - */ - class ChannelPromise extends ChannelBase { /** - * A {@link PresencePromise} object. + * A {@link Presence} object. */ - presence: PresencePromise; + presence: Presence; /** * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link Message} objects for the channel. If the channel is configured to persist messages, then messages can be retrieved from history for up to 72 hours in the past. If not, messages can only be retrieved from history for up to two minutes in the past. * @@ -2740,9 +2154,9 @@ declare namespace Types { } /** - * The `RealtimeChannelBase` class acts as a base class for the {@link RealtimeChannelCallbacks} and {@link RealtimeChannelPromise} classes. + * Enables messages to be published and subscribed to. Also enables historic messages to be retrieved and provides access to the {@link RealtimePresence} object of a channel. */ - class RealtimeChannelBase extends EventEmitter { + class RealtimeChannel extends EventEmitter { /** * The channel name. */ @@ -2806,176 +2220,13 @@ declare namespace Types { * Deregisters all listeners to messages on this channel. This removes all earlier subscriptions. */ unsubscribe(): void; - } - - /** - * Optional parameters for message publishing. - */ - type PublishOptions = { - /** - * See [here](https://faqs.ably.com/why-are-some-rest-publishes-on-a-channel-slow-and-then-typically-faster-on-subsequent-publishes). - */ - quickAck?: boolean; - }; - - /** - * Contains properties to filter messages with when calling {@link RealtimeChannelCallbacks.subscribe | `RealtimeChannelCallbacks.subscribe()`} or {@link RealtimeChannelPromise.subscribe | `RealtimeChannelPromise.subscribe()`}. - */ - type MessageFilter = { - /** - * Filters messages by a specific message `name`. - */ - name?: string; - /** - * Filters messages by a specific `extras.ref.timeserial` value. - */ - refTimeserial?: string; - /** - * Filters messages by a specific `extras.ref.type` value. - */ - refType?: string; - /** - * Filters messages based on whether they contain an `extras.ref`. - */ - isRef?: boolean; - /** - * Filters messages by a specific message `clientId`. - */ - clientId: string; - }; - - /** - * Enables messages to be published and subscribed to. Also enables historic messages to be retrieved and provides access to the {@link RealtimePresenceCallbacks} object of a channel. - */ - class RealtimeChannelCallbacks extends RealtimeChannelBase { - /** - * A {@link RealtimePresenceCallbacks} object. - */ - presence: RealtimePresenceCallbacks; - /** - * Attach to this channel ensuring the channel is created in the Ably system and all messages published on the channel are received by any channel listeners registered using {@link RealtimeChannelCallbacks.subscribe | `subscribe()`}. Any resulting channel state change will be emitted to any listeners registered using the {@link EventEmitter.on | `on()`} or {@link EventEmitter.once | `once()`} methods. As a convenience, `attach()` is called implicitly if {@link RealtimeChannelCallbacks.subscribe | `subscribe()`} for the channel is called, or {@link RealtimePresenceCallbacks.enter | `enter()`} or {@link RealtimePresenceCallbacks.subscribe | `subscribe()`} are called on the {@link RealtimePresenceCallbacks} object for this channel. - * - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded and the channel became attached, then the function will be called with a {@link ChannelStateChange} object. If the channel was already attached the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - attach(callback?: StandardCallback): void; - /** - * Detach from this channel. Any resulting channel state change is emitted to any listeners registered using the {@link EventEmitter.on | `on()`} or {@link EventEmitter.once | `once()`} methods. Once all clients globally have detached from the channel, the channel will be released in the Ably service within two minutes. - * - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - detach(callback?: errorCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link Message} objects for the channel. If the channel is configured to persist messages, then messages can be retrieved from history for up to 72 hours in the past. If not, messages can only be retrieved from history for up to two minutes in the past. - * - * @param params - A set of parameters which are used to specify which presence members should be retrieved. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Message} objects. Upon failure, the function will be called with information about the error. - */ - history(params?: RealtimeHistoryParams, callback?: paginatedResultCallback): void; - /** - * Retrieves a {@link Types.PaginatedResult} object, containing an array of historical {@link Message} objects for the channel. If the channel is configured to persist messages, then messages can be retrieved from history for up to 72 hours in the past. If not, messages can only be retrieved from history for up to two minutes in the past. - * - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link Message} objects. Upon failure, the function will be called with information about the error. - */ - history(callback?: paginatedResultCallback): void; - /** - * Sets the {@link ChannelOptions} for the channel. - * - * @param options - A {@link ChannelOptions} object. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - setOptions(options: ChannelOptions, callback?: errorCallback): void; - /** - * Registers a listener for messages with a given event name on this channel. The caller supplies a listener function, which is called each time one or more matching messages arrives on the channel. - * - * @param event - The event name. - * @param listener - An event listener function. - * @param callbackWhenAttached - A function which will be called upon completion of the channel {@link RealtimeChannelCallbacks.attach | `attach()`} operation. If the operation succeeded and the channel became attached, then the function will be called with a {@link ChannelStateChange} object. If the channel was already attached the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - subscribe( - event: string, - listener?: messageCallback, - callbackWhenAttached?: StandardCallback - ): void; - /** - * Registers a listener for messages on this channel for multiple event name values. - * - * @param events - An array of event names. - * @param listener - An event listener function. - * @param callbackWhenAttached - A function which will be called upon completion of the channel {@link RealtimeChannelCallbacks.attach | `attach()`} operation. If the operation succeeded and the channel became attached, then the function will be called with a {@link ChannelStateChange} object. If the channel was already attached the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - subscribe( - events: Array, - listener?: messageCallback, - callbackWhenAttached?: StandardCallback - ): void; - /** - * Registers a listener for messages on this channel that match the supplied filter. - * - * @param filter - A {@link MessageFilter}. - * @param listener - An event listener function. - * @param callbackWhenAttached - A function which will be called upon completion of the channel {@link RealtimeChannelCallbacks.attach | `attach()`} operation. If the operation succeeded and the channel became attached, then the function will be called with a {@link ChannelStateChange} object. If the channel was already attached the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - subscribe( - filter: MessageFilter, - listener?: messageCallback, - callbackWhenAttached?: StandardCallback - ): void; - /** - * Registers a listener for messages on this channel. The caller supplies a listener function, which is called each time one or more messages arrives on the channel. - * - * @param listener - An event listener function. - * @param callbackWhenAttached - A function which will be called upon completion of the channel {@link RealtimeChannelCallbacks.attach | `attach()`} operation. If the operation succeeded and the channel became attached, then the function will be called with a {@link ChannelStateChange} object. If the channel was already attached the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - subscribe(listener: messageCallback, callbackWhenAttached?: StandardCallback): void; - /** - * Publishes a single message to the channel with the given event name and payload. When publish is called with this client library, it won't attempt to implicitly attach to the channel, so long as [transient publishing](https://ably.com/docs/realtime/channels#transient-publish) is available in the library. Otherwise, the client will implicitly attach. - * - * @param name - The event name. - * @param data - The message payload. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(name: string, data: any, callback?: errorCallback): void; - /** - * Publishes an array of messages to the channel. When publish is called with this client library, it won't attempt to implicitly attach to the channel. - * - * @param messages - An array of {@link Message} objects. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(messages: any[], callback?: errorCallback): void; - /** - * Publish a message to the channel. When publish is called with this client library, it won't attempt to implicitly attach to the channel. - * - * @param message - A {@link Message} object. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(message: any, callback?: errorCallback): void; - /** - * Publishes a single message to the channel with the given event name and payload. When publish is called with this client library, it won't attempt to implicitly attach to the channel, so long as [transient publishing](https://ably.com/docs/realtime/channels#transient-publish) is available in the library. Otherwise, the client will implicitly attach. - * - * @param name - The event name. - * @param data - The message payload. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(name: string, data: any, callback?: errorCallback): void; - /** - * Calls the supplied function when the channel reaches the specified {@link ChannelState}. If the channel is already in the specified state, the callback is called immediately. - * - * @param targetState - The state which should be reached. - * @param callback - A function which will be called when the channel has reached the specified {@link ChannelState} with a {@link ChannelStateChange} object as the first argument. - */ - whenState(targetState: ChannelState, callback: channelEventCallback): void; - } - /** - * Enables messages to be published and subscribed to. Also enables historic messages to be retrieved and provides access to the {@link RealtimePresencePromise} object of a channel. - */ - class RealtimeChannelPromise extends RealtimeChannelBase { /** - * A {@link RealtimePresencePromise} object. + * A {@link RealtimePresence} object. */ - presence: RealtimePresencePromise; + presence: RealtimePresence; /** - * Attach to this channel ensuring the channel is created in the Ably system and all messages published on the channel are received by any channel listeners registered using {@link RealtimeChannelPromise.subscribe | `subscribe()`}. Any resulting channel state change will be emitted to any listeners registered using the {@link EventEmitter.on | `on()`} or {@link EventEmitter.once | `once()`} methods. As a convenience, `attach()` is called implicitly if {@link RealtimeChannelPromise.subscribe | `subscribe()`} for the channel is called, or {@link RealtimePresencePromise.enter | `enter()`} or {@link RealtimePresencePromise.subscribe | `subscribe()`} are called on the {@link RealtimePresencePromise} object for this channel. + * Attach to this channel ensuring the channel is created in the Ably system and all messages published on the channel are received by any channel listeners registered using {@link RealtimeChannel.subscribe | `subscribe()`}. Any resulting channel state change will be emitted to any listeners registered using the {@link EventEmitter.on | `on()`} or {@link EventEmitter.once | `once()`} methods. As a convenience, `attach()` is called implicitly if {@link RealtimeChannel.subscribe | `subscribe()`} for the channel is called, or {@link RealtimePresence.enter | `enter()`} or {@link RealtimePresence.subscribe | `subscribe()`} are called on the {@link RealtimePresence} object for this channel. * * @returns A promise which, upon success, if the channel became attached will be fulfilled with a {@link ChannelStateChange} object. If the channel was already attached the promise will be fulfilled with `null`. Upon failure, the promise will be rejected with an {@link ErrorInfo} object. */ @@ -3062,15 +2313,51 @@ declare namespace Types { } /** - * Creates and destroys {@link ChannelBase} and {@link RealtimeChannelBase} objects. + * Optional parameters for message publishing. + */ + type PublishOptions = { + /** + * See [here](https://faqs.ably.com/why-are-some-rest-publishes-on-a-channel-slow-and-then-typically-faster-on-subsequent-publishes). + */ + quickAck?: boolean; + }; + + /** + * Contains properties to filter messages with when calling {@link RealtimeChannel.subscribe | `RealtimeChannel.subscribe()`}. + */ + type MessageFilter = { + /** + * Filters messages by a specific message `name`. + */ + name?: string; + /** + * Filters messages by a specific `extras.ref.timeserial` value. + */ + refTimeserial?: string; + /** + * Filters messages by a specific `extras.ref.type` value. + */ + refType?: string; + /** + * Filters messages based on whether they contain an `extras.ref`. + */ + isRef?: boolean; + /** + * Filters messages by a specific message `clientId`. + */ + clientId: string; + }; + + /** + * Creates and destroys {@link Channel} and {@link RealtimeChannel} objects. */ class Channels { /** - * Creates a new {@link ChannelBase} or {@link RealtimeChannelBase} object, with the specified {@link ChannelOptions}, or returns the existing channel object. + * Creates a new {@link Channel} or {@link RealtimeChannel} object, with the specified {@link ChannelOptions}, or returns the existing channel object. * * @param name - The channel name. * @param channelOptions - A {@link ChannelOptions} object. - * @returns A {@link ChannelBase} or {@link RealtimeChannelBase} object. + * @returns A {@link Channel} or {@link RealtimeChannel} object. */ get(name: string, channelOptions?: ChannelOptions): T; /** @@ -3079,17 +2366,17 @@ declare namespace Types { * to receive only part of the data from the channel. * See the [announcement post](https://pages.ably.com/subscription-filters-preview) for more information. * - * Creates a new {@link ChannelBase} or {@link RealtimeChannelBase} object, with the specified channel {@link DeriveOptions} + * Creates a new {@link Channel} or {@link RealtimeChannel} object, with the specified channel {@link DeriveOptions} * and {@link ChannelOptions}, or returns the existing channel object. * * @param name - The channel name. * @param deriveOptions - A {@link DeriveOptions} object. * @param channelOptions - A {@link ChannelOptions} object. - * @returns A {@link RealtimeChannelBase} object. + * @returns A {@link RealtimeChannel} object. */ getDerived(name: string, deriveOptions: DeriveOptions, channelOptions?: ChannelOptions): T; /** - * Releases a {@link ChannelBase} or {@link RealtimeChannelBase} object, deleting it, and enabling it to be garbage collected. It also removes any listeners associated with the channel. To release a channel, the {@link ChannelState} must be `INITIALIZED`, `DETACHED`, or `FAILED`. + * Releases a {@link Channel} or {@link RealtimeChannel} object, deleting it, and enabling it to be garbage collected. It also removes any listeners associated with the channel. To release a channel, the {@link ChannelState} must be `INITIALIZED`, `DETACHED`, or `FAILED`. * * @param name - The channel name. */ @@ -3111,17 +2398,17 @@ declare namespace Types { * * @param JsonObject - A `Message`-like deserialized object. * @param channelOptions - A {@link ChannelOptions} object. If you have an encrypted channel, use this to allow the library to decrypt the data. - * @returns A `Message` object. + * @returns A promise which will be fulfilled with a `Message` object. */ - static fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => Message; + static fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => Promise; /** * A static factory method to create an array of `Message` objects from an array of deserialized Message-like object encoded using Ably's wire protocol. * * @param JsonArray - An array of `Message`-like deserialized objects. * @param channelOptions - A {@link ChannelOptions} object. If you have an encrypted channel, use this to allow the library to decrypt the data. - * @returns An array of {@link Message} objects. + * @returns A promise which will be fulfilled with an array of {@link Message} objects. */ - static fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => Message[]; + static fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => Promise; /** * The client ID of the publisher of this message. */ @@ -3165,17 +2452,17 @@ declare namespace Types { * * @param JsonObject - A `Message`-like deserialized object. * @param channelOptions - A {@link ChannelOptions} object. If you have an encrypted channel, use this to allow the library to decrypt the data. - * @returns A `Message` object. + * @returns A promise which will be fulfilled with a `Message` object. */ - fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => Message; + fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => Promise; /** * A static factory method to create an array of `Message` objects from an array of deserialized Message-like object encoded using Ably's wire protocol. * * @param JsonArray - An array of `Message`-like deserialized objects. * @param channelOptions - A {@link ChannelOptions} object. If you have an encrypted channel, use this to allow the library to decrypt the data. - * @returns An array of {@link Message} objects. + * @returns A promise which will be fulfilled with an array of {@link Message} objects. */ - fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => Message[]; + fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => Promise; } /** @@ -3194,14 +2481,14 @@ declare namespace Types { * @param JsonObject - The deserialized `PresenceMessage`-like object to decode and decrypt. * @param channelOptions - A {@link ChannelOptions} object containing the cipher. */ - static fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => PresenceMessage; + static fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => Promise; /** * Decodes and decrypts an array of deserialized `PresenceMessage`-like object using the cipher in {@link ChannelOptions}. Any residual transforms that cannot be decoded or decrypted will be in the `encoding` property. Intended for users receiving messages from a source other than a REST or Realtime channel (for example a queue) to avoid having to parse the encoding string. * * @param JsonArray - An array of deserialized `PresenceMessage`-like objects to decode and decrypt. * @param channelOptions - A {@link ChannelOptions} object containing the cipher. */ - static fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => PresenceMessage[]; + static fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => Promise; /** * The type of {@link PresenceAction} the `PresenceMessage` is for. */ @@ -3246,14 +2533,14 @@ declare namespace Types { * @param JsonObject - The deserialized `PresenceMessage`-like object to decode and decrypt. * @param channelOptions - A {@link ChannelOptions} object containing the cipher. */ - fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => PresenceMessage; + fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => Promise; /** * Decodes and decrypts an array of deserialized `PresenceMessage`-like object using the cipher in {@link ChannelOptions}. Any residual transforms that cannot be decoded or decrypted will be in the `encoding` property. Intended for users receiving messages from a source other than a REST or Realtime channel (for example a queue) to avoid having to parse the encoding string. * * @param JsonArray - An array of deserialized `PresenceMessage`-like objects to decode and decrypt. * @param channelOptions - A {@link ChannelOptions} object containing the cipher. */ - fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => PresenceMessage[]; + fromEncodedArray: (JsonArray: any[], channelOptions?: ChannelOptions) => Promise; /** * Initialises a `PresenceMessage` from a `PresenceMessage`-like object. @@ -3269,12 +2556,9 @@ declare namespace Types { */ type CipherKeyParam = ArrayBuffer | Uint8Array | string; // if string must be base64-encoded /** - * Typed differently depending on platform. (`WordArray` in browser, `Buffer` in node) - * - * @internal + * The type of the key returned by {@link Crypto.generateRandomKey}. Typed differently depending on platform (`Buffer` in Node.js, `ArrayBuffer` elsewhere). */ - type CipherKey = unknown; // WordArray on browsers, Buffer on node, using unknown as - // user should not be interacting with it - output of getDefaultParams should be used opaquely + type CipherKey = ArrayBuffer | Buffer; /** * Contains the properties used to generate a {@link CipherParams} object. @@ -3306,22 +2590,22 @@ declare namespace Types { * Generates a random key to be used in the encryption of the channel. If the language cryptographic randomness primitives are blocking or async, a callback is used. The callback returns a generated binary key. * * @param keyLength - The length of the key, in bits, to be generated. If not specified, this is equal to the default `keyLength` of the default algorithm: for AES this is 256 bits. - * @param callback - A function which, upon success, will be called with the generated key as a binary, for example, a byte array. Upon failure, the function will be called with information about the error. + * @returns A promise which, upon success, will be fulfilled with the generated key as a binary, for example, a byte array. Upon failure, the promise will be rejected with an {@link Types.ErrorInfo} object which explains the error. */ - generateRandomKey(keyLength?: number, callback?: Types.StandardCallback): void; + generateRandomKey(keyLength?: number): Promise; /** * Returns a {@link CipherParams} object, using the default values for any fields not supplied by the {@link CipherParamOptions} object. * * @param params - A {@link CipherParamOptions} object. - * @param callback - A function which, upon success, will be called with a {@link CipherParams} object, using the default values for any fields not supplied. Upon failure, the function will be called with information about the error. + * @returns A {@link CipherParams} object, using the default values for any fields not supplied. */ - getDefaultParams(params: CipherParamOptions, callback: Types.StandardCallback): void; + getDefaultParams(params: CipherParamOptions): CipherParams; } /** - * The `ConnectionBase` class acts as a base class for the {@link ChannelCallbacks} and {@link ChannelPromise} classes. + * Enables the management of a connection to Ably. */ - class ConnectionBase extends EventEmitter { + class Connection extends EventEmitter { /** * An {@link ErrorInfo} object describing the last error received if a connection failure occurs. */ @@ -3347,38 +2631,14 @@ declare namespace Types { */ readonly state: ConnectionState; /** - * Causes the connection to close, entering the {@link ConnectionState.CLOSING} state. Once closed, the library does not attempt to re-establish the connection without an explicit call to {@link ConnectionBase.connect | `connect()`}. + * Causes the connection to close, entering the {@link ConnectionState.CLOSING} state. Once closed, the library does not attempt to re-establish the connection without an explicit call to {@link Connection.connect | `connect()`}. */ close(): void; /** * Explicitly calling `connect()` is unnecessary unless the `autoConnect` attribute of the {@link ClientOptions} object is `false`. Unless already connected or connecting, this method causes the connection to open, entering the {@link ConnectionState.CONNECTING} state. */ connect(): void; - } - /** - * Enables the management of a connection to Ably. - */ - class ConnectionCallbacks extends ConnectionBase { - /** - * When connected, sends a heartbeat ping to the Ably server and executes the callback with any error and the response time in milliseconds when a heartbeat ping request is echoed from the server. This can be useful for measuring true round-trip latency to the connected Ably server. - * - * @param callback - A function which, upon success, will be called with the response time in milliseconds. Upon failure, the function will be called with information about the error. - */ - ping(callback?: Types.StandardCallback): void; - /** - * Calls the supplied function when the connection reaches the specified {@link ConnectionState}. If the connection is already in the specified state, the callback is called immediately. - * - * @param targetState - The state which should be reached. - * @param callback - A function which will be called when the connection has reached the specified {@link ConnectionState} with a {@link ConnectionStateChange} object as the first argument. - */ - whenState(targetState: ConnectionState, callback: connectionEventCallback): void; - } - - /** - * Enables the management of a connection to Ably. - */ - class ConnectionPromise extends ConnectionBase { /** * When connected, sends a heartbeat ping to the Ably server and executes the callback with any error and the response time in milliseconds when a heartbeat ping request is echoed from the server. This can be useful for measuring true round-trip latency to the connected Ably server. * @@ -3443,36 +2703,18 @@ declare namespace Types { * Contains the current page of results; for example, an array of {@link Message} or {@link PresenceMessage} objects for a channel history request. */ items: T[]; - /** - * Returns a new `PaginatedResult` for the first page of results. - * - * @param results - A function which, upon success, will be called with a page of results for message and presence history, stats, and REST presence requests. Upon failure, the function will be called with information about the error. - */ - first(results: paginatedResultCallback): void; /** * Returns a new `PaginatedResult` for the first page of results. * * @returns A promise which, upon success, will be fulfilled with a page of results for message and presence history, stats, and REST presence requests. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. */ first(): Promise>; - /** - * Returns a new `PaginatedResult` loaded with the next page of results. If there are no further pages, then `null` is returned. - * - * @param results - A function which, upon success, will be fulfilled with a page of results for message and presence history, stats, and REST presence requests. Upon failure, the function will be called with information about the error. - */ - next(results: paginatedResultCallback): void; /** * Returns a new `PaginatedResult` loaded with the next page of results. If there are no further pages, then `null` is returned. * * @returns A promise which, upon success, will be fulfilled with a page of results for message and presence history, stats, and REST presence requests. Upon failure, the promise will be rejected with an {@link ErrorInfo} object which explains the error. */ next(): Promise>; - /** - * Returns the `PaginatedResult` for the current page of results. - * - * @param results - A function which, upon success, will be fulfilled with a page of results for message and presence history, stats, and REST presence requests. Upon failure, the function will be called with information about the error. - */ - current(results: paginatedResultCallback): void; /** * Returns the `PaginatedResult` for the current page of results. */ @@ -3520,57 +2762,25 @@ declare namespace Types { /** * Enables a device to be registered and deregistered from receiving push notifications. */ - class PushCallbacks { - /** - * A {@link PushAdminCallbacks} object. - */ - admin: PushAdminCallbacks; - } - - /** - * Enables a device to be registered and deregistered from receiving push notifications. - */ - class PushPromise { + class Push { /** - * A {@link PushAdminPromise | `PushAdmin`} object. + * A {@link PushAdmin} object. */ - admin: PushAdminPromise; + admin: PushAdmin; } /** * Enables the management of device registrations and push notification subscriptions. Also enables the publishing of push notifications to devices. */ - class PushAdminCallbacks { + class PushAdmin { /** - * A {@link PushDeviceRegistrationsCallbacks} object. + * A {@link PushDeviceRegistrations} object. */ - deviceRegistrations: PushDeviceRegistrationsCallbacks; + deviceRegistrations: PushDeviceRegistrations; /** - * A {@link PushChannelSubscriptionsCallbacks} object. + * A {@link PushChannelSubscriptions} object. */ - channelSubscriptions: PushChannelSubscriptionsCallbacks; - /** - * Sends a push notification directly to a device, or a group of devices sharing the same `clientId`. - * - * @param recipient - A JSON object containing the recipient details using `clientId`, `deviceId` or the underlying notifications service. - * @param payload - A JSON object containing the push notification payload. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - publish(recipient: any, payload: any, callback?: errorCallback): void; - } - - /** - * Enables the management of device registrations and push notification subscriptions. Also enables the publishing of push notifications to devices. - */ - class PushAdminPromise { - /** - * A {@link PushDeviceRegistrationsPromise} object. - */ - deviceRegistrations: PushDeviceRegistrationsPromise; - /** - * A {@link PushChannelSubscriptionsPromise} object. - */ - channelSubscriptions: PushChannelSubscriptionsPromise; + channelSubscriptions: PushChannelSubscriptions; /** * Sends a push notification directly to a device, or a group of devices sharing the same `clientId`. * @@ -3584,62 +2794,7 @@ declare namespace Types { /** * Enables the management of push notification registrations with Ably. */ - class PushDeviceRegistrationsCallbacks { - /** - * Registers or updates a {@link DeviceDetails} object with Ably. Returns the new, or updated {@link DeviceDetails} object. - * - * @param deviceDetails - The {@link DeviceDetails} object to create or update. - * @param callback - A function which, upon success, will be called with a {@link DeviceDetails} object. Upon failure, the function will be called with information about the error. - */ - save(deviceDetails: DeviceDetails, callback?: Types.StandardCallback): void; - /** - * Retrieves the {@link DeviceDetails} of a device registered to receive push notifications using its `deviceId`. - * - * @param deviceId - The unique ID of the device. - * @param callback - A function which, upon success, will be called with a {@link DeviceDetails} object. Upon failure, the function will be called with information about the error. - */ - get(deviceId: string, callback: Types.StandardCallback): void; - /** - * Retrieves the {@link DeviceDetails} of a device registered to receive push notifications using the `id` property of a {@link DeviceDetails} object. - * - * @param deviceDetails - The {@link DeviceDetails} object containing the `id` property of the device. - * @param callback - A function which, upon success, will be called with a {@link DeviceDetails} object. Upon failure, the function will be called with information about the error. - */ - get(deviceDetails: DeviceDetails, callback: Types.StandardCallback): void; - /** - * Retrieves all devices matching the filter `params` provided. Returns a {@link Types.PaginatedResult} object, containing an array of {@link DeviceDetails} objects. - * - * @param params - An object containing key-value pairs to filter devices by. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link DeviceDetails} objects. Upon failure, the function will be called with information about the error. - */ - list(params: DeviceRegistrationParams, callback: paginatedResultCallback): void; - /** - * Removes a device registered to receive push notifications from Ably using its `deviceId`. - * - * @param deviceId - The unique ID of the device. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - remove(deviceId: string, callback?: errorCallback): void; - /** - * Removes a device registered to receive push notifications from Ably using the `id` property of a {@link DeviceDetails} object. - * - * @param deviceDetails - The {@link DeviceDetails} object containing the `id` property of the device. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - remove(deviceDetails: DeviceDetails, callback?: errorCallback): void; - /** - * Removes all devices registered to receive push notifications from Ably matching the filter `params` provided. - * - * @param params - An object containing key-value pairs to filter devices by. This object’s {@link DeviceRegistrationParams.limit} property will be ignored. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - removeWhere(params: DeviceRegistrationParams, callback?: errorCallback): void; - } - - /** - * Enables the management of push notification registrations with Ably. - */ - class PushDeviceRegistrationsPromise { + class PushDeviceRegistrations { /** * Registers or updates a {@link DeviceDetails} object with Ably. Returns the new, or updated {@link DeviceDetails} object. * @@ -3694,48 +2849,7 @@ declare namespace Types { /** * Enables device push channel subscriptions. */ - class PushChannelSubscriptionsCallbacks { - /** - * Subscribes a device, or a group of devices sharing the same `clientId` to push notifications on a channel. Returns a {@link PushChannelSubscription} object. - * - * @param subscription - A {@link PushChannelSubscription} object. - * @param callback - A function which, upon success, will be called with a {@link PushChannelSubscription} object describing the new or updated subscriptions. Upon failure, the function will be called with information about the error. - */ - save(subscription: PushChannelSubscription, callback?: Types.StandardCallback): void; - /** - * Retrieves all push channel subscriptions matching the filter `params` provided. Returns a {@link Types.PaginatedResult} object, containing an array of {@link PushChannelSubscription} objects. - * - * @param params - An object containing key-value pairs to filter subscriptions by. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of {@link PushChannelSubscription} objects. Upon failure, the function will be called with information about the error. - */ - list(params: PushChannelSubscriptionParams, callback: paginatedResultCallback): void; - /** - * Retrieves all channels with at least one device subscribed to push notifications. Returns a {@link Types.PaginatedResult} object, containing an array of channel names. - * - * @param params - An object containing key-value pairs to filter channels by. - * @param callback - A function which, upon success, will be called with a {@link Types.PaginatedResult} object containing an array of channel names. Upon failure, the function will be called with information about the error. - */ - listChannels(params: PushChannelsParams, callback: paginatedResultCallback): void; - /** - * Unsubscribes a device, or a group of devices sharing the same `clientId` from receiving push notifications on a channel. - * - * @param subscription - A {@link PushChannelSubscription} object. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - remove(subscription: PushChannelSubscription, callback?: errorCallback): void; - /** - * Unsubscribes all devices from receiving push notifications on a channel that match the filter `params` provided. - * - * @param params - An object containing key-value pairs to filter subscriptions by. Can contain `channel`, and optionally either `clientId` or `deviceId`. - * @param callback - A function which will be called upon completion of the operation. If the operation succeeded, then the function will be called with `null`. If it failed, the function will be called with information about the error. - */ - removeWhere(params: PushChannelSubscriptionParams, callback?: errorCallback): void; - } - - /** - * Enables device push channel subscriptions. - */ - class PushChannelSubscriptionsPromise { + class PushChannelSubscriptions { /** * Subscribes a device, or a group of devices sharing the same `clientId` to push notifications on a channel. Returns a {@link PushChannelSubscription} object. * @@ -3777,12 +2891,12 @@ declare namespace Types { /** * A client that offers a simple stateless API to interact directly with Ably's REST API. */ -export declare class Rest extends Types.RestCallbacks {} +export declare class Rest extends Types.Rest {} /** * A client that extends the functionality of {@link Rest} and provides additional realtime-specific features. */ -export declare class Realtime extends Types.RealtimeCallbacks {} +export declare class Realtime extends Types.Realtime {} /** * A generic Ably error object that contains an Ably-specific status code, and a generic status code. Errors returned from the Ably server are compatible with the `ErrorInfo` structure and should result in errors that inherit from `ErrorInfo`. diff --git a/callbacks.d.ts b/callbacks.d.ts deleted file mode 100644 index e0a434a3dd..0000000000 --- a/callbacks.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import Ably = require('./ably'); -export = Ably; diff --git a/callbacks.js b/callbacks.js deleted file mode 100644 index 8bfe2c458f..0000000000 --- a/callbacks.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; -/* When returning promises becomes the default in some future version, this - * file will start modifying the exports as promises.js does today. - * Please note that the file imported below is only generated after running - * the build task. */ -module.exports = require('./build/ably-node'); diff --git a/docs/landing-page.md b/docs/landing-page.md new file mode 100644 index 0000000000..f9a0bb6212 --- /dev/null +++ b/docs/landing-page.md @@ -0,0 +1,7 @@ +# Ably JavaScript Client Library SDK API Reference + +The JavaScript Client Library SDK supports a realtime and a REST interface. The JavaScript API references are generated from the [Ably JavaScript Client Library SDK source code](https://github.com/ably/ably-js/) using [TypeDoc](https://typedoc.org) and structured by classes. + +The realtime interface enables a client to maintain a persistent connection to Ably and publish, subscribe and be present on channels. The REST interface is stateless and typically implemented server-side. It is used to make requests such as retrieving statistics, token authentication and publishing to a channel. + +View the [Ably docs](https://ably.com/docs/) for conceptual information on using Ably, and for API references featuring all languages. The combined [API references](https://ably.com/docs/api/) are organized by features and split between the [realtime](https://ably.com/docs/api/realtime-sdk) and [REST](https://ably.com/docs/api/rest-sdk) interfaces. diff --git a/docs/landing-pages/choose-library.html b/docs/landing-pages/choose-library.html deleted file mode 100644 index c4243efaf1..0000000000 --- a/docs/landing-pages/choose-library.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - Ably JavaScript Client Library SDK API Reference - - -

Ably JavaScript Client Library SDK API Reference

- -

- The JavaScript Client Library SDK supports a realtime and a REST interface. The JavaScript API references are generated from the Ably JavaScript Client Library SDK source code using TypeDoc and structured by classes. -

- -

- The realtime interface enables a client to maintain a persistent connection to Ably and publish, subscribe and be present on channels. The REST interface is stateless and typically implemented server-side. It is used to make requests such as retrieving statistics, token authentication and publishing to a channel. -

- -

- There are two API variants of the Ably JavaScript Client Library SDK: - -

-

- -

- View the Ably docs for conceptual information on using Ably, and for API references featuring all languages. The combined API references are organized by features and split between the realtime and REST interfaces. -

- - diff --git a/docs/landing-pages/default.md b/docs/landing-pages/default.md deleted file mode 100644 index 994b06cd18..0000000000 --- a/docs/landing-pages/default.md +++ /dev/null @@ -1,7 +0,0 @@ -# Ably JavaScript Client Library SDK API Reference for Callbacks - -You are currently viewing the callback-based variant of the Ably JavaScript Client Library SDK. View the promise-based variant [here](../promises/index.html). - -The callback-based variant of the API implements the common Node.js error-first callback style. - -To get started with the Ably JavaScript Client Library SDK, follow the [Quickstart Guide](https://ably.com/docs/quick-start-guide) or view the introductions to the [realtime](https://ably.com/docs/realtime/usage) and [REST](https://ably.com/docs/rest/usage) interfaces. diff --git a/docs/landing-pages/promises.md b/docs/landing-pages/promises.md deleted file mode 100644 index c312a44660..0000000000 --- a/docs/landing-pages/promises.md +++ /dev/null @@ -1,7 +0,0 @@ -# Ably JavaScript Client Library SDK API Reference for Promises - -You are currently viewing the promise-based variant of the Ably JavaScript Client Library SDK. View the callback-based variant [here](../default/index.html). - -Passing callbacks to methods when using the promise-based variant of the API is still possible, however, if a method does not receive a callback then it will instead return a promise. - -To get started with the Ably JavaScript Client Library SDK, follow the [Quickstart Guide](https://ably.com/docs/quick-start-guide) or view the introductions to the [realtime](https://ably.com/docs/realtime/usage) and [REST](https://ably.com/docs/rest/usage) interfaces. diff --git a/docs/react-migration-guide.md b/docs/react-migration-guide.md index 156f2158b5..6bc1705c2e 100644 --- a/docs/react-migration-guide.md +++ b/docs/react-migration-guide.md @@ -28,7 +28,7 @@ configureAbly(options); With this: ```jsx -const client = new Ably.Realtime.Promise(options); +const client = new Ably.Realtime(options); return {children} @@ -37,7 +37,7 @@ return If you were already using multiple Ably clients in the same react application, you may pass in an optional `id` prop to the provider, which you can then pass to the hooks to specify which Ably client instance the hook should use: ```jsx -const client = new Ably.Realtime.Promise(options); +const client = new Ably.Realtime(options); return {children} diff --git a/docs/react.md b/docs/react.md index 2a10480638..9e48063859 100644 --- a/docs/react.md +++ b/docs/react.md @@ -44,7 +44,7 @@ The `AblyProvider` should be high in your component tree, wrapping every compone import { AblyProvider } from "ably/react"; import * as Ably from "ably"; -const client = new Ably.Realtime.Promise({ key: "your-ably-api-key", clientId: 'me' }); +const client = new Ably.Realtime({ key: "your-ably-api-key", clientId: 'me' }); root.render( diff --git a/package-lock.json b/package-lock.json index 81cd8ff249..304973e065 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,7 @@ "devDependencies": { "@ably/vcdiff-decoder": "1.0.4", "@testing-library/react": "^13.3.0", - "@types/crypto-js": "^4.0.1", - "@types/node": "^15.0.0", + "@types/node": "^18.0.0", "@types/request": "^2.48.7", "@types/ws": "^8.2.0", "@typescript-eslint/eslint-plugin": "^5.14.0", @@ -26,9 +25,10 @@ "async": "ably-forks/async#requirejs", "aws-sdk": "^2.1413.0", "chai": "^4.2.0", - "copy-webpack-plugin": "^6.4.1", + "copy-webpack-plugin": "^11.0.0", "cors": "^2.8.5", - "crypto-js": "ably-forks/crypto-js#crypto-lite", + "esbuild": "^0.18.10", + "esbuild-plugin-umd-wrapper": "^1.0.7", "eslint": "^7.13.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-jsdoc": "^40.0.0", @@ -37,36 +37,33 @@ "eslint-plugin-security": "^1.4.0", "express": "^4.17.1", "glob": "~4.4", - "google-closure-compiler": "^20180610.0.1", "grunt": "^1.6.1", "grunt-bump": "^0.3.1", "grunt-cli": "~1.2.0", - "grunt-closure-tools": "^1.0.0", "grunt-contrib-concat": "~0.5", "grunt-shell": "~1.1", - "grunt-webpack": "^4.0.2", + "grunt-webpack": "^5.0.0", "hexy": "~0.2", "jsdom": "^20.0.0", "kexec": "ably-forks/node-kexec#update-for-node-12", "minimist": "^1.2.5", "mocha": "^8.1.3", - "null-loader": "^4.0.1", "playwright": "^1.10.0", - "prettier": "^2.5.1", + "prettier": "^2.8.8", "react": ">=18.1.0", "react-dom": ">=18.1.0", "requirejs": "~2.1", "shelljs": "~0.8", "source-map-explorer": "^2.5.2", - "ts-loader": "^8.2.0", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^4.0.1", "tslib": "^2.3.1", - "typedoc": "^0.23.8", - "typescript": "^4.6.4", + "typedoc": "^0.24.7", + "typescript": "^4.9.5", "vite": "^4.4.9", "vitest": "^0.18.0", - "webpack": "^4.44.2", - "webpack-cli": "^4.2.0" + "webpack": "^5.79.0", + "webpack-cli": "^5.0.1" }, "engines": { "node": ">=5.10.x" @@ -84,6 +81,15 @@ } } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ably/msgpack-js": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@ably/msgpack-js/-/msgpack-js-0.4.0.tgz", @@ -124,6 +130,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/code-frame/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -138,32 +156,77 @@ "node": ">=4" } }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -177,18 +240,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -199,12 +250,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -226,13 +277,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -251,22 +302,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -285,28 +336,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -358,44 +409,44 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -403,6 +454,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -417,10 +480,55 @@ "node": ">=4" } }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", - "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -445,16 +553,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -509,9 +617,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -521,33 +629,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -555,47 +663,47 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", - "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", + "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", "dev": true, "dependencies": { "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~3.1.0" + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19" + "node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20" } }, "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -753,9 +861,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -944,20 +1052,43 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", - "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -965,6 +1096,50 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1002,8 +1177,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -1016,9 +1189,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1026,12 +1199,12 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "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, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -1039,126 +1212,66 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "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, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "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, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=10" + "node": ">= 8.0.0" } }, - "node_modules/@npmcli/move-file/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -1202,58 +1315,78 @@ } }, "node_modules/@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", "dev": true }, "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.4.tgz", + "integrity": "sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", + "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", "dev": true }, "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.4.tgz", + "integrity": "sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==", "dev": true, "dependencies": { "@types/chai": "*" } }, - "node_modules/@types/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "node_modules/@types/eslint": { + "version": "8.44.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", + "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==" }, "node_modules/@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==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/json5": { @@ -1263,28 +1396,31 @@ "dev": true }, "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.0.tgz", - "integrity": "sha512-YN1d+ae2MCb4U0mMa+Zlb5lWTdpFShbAj5nmte6lel27waMMBfivrm0prC16p/Di3DyTrmerrYUT8/145HXxVw==" + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", "dev": true }, "node_modules/@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "version": "18.2.34", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.34.tgz", + "integrity": "sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -1293,18 +1429,18 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "version": "2.48.11", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.11.tgz", + "integrity": "sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==", "dev": true, "dependencies": { "@types/caseless": "*", @@ -1314,48 +1450,55 @@ } }, "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", + "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==", "dev": true }, "node_modules/@types/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-mTClfhq5cuGyW4jthaFuig6Q8OVfB3IRyZfN/9SCyJtiM5H0SubwM89cHoT9UngO6HyUFic88HvT1zSNLNyxWA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", + "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { @@ -1375,25 +1518,16 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1412,13 +1546,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1429,13 +1563,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", "tsutils": "^3.21.0" }, "engines": { @@ -1455,9 +1590,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1468,17 +1603,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { @@ -1495,17 +1630,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1518,32 +1655,14 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1553,15 +1672,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1587,217 +1697,189 @@ "node": ">=12.0.0" } }, - "node_modules/@vitejs/plugin-react/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz", - "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz", - "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -1865,9 +1947,9 @@ } }, "node_modules/acorn-globals/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1877,18 +1959,18 @@ } }, "node_modules/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, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1906,19 +1988,6 @@ "node": ">= 6.0.0" } }, - "node_modules/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, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1935,15 +2004,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/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==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, "peerDependencies": { - "ajv": ">=5.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats/node_modules/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 + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -1956,16 +2055,16 @@ "node_modules/amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, "engines": { "node": ">=0.4.2" } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { "node": ">=6" @@ -1980,48 +2079,40 @@ "node": ">=8" } }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "optional": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2040,42 +2131,6 @@ "deep-equal": "^2.0.5" } }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", @@ -2092,7 +2147,7 @@ "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2101,19 +2156,19 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2141,15 +2196,6 @@ "node": ">=8" } }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -2170,14 +2216,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2188,14 +2234,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2206,27 +2252,28 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -2238,49 +2285,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2290,38 +2294,21 @@ "node": "*" } }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/async": { "version": "1.5.2", - "resolved": "git+https://git@github.com/ably-forks/async.git#76306396b3d3a25316be0170ab6483ccbaaaa097", - "integrity": "sha512-G936e+Px0kczo3DHOhyHuRIjkv5HT92fWTOVzE6ysIKun1qhAqoJOsko0b+erkFPKCEDTiHMzp9w8zuuhmidQA==", + "resolved": "git+ssh://git@github.com/ably-forks/async.git#76306396b3d3a25316be0170ab6483ccbaaaa097", "dev": true, "license": "MIT" }, - "node_modules/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, - "optional": true - }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -2334,21 +2321,9 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/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, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -2362,9 +2337,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1414.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1414.0.tgz", - "integrity": "sha512-WhqTWiTZRUxWITvUG5VMPYGdCLNAm4zOTDIiotbErR9x+uDExk2CAGbXE8HH11+tD8PhZVXyukymSiG+7rJMMg==", + "version": "2.1487.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1487.0.tgz", + "integrity": "sha512-EqDn+beJU0pfANLdg8mh7OER5TH2W6DgZ78WWWgt9fOwczhJQYkQhqevSlCV700vtHtatRjYPG+Q47f5aurZVQ==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -2382,173 +2357,29 @@ "node": ">= 10.0.0" } }, - "node_modules/aws-sdk/node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/aws-sdk/node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/aws-sdk/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/aws-sdk/node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/aws-sdk/node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/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, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/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, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/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, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/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, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.2.tgz", - "integrity": "sha1-R0IRyV5s8qVH20YeT2d4tR0I+mU=", + "integrity": "sha512-ZXBDPMt/v/8fsIqn+Z5VwrhdR6jVka0bYobHdGia0Nxi7BJ9i/Uvml3AocHIBtIIBhZjBw5MR0aR4ROs/8+SNg==", "engines": { "node": ">= 0.4" } }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/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, - "optional": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "file-uri-to-path": "1.0.0" + "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -2608,141 +2439,27 @@ } }, "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -2759,10 +2476,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2795,41 +2512,9 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/buffer/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/bytes": { @@ -2841,81 +2526,18 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" } }, - "node_modules/cacache/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -2930,13 +2552,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2952,18 +2575,21 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001524", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", - "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", "dev": true, "funding": [ { @@ -2981,27 +2607,27 @@ ] }, "node_modules/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" } }, "node_modules/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, "dependencies": { "ansi-styles": "^4.1.0", @@ -3014,300 +2640,124 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/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 - }, - "node_modules/chalk/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/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==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "get-func-name": "^2.0.2" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, "engines": { "node": "*" } }, "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, - "optional": true, "dependencies": { - "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" + "anymatch": "~3.1.1", + "braces": "~3.0.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" + }, + "engines": { + "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "^1.2.7" + "fsevents": "~2.3.1" } }, "node_modules/chokidar/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "optional": true, "dependencies": { - "is-extglob": "^2.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/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==", + "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, - "dependencies": { - "tslib": "^1.9.0" - }, "engines": { "node": ">=6.0" } }, - "node_modules/chrome-trace-event/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/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, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/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, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/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, "dependencies": { - "ansi-regex": "^4.1.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" - } - }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "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 }, "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "dev": true, "engines": { "node": ">=0.1.90" @@ -3325,35 +2775,6 @@ "node": ">= 0.8" } }, - "node_modules/command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", - "dev": true, - "dependencies": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -3369,61 +2790,22 @@ "node": ">= 12.0.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/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 - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "engines": [ - "node >= 0.8" - ], "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/content-type": { @@ -3436,18 +2818,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/cookie": { @@ -3462,260 +2835,64 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/copy-webpack-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", - "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/cacache": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.1.0.tgz", - "integrity": "sha512-mfx0C+mCfWjD1PnwQ9yaOrwG1ou9FkKnx0SvzUHWdFt7r7GaRtzT+9M8HAvLu62zIHtnpQ/1m93nWNDCckJGXQ==", - "dev": true, - "dependencies": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/copy-webpack-plugin/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/copy-webpack-plugin/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/copy-webpack-plugin/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/copy-webpack-plugin/node_modules/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==", + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -3729,49 +2906,6 @@ "node": ">= 0.10" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3786,35 +2920,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-js": { - "version": "4.0.0", - "resolved": "git+https://git@github.com/ably-forks/crypto-js.git#07e09b48fd8f850f71c10c9d9307ca4e6ac622a0", - "integrity": "sha512-3RE9Ztinx+QLpEDwcsPTVGMXIIqtS/r+YyD1E7BGXE+CRBcCwkyHWVyl1Aperg5QBOUkg2dtiC8p18a41IKltQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -3845,12 +2950,6 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -3892,12 +2991,15 @@ } }, "node_modules/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, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decimal.js": { @@ -3906,15 +3008,6 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -3987,15 +3080,6 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-for-each": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/deep-for-each/-/deep-for-each-3.0.0.tgz", @@ -4006,9 +3090,9 @@ } }, "node_modules/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 }, "node_modules/defer-to-connect": { @@ -4019,77 +3103,41 @@ "node": ">=10" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/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, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/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==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/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, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "node": ">= 0.4" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -4104,16 +3152,6 @@ "node": ">= 0.8" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -4127,38 +3165,21 @@ "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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, "engines": { "node": ">=0.3.1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4189,16 +3210,6 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -4217,18 +3228,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4236,9 +3235,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -4251,47 +3250,17 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.505", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.505.tgz", - "integrity": "sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "1.4.575", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz", + "integrity": "sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==", "dev": true }, "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -4310,39 +3279,26 @@ } }, "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=10.13.0" } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -4361,9 +3317,9 @@ } }, "node_modules/envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -4372,39 +3328,27 @@ "node": ">=4" } }, - "node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -4412,23 +3356,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -4464,14 +3408,14 @@ "dev": true }, "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -4481,31 +3425,37 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -4526,9 +3476,9 @@ } }, "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -4538,28 +3488,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/esbuild-android-64": { @@ -4818,6 +3768,12 @@ "node": ">=12" } }, + "node_modules/esbuild-plugin-umd-wrapper": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/esbuild-plugin-umd-wrapper/-/esbuild-plugin-umd-wrapper-1.0.7.tgz", + "integrity": "sha512-Jo1S3rczXupUzPGt4eXF643FF/J7nDkwwwHH2PS6ic1l0ye7kTS0plAJQoD9u349ybLyt4wyG9fFa/RCuI2dXw==", + "dev": true + }, "node_modules/esbuild-sunos-64": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", @@ -4894,16 +3850,19 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -4927,15 +3886,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4947,29 +3897,32 @@ } }, "node_modules/eslint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", - "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.1", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -4977,7 +3930,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -4986,7 +3939,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -5020,23 +3973,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -5064,26 +4000,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -5115,18 +4051,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -5136,29 +4060,17 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "node_modules/eslint-plugin-jsdoc": { - "version": "40.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.0.0.tgz", - "integrity": "sha512-LOPyIu1vAVvGPkye3ci0moj0iNf3f8bmin6do2DYDj+77NRXWnkmhKRy8swWsatUs3mB5jYPWPUsFg9pyfEiyA==", + "version": "40.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.3.0.tgz", + "integrity": "sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.36.1", + "@es-joy/jsdoccomment": "~0.37.0", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, @@ -5169,18 +4081,6 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-react": { "version": "7.33.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", @@ -5235,34 +4135,13 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5283,12 +4162,12 @@ } }, "node_modules/eslint-plugin-security": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", - "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", "dev": true, "dependencies": { - "safe-regex": "^1.1.0" + "safe-regex": "^2.1.1" } }, "node_modules/eslint-scope": { @@ -5304,6 +4183,15 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -5329,43 +4217,100 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "node_modules/eslint/node_modules/@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==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@babel/highlight": "^7.10.4" } }, - "node_modules/espree/node_modules/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==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "bin": { + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, @@ -5374,9 +4319,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -5385,15 +4330,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5406,19 +4342,10 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -5451,121 +4378,31 @@ "node_modules/eventemitter2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", "dev": true }, "node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, - "dependencies": { - "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" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=0.4.x" } }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, - "node_modules/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, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/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, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "dependencies": { "homedir-polyfill": "^1.0.1" @@ -5628,7 +4465,7 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/extend": { @@ -5637,148 +4474,113 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/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 }, - "node_modules/extend-shallow/node_modules/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==", + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "@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" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6.0" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "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" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/extglob/node_modules/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, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.9.1" } }, - "node_modules/extglob/node_modules/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==", + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" + "reusify": "^1.0.4" } }, - "node_modules/extglob/node_modules/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==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" + "minimatch": "^5.0.1" } }, - "node_modules/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 - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/fast-glob/node_modules/fill-range": { + "node_modules/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==", @@ -5790,165 +4592,28 @@ "node": ">=8" } }, - "node_modules/fast-glob/node_modules/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=8.6" + "node": ">= 0.8" } }, - "node_modules/fast-glob/node_modules/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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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 - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" @@ -5960,93 +4625,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/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, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/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, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -6064,31 +4642,18 @@ } }, "node_modules/findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "dependencies": { - "glob": "~5.0.0" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/findup-sync/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" }, "engines": { - "node": "*" + "node": ">= 10.13.0" } }, "node_modules/fined": { @@ -6126,35 +4691,25 @@ } }, "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -6167,7 +4722,7 @@ "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6176,7 +4731,7 @@ "node_modules/for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, "dependencies": { "for-in": "^1.0.1" @@ -6208,18 +4763,6 @@ "node": ">= 0.6" } }, - "node_modules/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, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -6229,70 +4772,34 @@ "node": ">= 0.6" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, "engines": { - "node": ">= 4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -6315,7 +4822,7 @@ "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "node_modules/functions-have-names": { @@ -6346,24 +4853,24 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6399,22 +4906,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getobject": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.0.tgz", - "integrity": "sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=10" } }, "node_modules/glob": { @@ -6433,17 +4931,23 @@ } }, "node_modules/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, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "node_modules/glob/node_modules/minimatch": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", @@ -6474,7 +4978,7 @@ "node_modules/global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, "dependencies": { "expand-tilde": "^2.0.2", @@ -6500,18 +5004,12 @@ } }, "node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { @@ -6530,16 +5028,16 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -6549,87 +5047,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/google-closure-compiler": { - "version": "20180610.0.2", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180610.0.2.tgz", - "integrity": "sha1-Eggy9gzK2ZXo5HxedRIRLVTGro8=", - "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "vinyl": "^2.0.1", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "bin": { - "google-closure-compiler": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/google-closure-compiler/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/google-closure-compiler/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/google-closure-compiler/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/google-closure-compiler/node_modules/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, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/google-closure-compiler/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6643,9 +5060,9 @@ } }, "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -6667,9 +5084,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/growl": { @@ -6711,7 +5134,7 @@ "node_modules/grunt-bump": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.3.4.tgz", - "integrity": "sha1-dyUehv+L5NvSNK/NXugk5WOaR2c=", + "integrity": "sha512-BqAVn7i091B8DMjUCKtMz7KUQmVBUvBRmrDaf72UOxe6sqV9JjczroXNkr/nOLPp2N9XZFbgexAf7JtNv8FrSg==", "dev": true, "dependencies": { "semver": "^4.3.3" @@ -6726,7 +5149,7 @@ "node_modules/grunt-bump/node_modules/semver": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", "dev": true, "bin": { "semver": "bin/semver" @@ -6735,7 +5158,7 @@ "node_modules/grunt-cli": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "integrity": "sha512-8oM6ZAe4yG8Y7co/Ejc9613AixyN+gdCADyAFvJ1BbHGvrNa0ltaqrEWXV9P/W0gbQbAh3C8swJIaDuAX7syiw==", "dev": true, "dependencies": { "findup-sync": "~0.3.0", @@ -6750,23 +5173,53 @@ "node": ">=0.10.0" } }, - "node_modules/grunt-closure-tools": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-closure-tools/-/grunt-closure-tools-1.0.0.tgz", - "integrity": "sha1-+pdty8JrZSYgq1pYkYsZnxbpyZ0=", + "node_modules/grunt-cli/node_modules/findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", "dev": true, "dependencies": { - "grunt": "^1.0.1", - "task-closure-tools": "^0.1.10" + "glob": "~5.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.6.0" + } + }, + "node_modules/grunt-cli/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/grunt-cli/node_modules/grunt-known-options": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, + "node_modules/grunt-cli/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, "node_modules/grunt-contrib-concat": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz", - "integrity": "sha1-lTxu/f39LBB6uchQd/LUsk0xzUk=", + "integrity": "sha512-on8j+wGXvo6yVEDjyoUsFU2GeYcpZ9Qhj78XQMeU3yDYSPcHfCeuOo2hV8GAQO9u1JuQFEHgA0O7wFKXO7miqg==", "dev": true, "dependencies": { "chalk": "^0.5.1", @@ -6782,7 +5235,7 @@ "node_modules/grunt-contrib-concat/node_modules/ansi-regex": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6791,7 +5244,7 @@ "node_modules/grunt-contrib-concat/node_modules/ansi-styles": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6800,7 +5253,7 @@ "node_modules/grunt-contrib-concat/node_modules/chalk": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", "dev": true, "dependencies": { "ansi-styles": "^1.1.0", @@ -6813,29 +5266,11 @@ "node": ">=0.10.0" } }, - "node_modules/grunt-contrib-concat/node_modules/has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "dependencies": { - "ansi-regex": "^0.2.0" - }, - "bin": { - "has-ansi": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-concat/node_modules/source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", - "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", + "node_modules/grunt-contrib-concat/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, "engines": { "node": ">=0.8.0" } @@ -6843,7 +5278,7 @@ "node_modules/grunt-contrib-concat/node_modules/strip-ansi": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", "dev": true, "dependencies": { "ansi-regex": "^0.2.1" @@ -6858,7 +5293,7 @@ "node_modules/grunt-contrib-concat/node_modules/supports-color": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", "dev": true, "bin": { "supports-color": "cli.js" @@ -6868,9 +5303,9 @@ } }, "node_modules/grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6931,7 +5366,7 @@ "node_modules/grunt-shell": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-1.1.2.tgz", - "integrity": "sha1-Rz5GUwHSnQtW3xb+MQeYznFNCVY=", + "integrity": "sha512-gPYS+1WzGT9K5A4rFAz6I41Q8Dr3dgt464gNwLggwUP5bl2nzNipbn1QliN3/gFrBmed9BdQpeFKKS1+NTd/gA==", "dev": true, "dependencies": { "chalk": "^1.0.0" @@ -6943,7 +5378,7 @@ "node_modules/grunt-shell/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6952,7 +5387,7 @@ "node_modules/grunt-shell/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6961,7 +5396,7 @@ "node_modules/grunt-shell/node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "dependencies": { "ansi-styles": "^2.2.1", @@ -6974,10 +5409,31 @@ "node": ">=0.10.0" } }, + "node_modules/grunt-shell/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-shell/node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/grunt-shell/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -6989,65 +5445,26 @@ "node_modules/grunt-shell/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/grunt-webpack": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-4.0.2.tgz", - "integrity": "sha512-rrqb9SRlY69jEJuCglelB7IvGrI7lRpdfH2GXpFlIOGPRTTtlSxYMU4Fjg8FHaC6ilnMbW5jd55Ff1lR5OibCA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-5.0.0.tgz", + "integrity": "sha512-C7emzVIGJhZ5V5ZYjylr9sDD9PE9Dh/55NaSzP2P2dhif+m/1gHbjDZQ7PDzguyuzwBz4Qc8voQHR06FSp4CKg==", "dev": true, "dependencies": { "deep-for-each": "^3.0.0", "lodash": "^4.17.19" }, "engines": { - "node": ">=10.13.0" + "node": ">=12.13.0" }, "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/grunt/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/grunt/node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/grunt/node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 10.13.0" + "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/grunt/node_modules/glob": { @@ -7102,15 +5519,6 @@ "nopt": "bin/nopt.js" } }, - "node_modules/grunt/node_modules/grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/grunt/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -7123,38 +5531,22 @@ "node": ">=0.10.0" } }, - "node_modules/grunt/node_modules/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/grunt/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } + "node_modules/grunt/node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true }, - "node_modules/grunt/node_modules/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==", + "node_modules/grunt/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8.0" + "node": "*" } }, "node_modules/gzip-size": { @@ -7172,34 +5564,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "ansi-regex": "^0.2.0" + }, + "bin": { + "has-ansi": "cli.js" }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7215,21 +5598,21 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7274,81 +5657,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "node": ">= 0.4" } }, "node_modules/he": { @@ -7369,17 +5687,6 @@ "hexy": "bin/hexy_cmd.js" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -7395,7 +5702,7 @@ "node_modules/hooker": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", "dev": true, "engines": { "node": "*" @@ -7460,12 +5767,6 @@ "node": ">=10.19.0" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -7479,15 +5780,6 @@ "node": ">= 6" } }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7501,44 +5793,24 @@ } }, "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -7546,12 +5818,15 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -7562,36 +5837,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -7611,13 +5874,13 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -7625,10 +5888,13 @@ } }, "node_modules/interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -7652,30 +5918,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -7734,16 +5976,15 @@ } }, "node_modules/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, - "optional": true, "dependencies": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-boolean-object": { @@ -7762,12 +6003,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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 - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -7781,41 +6016,17 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -7831,29 +6042,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -7869,19 +6057,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7900,12 +6079,12 @@ } }, "node_modules/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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/is-generator-function": { @@ -7957,15 +6136,12 @@ } }, "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, "node_modules/is-number-object": { @@ -7983,18 +6159,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -8071,15 +6235,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -8111,16 +6266,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -8185,58 +6336,61 @@ } }, "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -8251,25 +6405,54 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 10.13.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -8280,9 +6463,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", - "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "engines": { "node": ">=12.0.0" @@ -8334,9 +6517,9 @@ } }, "node_modules/jsdom/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -8376,10 +6559,10 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "node_modules/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 }, "node_modules/json-schema-traverse": { @@ -8391,19 +6574,19 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonc-parser": { @@ -8429,8 +6612,7 @@ }, "node_modules/kexec": { "version": "3.0.0", - "resolved": "git+https://git@github.com/ably-forks/node-kexec.git#f29f54037c7db6ad29e1781463b182e5929215a0", - "integrity": "sha512-AF1dssPoaSWqFN8u6seVKCIBjavJ+wRQ5UBdUGMIldfKcJKipXanb43zFL8DWGYSHPR0nGOHsa72xmlQ81bKzw==", + "resolved": "git+ssh://git@github.com/ably-forks/node-kexec.git#f29f54037c7db6ad29e1781463b182e5929215a0", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8442,9 +6624,9 @@ } }, "node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dependencies": { "json-buffer": "3.0.1" } @@ -8458,15 +6640,6 @@ "node": ">=0.10.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8499,30 +6672,6 @@ "node": ">=10" } }, - "node_modules/liftup/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/liftup/node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/liftup/node_modules/findup-sync": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", @@ -8538,74 +6687,25 @@ "node": ">= 8" } }, - "node_modules/liftup/node_modules/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/liftup/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/liftup/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/liftup/node_modules/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==", + "node_modules/liftup/node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "resolve": "^1.9.0" }, "engines": { - "node": ">=8.0" + "node": ">= 0.10" } }, "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, "engines": { - "node": ">=4.0.0" + "node": ">=6.11.5" } }, "node_modules/local-pkg": { @@ -8644,7 +6744,19 @@ "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "node_modules/log-symbols": { @@ -8672,12 +6784,12 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lowercase-keys": { @@ -8697,12 +6809,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", @@ -8718,28 +6824,6 @@ "lz-string": "bin/bin.js" } }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -8755,28 +6839,16 @@ "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, "engines": { "node": ">=0.10.0" } }, "node_modules/marked": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.17.tgz", - "integrity": "sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -8785,17 +6857,6 @@ "node": ">= 12" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -8805,20 +6866,10 @@ "node": ">= 0.6" } }, - "node_modules/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, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "node_modules/merge-stream": { @@ -8839,55 +6890,25 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">=8.6" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -8921,15 +6942,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -8938,22 +6950,10 @@ "node": ">=4" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -8963,285 +6963,107 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "minimist": "^1.2.6" }, - "engines": { - "node": ">=8" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">= 8" + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/mocha/node_modules/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 + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/minizlib": { + "node_modules/mocha/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/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, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/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, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mocha/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mocha/node_modules/glob": { "version": "7.1.6", @@ -9263,84 +7085,58 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/has-flag": { + "node_modules/mocha/node_modules/js-yaml": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/mocha/node_modules/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==", + "node_modules/mocha/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/mocha/node_modules/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, - "engines": { - "node": ">=0.12.0" - } + "node_modules/mocha/node_modules/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 }, - "node_modules/mocha/node_modules/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==", + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "randombytes": "^2.1.0" } }, "node_modules/mocha/node_modules/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, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/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, - "dependencies": { - "is-number": "^7.0.0" + "node": ">=10" }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/ms": { @@ -9350,49 +7146,33 @@ "dev": true }, "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "dev": true }, "node_modules/nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^10 || ^12 || >=13.7" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "node_modules/negotiator": { @@ -9410,43 +7190,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -9456,7 +7199,7 @@ "node_modules/nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, "dependencies": { "abbrev": "1" @@ -9485,139 +7228,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/null-loader/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/null-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/null-loader/node_modules/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==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/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, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9648,18 +7277,6 @@ "node": ">= 0.4" } }, - "node_modules/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, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -9681,7 +7298,7 @@ "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, "dependencies": { "array-each": "^1.0.1", @@ -9752,7 +7369,7 @@ "node_modules/object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dev": true, "dependencies": { "for-own": "^1.0.0", @@ -9765,7 +7382,7 @@ "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "dependencies": { "isobject": "^3.0.1" @@ -9806,26 +7423,11 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -9842,45 +7444,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open/node_modules/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, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/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" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9889,7 +7473,7 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9914,12 +7498,12 @@ } }, "node_modules/p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" @@ -9943,21 +7527,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -9967,23 +7536,6 @@ "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -9996,23 +7548,10 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, "dependencies": { "is-absolute": "^1.0.0", @@ -10026,7 +7565,7 @@ "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10053,28 +7592,6 @@ "node": ">= 0.8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true, - "optional": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10087,7 +7604,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10111,7 +7628,7 @@ "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, "dependencies": { "path-root-regex": "^0.1.0" @@ -10123,7 +7640,7 @@ "node_modules/path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10132,7 +7649,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "node_modules/path-type": { @@ -10153,22 +7670,6 @@ "node": "*" } }, - "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -10187,15 +7688,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -10261,46 +7753,53 @@ } }, "node_modules/playwright": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.22.2.tgz", - "integrity": "sha512-hUTpg7LytIl3/O4t0AQJS1V6hWsaSY5uZ7w1oCC8r3a1AQN5d6otIdCkiB3cbzgQkcMaRxisinjMFMVqZkybdQ==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", + "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", "dev": true, - "hasInstallScript": true, "dependencies": { - "playwright-core": "1.22.2" + "playwright-core": "1.39.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=14" + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.22.2.tgz", - "integrity": "sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", + "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", "dev": true, "bin": { - "playwright": "cli.js" + "playwright-core": "cli.js" }, "engines": { - "node": ">=14" + "node": ">=16" } }, - "node_modules/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=", + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -10353,15 +7852,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { @@ -10390,21 +7892,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -10414,12 +7901,6 @@ "node": ">=0.4.0" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -10450,38 +7931,12 @@ "node": ">= 0.10" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -10491,31 +7946,10 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -10539,22 +7973,13 @@ "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "engines": { "node": ">=0.4.x" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -10601,16 +8026,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -10675,86 +8090,40 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "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" - } - }, - "node_modules/readable-stream/node_modules/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 - }, "node_modules/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.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, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=0.10" + "node": ">=8.10.0" } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.1.6" }, "engines": { "node": ">= 0.10" } }, - "node_modules/rechoir/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -10771,28 +8140,24 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" + "bin": { + "regexp-tree": "bin/regexp-tree" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -10813,58 +8178,28 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/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 - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/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, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/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, "engines": { "node": ">=0.10.0" } }, - "node_modules/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 - }, "node_modules/requirejs": { "version": "2.1.22", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz", - "integrity": "sha1-3Xj9LTQYDA1ixyS1uK68BmTgNm8=", + "integrity": "sha512-AhZqN7UrWV8R2d1LfGfznskMJNF0Vb6yStwrCn52UbktJg6y5V1I7RoGRyJtACe86d50PyQn0Iw0jYDKMvc4iA==", "dev": true, "bin": { "r.js": "bin/r.js" @@ -10880,10 +8215,21 @@ "dev": true }, "node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/resolve-alpn": { "version": "1.2.1", @@ -10914,7 +8260,7 @@ "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "dependencies": { "expand-tilde": "^2.0.0", @@ -10933,28 +8279,15 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { "lowercase-keys": "^2.0.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/reusify": { @@ -10968,27 +8301,30 @@ } }, "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -10999,45 +8335,22 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11061,23 +8374,14 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11115,12 +8419,12 @@ ] }, "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "dependencies": { - "ret": "~0.1.10" + "regexp-tree": "~0.1.1" } }, "node_modules/safe-regex-test": { @@ -11171,23 +8475,62 @@ } }, "node_modules/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": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 4" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, + "node_modules/schema-utils/node_modules/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 + }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11211,6 +8554,12 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -11257,9 +8606,9 @@ "dev": true }, "node_modules/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.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -11280,62 +8629,51 @@ "node": ">= 0.8.0" } }, - "node_modules/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 - }, - "node_modules/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==", + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/set-value/node_modules/extend-shallow": { + "node_modules/set-function-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/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, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "kind-of": "^6.0.2" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=8" } }, "node_modules/shebang-command": { @@ -11377,15 +8715,15 @@ } }, "node_modules/shelljs/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -11396,27 +8734,16 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/shelljs/node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/shiki": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", - "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", "dev": true, "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" } }, "node_modules/side-channel": { @@ -11433,12 +8760,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -11449,362 +8770,96 @@ } }, "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "integrity": "sha512-jz8leTIGS8+qJywWiO9mKza0hJxexdeIYXhDHw9avTQcXSNAGk3hiiRMpmI2Qf9dOrZDrDpgH9VNefzuacWC9A==", "dev": true, "dependencies": { - "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" + "amdefine": ">=0.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/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==", + "node_modules/source-map-explorer": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", "dev": true, "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.4", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "bin": { + "sme": "bin/cli.js", + "source-map-explorer": "bin/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/source-map-explorer/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/source-map-explorer/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/snapdragon-node/node_modules/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, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/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, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/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, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/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, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/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 - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-explorer": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.2.tgz", - "integrity": "sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg==", - "dev": true, - "dependencies": { - "btoa": "^1.2.1", - "chalk": "^4.1.0", - "convert-source-map": "^1.7.0", - "ejs": "^3.1.5", - "escape-html": "^1.0.3", - "glob": "^7.1.6", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "open": "^7.3.1", - "source-map": "^0.7.3", - "temp": "^0.9.4", - "yargs": "^16.2.0" - }, - "bin": { - "sme": "bin/cli.js", - "source-map-explorer": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/source-map-explorer/node_modules/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/source-map-explorer/node_modules/cliui": { - "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, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/source-map-explorer/node_modules/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/source-map-explorer/node_modules/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 - }, - "node_modules/source-map-explorer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/source-map-explorer/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map-explorer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-explorer/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/source-map-explorer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "engines": { "node": ">= 8" } }, - "node_modules/source-map-explorer/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-explorer/node_modules/wrap-ansi": { - "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, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/source-map-explorer/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/source-map-explorer/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/source-map-explorer/node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -11814,19 +8869,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "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" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -11846,12 +8888,6 @@ "node": ">=0.10.0" } }, - "node_modules/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 - }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", @@ -11869,63 +8905,17 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, - "node_modules/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, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/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, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/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, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -11947,99 +8937,24 @@ "node": ">= 0.4" } }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/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 - }, "node_modules/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==", + "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, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/string-width/node_modules/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, - "dependencies": { - "ansi-regex": "^4.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", - "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -12049,6 +8964,7 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -12056,14 +8972,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -12073,40 +8989,40 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/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, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -12121,15 +9037,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12143,15 +9050,15 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -12173,111 +9080,102 @@ "dev": true }, "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" } }, - "node_modules/table-layout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", - "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/table/node_modules/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 + }, "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/temp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/task-closure-tools": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/task-closure-tools/-/task-closure-tools-0.1.10.tgz", - "integrity": "sha1-2bHs+A7jfi2tIkRbJiAseN0VU3s=", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" + "glob": "^7.1.3" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "rimraf": "bin.js" } }, "node_modules/terser": { - "version": "5.19.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", - "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -12292,70 +9190,62 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/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, - "engines": { - "node": ">=0.10.0" + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=6.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -12366,31 +9256,9 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tinypool": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.2.4.tgz", @@ -12409,12 +9277,6 @@ "node": ">=14.0.0" } }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -12424,62 +9286,22 @@ "node": ">=4" } }, - "node_modules/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, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/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, "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, "node_modules/to-utf8": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", - "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" + "integrity": "sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==" }, "node_modules/toidentifier": { "version": "1.0.1", @@ -12518,127 +9340,50 @@ } }, "node_modules/ts-loader": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.2.0.tgz", - "integrity": "sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", + "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", + "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "peerDependencies": { "typescript": "*", - "webpack": "*" - } - }, - "node_modules/ts-loader/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-loader/node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-loader/node_modules/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/ts-loader/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/ts-loader/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" + "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/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==", + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">= 8" } }, "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { - "json5": "^2.2.2", + "@types/json5": "^0.0.29", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" } }, "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -12649,44 +9394,36 @@ "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "engines": { "node": ">=6" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/tsutils": { @@ -12710,12 +9447,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12738,12 +9469,15 @@ } }, "node_modules/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, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -12824,22 +9558,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "node_modules/typedoc": { - "version": "0.23.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.8.tgz", - "integrity": "sha512-NLRTY/7XSrhiowR3xnH/nlfTnHk+dkzhHWAMT8guoZ6RHCQZIu3pJREMCqzdkWVCC5+dr9We7TtNeprR3Qy6Ag==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", "dev": true, "dependencies": { "lunr": "^2.3.9", - "marked": "^4.0.16", - "minimatch": "^5.1.0", - "shiki": "^0.10.1" + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" }, "bin": { "typedoc": "bin/typedoc" @@ -12848,7 +9576,7 @@ "node": ">= 14.14" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { @@ -12861,21 +9589,24 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12885,15 +9616,6 @@ "node": ">=4.2.0" } }, - "node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -12912,57 +9634,35 @@ "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "dev": true, "dependencies": { - "sprintf-js": "^1.0.3", + "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" }, "engines": { "node": "*" } }, - "node_modules/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, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } + "node_modules/underscore.string/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/universalify": { "version": "0.2.0", @@ -12982,69 +9682,10 @@ "node": ">= 0.8" } }, - "node_modules/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, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/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, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -13072,25 +9713,18 @@ } }, "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "dependencies": { "punycode": "1.3.2", @@ -13110,43 +9744,32 @@ "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "dependencies": { - "inherits": "2.0.3" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "engines": { "node": ">= 0.4.0" @@ -13162,9 +9785,9 @@ } }, "node_modules/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.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/v8flags": { @@ -13182,190 +9805,65 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "dependencies": { - "source-map": "^0.5.1" - } - }, "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vite/node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", - "dev": true, + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, "bin": { - "rollup": "dist/bin/rollup" + "vite": "bin/vite.js" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, "node_modules/vitest": { @@ -13418,35 +9916,88 @@ } } }, - "node_modules/vitest/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], "dev": true, - "hasInstallScript": true, "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vitest/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "node_modules/vitest/node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/vitest/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, "bin": { - "resolve": "bin/resolve" + "rollup": "dist/bin/rollup" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/vitest/node_modules/vite": { @@ -13491,201 +10042,48 @@ "optional": true }, "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/vscode-oniguruma": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", - "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack/node_modules/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, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/watchpack/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/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, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/watchpack/node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/watchpack/node_modules/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, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/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, - "engines": { - "node": ">=0.12.0" + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/watchpack/node_modules/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==", + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, - "optional": true, "dependencies": { - "picomatch": "^2.2.1" + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=14" } }, - "node_modules/watchpack/node_modules/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==", + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, - "optional": true, "dependencies": { - "is-number": "^7.0.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=8.0" + "node": ">=10.13.0" } }, "node_modules/webidl-conversions": { @@ -13698,40 +10096,41 @@ } }, "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" }, "funding": { "type": "opencollective", @@ -13740,52 +10139,44 @@ "peerDependenciesMeta": { "webpack-cli": { "optional": true - }, - "webpack-command": { - "optional": true } } }, "node_modules/webpack-cli": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz", - "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==", - "dev": true, - "dependencies": { - "@webpack-cli/info": "^1.1.0", - "@webpack-cli/serve": "^1.1.0", - "colorette": "^1.2.1", - "command-line-usage": "^6.1.0", - "commander": "^6.2.0", - "enquirer": "^2.3.6", - "execa": "^4.1.0", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "leven": "^3.1.0", - "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", - "webpack-merge": "^4.2.2" + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { - "@webpack-cli/generate-loader": { - "optional": true - }, - "@webpack-cli/generate-plugin": { - "optional": true - }, - "@webpack-cli/init": { - "optional": true - }, - "@webpack-cli/migrate": { + "@webpack-cli/generators": { "optional": true }, "webpack-bundle-analyzer": { @@ -13797,55 +10188,62 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=14" } }, "node_modules/webpack-cli/node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, - "node_modules/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==", + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "lodash": "^4.17.15" + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -13854,17 +10252,40 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=4.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/whatwg-encoding": { @@ -13991,20 +10412,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -14034,6 +10449,15 @@ "node": ">=4" } }, + "node_modules/wide-align/node_modules/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/wide-align/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -14050,7 +10474,7 @@ "node_modules/wide-align/node_modules/strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -14059,94 +10483,39 @@ "node": ">=4" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrapjs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", - "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", - "dev": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "dependencies": { - "errno": "~0.1.7" - } + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true }, "node_modules/workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", "dev": true }, "node_modules/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==", + "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, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/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, - "dependencies": { - "ansi-regex": "^4.1.0" + "node": ">=10" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "8.14.2", @@ -14205,157 +10574,83 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { - "node": ">=0.4" + "node": ">=10" } }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/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, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/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, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/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, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" } }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/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, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, - "node_modules/yargs/node_modules/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==", + "node_modules/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, "dependencies": { - "p-limit": "^2.0.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ably/msgpack-js": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@ably/msgpack-js/-/msgpack-js-0.4.0.tgz", @@ -14390,6 +10685,15 @@ "chalk": "^2.4.2" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -14400,44 +10704,74 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true }, "@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" }, "dependencies": { - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -14447,12 +10781,12 @@ } }, "@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -14468,13 +10802,13 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "requires": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -14489,19 +10823,19 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { @@ -14514,25 +10848,25 @@ } }, "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-plugin-utils": { @@ -14566,39 +10900,48 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true }, "@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" } }, "@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -14609,13 +10952,49 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", - "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-syntax-jsx": { @@ -14628,16 +11007,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" } }, "@babel/plugin-transform-react-jsx-development": { @@ -14668,77 +11047,75 @@ } }, "@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } } }, "@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, "@es-joy/jsdoccomment": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", - "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", + "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", "dev": true, "requires": { "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~3.1.0" + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" } }, "@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "dev": true, "optional": true }, @@ -14806,9 +11183,9 @@ "optional": true }, "@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "dev": true, "optional": true }, @@ -14889,24 +11266,72 @@ "dev": true, "optional": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, "@eslint/eslintrc": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", - "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -14935,8 +11360,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "optional": true, - "peer": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -14949,9 +11372,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -14959,72 +11382,31 @@ } }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "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, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "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.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "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.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "glob": { - "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "@rollup/pluginutils": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", @@ -15036,9 +11418,9 @@ } }, "@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@szmarczak/http-timer": { "version": "4.0.6", @@ -15082,58 +11464,78 @@ "dev": true }, "@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", "dev": true }, "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "requires": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.4.tgz", + "integrity": "sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==", "dev": true }, "@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", + "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", "dev": true }, "@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.4.tgz", + "integrity": "sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==", "dev": true, "requires": { "@types/chai": "*" } }, - "@types/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "@types/eslint": { + "version": "8.44.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", + "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==" }, "@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==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "@types/json5": { @@ -15143,28 +11545,31 @@ "dev": true }, "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "requires": { "@types/node": "*" } }, "@types/node": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.0.tgz", - "integrity": "sha512-YN1d+ae2MCb4U0mMa+Zlb5lWTdpFShbAj5nmte6lel27waMMBfivrm0prC16p/Di3DyTrmerrYUT8/145HXxVw==" + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", "dev": true }, "@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "version": "18.2.34", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.34.tgz", + "integrity": "sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==", "dev": true, "requires": { "@types/prop-types": "*", @@ -15173,18 +11578,18 @@ } }, "@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", "dev": true, "requires": { "@types/react": "*" } }, "@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "version": "2.48.11", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.11.tgz", + "integrity": "sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==", "dev": true, "requires": { "@types/caseless": "*", @@ -15194,154 +11599,137 @@ } }, "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==", "requires": { "@types/node": "*" } }, "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", + "dev": true + }, + "@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", + "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==", "dev": true }, "@types/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-mTClfhq5cuGyW4jthaFuig6Q8OVfB3IRyZfN/9SCyJtiM5H0SubwM89cHoT9UngO6HyUFic88HvT1zSNLNyxWA==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", + "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", "dev": true, "requires": { "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - } } }, "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "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": "^2.0.0" - } - } + "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - } + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" } }, "@ungap/promise-all-settled": { @@ -15364,209 +11752,172 @@ "@rollup/pluginutils": "^4.2.1", "react-refresh": "^0.13.0", "resolve": "^1.22.0" - }, - "dependencies": { - "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } + "requires": {} }, "@webpack-cli/info": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz", - "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz", - "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "requires": {} }, @@ -15621,24 +11972,24 @@ }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "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, "requires": {} }, "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true }, "agent-base": { @@ -15650,16 +12001,6 @@ "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", @@ -15672,12 +12013,34 @@ "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==", + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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" + } + }, + "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 + } + } }, "ajv-keywords": { "version": "3.5.2", @@ -15689,13 +12052,13 @@ "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-regex": { @@ -15704,44 +12067,31 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "optional": 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": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -15760,30 +12110,6 @@ "deep-equal": "^2.0.5" } }, - "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-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", - "dev": true - }, "array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", @@ -15797,25 +12123,25 @@ "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" } }, @@ -15831,12 +12157,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "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 - }, "array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -15851,134 +12171,74 @@ } }, "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "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": "git+https://git@github.com/ably-forks/async.git#76306396b3d3a25316be0170ab6483ccbaaaa097", - "integrity": "sha512-G936e+Px0kczo3DHOhyHuRIjkv5HT92fWTOVzE6ysIKun1qhAqoJOsko0b+erkFPKCEDTiHMzp9w8zuuhmidQA==", + "version": "git+ssh://git@github.com/ably-forks/async.git#76306396b3d3a25316be0170ab6483ccbaaaa097", "dev": true, "from": "async@ably-forks/async#requirejs" }, - "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, - "optional": true - }, "asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -15991,13 +12251,7 @@ "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==", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "available-typed-arrays": { @@ -16007,9 +12261,9 @@ "dev": true }, "aws-sdk": { - "version": "2.1414.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1414.0.tgz", - "integrity": "sha512-WhqTWiTZRUxWITvUG5VMPYGdCLNAm4zOTDIiotbErR9x+uDExk2CAGbXE8HH11+tD8PhZVXyukymSiG+7rJMMg==", + "version": "2.1487.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1487.0.tgz", + "integrity": "sha512-EqDn+beJU0pfANLdg8mh7OER5TH2W6DgZ78WWWgt9fOwczhJQYkQhqevSlCV700vtHtatRjYPG+Q47f5aurZVQ==", "dev": true, "requires": { "buffer": "4.9.2", @@ -16022,150 +12276,23 @@ "util": "^0.12.4", "uuid": "8.0.0", "xml2js": "0.5.0" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - } } }, "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" - } - } - } - }, "base64-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.2.tgz", - "integrity": "sha1-R0IRyV5s8qVH20YeT2d4tR0I+mU=" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-ZXBDPMt/v/8fsIqn+Z5VwrhdR6jVka0bYobHdGia0Nxi7BJ9i/Uvml3AocHIBtIIBhZjBw5MR0aR4ROs/8+SNg==" }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": 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" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "body-parser": { @@ -16210,157 +12337,45 @@ "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.1.tgz", "integrity": "sha512-qCMBuZKP36tELrrgXpAfM+gHzqa0nLsWZ+L37ncsb8txYlnAoxOPpVp+g7fK0sGkMXfA0wl8uQkESqw3v4HNag==", "requires": { - "base64-js": "1.0.2", - "to-utf8": "0.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "base64-js": "1.0.2", + "to-utf8": "0.0.1" } }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "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": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "fill-range": "^7.0.1" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" } }, "btoa": { @@ -16378,32 +12393,12 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" - }, - "dependencies": { - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - } } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "bytes": { @@ -16412,71 +12407,15 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "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" - } - }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -16488,13 +12427,14 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "callsites": { @@ -16504,297 +12444,139 @@ "dev": true }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001524", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", - "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", "dev": true }, "chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "requires": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" } }, "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" - }, - "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 - }, - "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" - } - } } }, "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "optional": 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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "get-func-name": "^2.0.2" } }, - "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==", + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "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" }, "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=", + "glob-parent": { + "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-descriptor": "^0.1.0" + "is-glob": "^4.0.1" } } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "chrome-trace-event": { + "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 }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "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": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "mimic-response": "^1.0.0" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "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 }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "dev": true }, "combined-stream": { @@ -16806,31 +12588,6 @@ "delayed-stream": "~1.0.0" } }, - "command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -16843,46 +12600,10 @@ "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "content-disposition": { @@ -16901,21 +12622,10 @@ "dev": true }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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 - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "cookie": { "version": "0.5.0", @@ -16926,188 +12636,44 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "copy-webpack-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", - "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "dependencies": { - "cacache": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.1.0.tgz", - "integrity": "sha512-mfx0C+mCfWjD1PnwQ9yaOrwG1ou9FkKnx0SvzUHWdFt7r7GaRtzT+9M8HAvLu62zIHtnpQ/1m93nWNDCckJGXQ==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "glob": { - "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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==", + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } } } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -17118,51 +12684,6 @@ "vary": "^1" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -17174,31 +12695,6 @@ "which": "^2.0.1" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-js": { - "version": "git+https://git@github.com/ably-forks/crypto-js.git#07e09b48fd8f850f71c10c9d9307ca4e6ac622a0", - "integrity": "sha512-3RE9Ztinx+QLpEDwcsPTVGMXIIqtS/r+YyD1E7BGXE+CRBcCwkyHWVyl1Aperg5QBOUkg2dtiC8p18a41IKltQ==", - "dev": true, - "from": "crypto-js@ably-forks/crypto-js#crypto-lite" - }, "cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -17228,12 +12724,6 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, "data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -17261,9 +12751,9 @@ } }, "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": { @@ -17272,12 +12762,6 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -17336,12 +12820,6 @@ } } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-for-each": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/deep-for-each/-/deep-for-each-3.0.0.tgz", @@ -17352,9 +12830,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 }, "defer-to-connect": { @@ -17362,61 +12840,32 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "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" - } - } + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "depd": { @@ -17425,16 +12874,6 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -17444,34 +12883,15 @@ "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true }, "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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 }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -17496,12 +12916,6 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -17517,18 +12931,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -17536,53 +12938,24 @@ "dev": true }, "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "requires": { "jake": "^10.8.5" } }, "electron-to-chromium": { - "version": "1.4.505", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.505.tgz", - "integrity": "sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ==", + "version": "1.4.575", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz", + "integrity": "sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==", "dev": true }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "encodeurl": { @@ -17600,35 +12973,23 @@ } }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "requires": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" } }, "entities": { @@ -17638,41 +12999,32 @@ "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.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, "es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -17680,23 +13032,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.13" } }, "es-get-iterator": { @@ -17725,14 +13077,14 @@ } }, "es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "requires": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -17742,28 +13094,34 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, + "es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -17778,33 +13136,33 @@ } }, "esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "esbuild-android-64": { @@ -17919,6 +13277,12 @@ "dev": true, "optional": true }, + "esbuild-plugin-umd-wrapper": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/esbuild-plugin-umd-wrapper/-/esbuild-plugin-umd-wrapper-1.0.7.tgz", + "integrity": "sha512-Jo1S3rczXupUzPGt4eXF643FF/J7nDkwwwHH2PS6ic1l0ye7kTS0plAJQoD9u349ybLyt4wyG9fFa/RCuI2dXw==", + "dev": true + }, "esbuild-sunos-64": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", @@ -17956,13 +13320,13 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "escodegen": { @@ -17977,12 +13341,6 @@ "source-map": "~0.6.1" }, "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17993,29 +13351,32 @@ } }, "eslint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", - "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.1", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -18023,7 +13384,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -18032,9 +13393,50 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } } }, "eslint-import-resolver-node": { @@ -18056,17 +13458,6 @@ "requires": { "ms": "^2.1.1" } - }, - "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -18091,26 +13482,26 @@ } }, "eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -18133,56 +13524,27 @@ "esutils": "^2.0.2" } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } } } }, "eslint-plugin-jsdoc": { - "version": "40.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.0.0.tgz", - "integrity": "sha512-LOPyIu1vAVvGPkye3ci0moj0iNf3f8bmin6do2DYDj+77NRXWnkmhKRy8swWsatUs3mB5jYPWPUsFg9pyfEiyA==", + "version": "40.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.3.0.tgz", + "integrity": "sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.36.1", + "@es-joy/jsdoccomment": "~0.37.0", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" - }, - "dependencies": { - "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-plugin-react": { @@ -18218,28 +13580,13 @@ "esutils": "^2.0.2" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -18260,12 +13607,12 @@ "requires": {} }, "eslint-plugin-security": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", - "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", "dev": true, "requires": { - "safe-regex": "^1.1.0" + "safe-regex": "^2.1.1" } }, "eslint-scope": { @@ -18276,6 +13623,14 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } } }, "eslint-utils": { @@ -18296,19 +13651,19 @@ } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { @@ -18327,20 +13682,12 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "esrecurse": { @@ -18350,20 +13697,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "estree-walker": { @@ -18387,102 +13726,25 @@ "eventemitter2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "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" - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -18539,7 +13801,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -18550,92 +13812,6 @@ "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" - } - } - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -18643,60 +13819,25 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "dependencies": { - "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" - } - }, - "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.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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==", + "glob-parent": { + "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-number": "^7.0.0" + "is-glob": "^4.0.1" } } } @@ -18710,39 +13851,32 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "optional": true + "requires": { + "flat-cache": "^3.0.4" + } }, "filelist": { "version": "1.0.4", @@ -18763,9 +13897,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -18774,26 +13908,12 @@ } }, "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": { @@ -18828,71 +13948,6 @@ } } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -18904,27 +13959,15 @@ } }, "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" } }, "fined": { @@ -18953,32 +13996,22 @@ "dev": true }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -18991,13 +14024,13 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true }, "for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, "requires": { "for-in": "^1.0.1" @@ -19020,73 +14053,29 @@ "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": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "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.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { @@ -19104,7 +14093,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "functions-have-names": { @@ -19126,21 +14115,21 @@ "dev": true }, "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-stream": { @@ -19161,16 +14150,10 @@ "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getobject": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.0.tgz", - "integrity": "sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", "dev": true }, "glob": { @@ -19197,14 +14180,20 @@ } }, "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" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -19219,7 +14208,7 @@ "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -19241,13 +14230,10 @@ } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true }, "globalthis": { "version": "1.0.3", @@ -19259,78 +14245,17 @@ } }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "google-closure-compiler": { - "version": "20180610.0.2", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180610.0.2.tgz", - "integrity": "sha1-Eggy9gzK2ZXo5HxedRIRLVTGro8=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "vinyl": "^2.0.1", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } } }, "gopd": { @@ -19343,9 +14268,9 @@ } }, "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "requires": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -19361,9 +14286,15 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "growl": { @@ -19393,36 +14324,6 @@ "nopt": "~3.0.6" }, "dependencies": { - "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" - } - }, - "findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - } - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -19462,12 +14363,6 @@ } } }, - "grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true - }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -19477,29 +14372,19 @@ "safer-buffer": ">= 2.1.2 < 3.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==", + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", "dev": true }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.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==", + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, "requires": { - "is-number": "^7.0.0" + "brace-expansion": "^1.1.7" } } } @@ -19507,7 +14392,7 @@ "grunt-bump": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.3.4.tgz", - "integrity": "sha1-dyUehv+L5NvSNK/NXugk5WOaR2c=", + "integrity": "sha512-BqAVn7i091B8DMjUCKtMz7KUQmVBUvBRmrDaf72UOxe6sqV9JjczroXNkr/nOLPp2N9XZFbgexAf7JtNv8FrSg==", "dev": true, "requires": { "semver": "^4.3.3" @@ -19516,7 +14401,7 @@ "semver": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", "dev": true } } @@ -19524,29 +14409,55 @@ "grunt-cli": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "integrity": "sha512-8oM6ZAe4yG8Y7co/Ejc9613AixyN+gdCADyAFvJ1BbHGvrNa0ltaqrEWXV9P/W0gbQbAh3C8swJIaDuAX7syiw==", "dev": true, "requires": { "findup-sync": "~0.3.0", "grunt-known-options": "~1.1.0", "nopt": "~3.0.6", "resolve": "~1.1.0" - } - }, - "grunt-closure-tools": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-closure-tools/-/grunt-closure-tools-1.0.0.tgz", - "integrity": "sha1-+pdty8JrZSYgq1pYkYsZnxbpyZ0=", - "dev": true, - "requires": { - "grunt": "^1.0.1", - "task-closure-tools": "^0.1.10" + }, + "dependencies": { + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", + "dev": true, + "requires": { + "glob": "~5.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "grunt-known-options": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + } } }, "grunt-contrib-concat": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz", - "integrity": "sha1-lTxu/f39LBB6uchQd/LUsk0xzUk=", + "integrity": "sha512-on8j+wGXvo6yVEDjyoUsFU2GeYcpZ9Qhj78XQMeU3yDYSPcHfCeuOo2hV8GAQO9u1JuQFEHgA0O7wFKXO7miqg==", "dev": true, "requires": { "chalk": "^0.5.1", @@ -19556,19 +14467,19 @@ "ansi-regex": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", "dev": true }, "ansi-styles": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", "dev": true }, "chalk": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", "dev": true, "requires": { "ansi-styles": "^1.1.0", @@ -19578,28 +14489,16 @@ "supports-color": "^0.2.0" } }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", - "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true }, "strip-ansi": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", "dev": true, "requires": { "ansi-regex": "^0.2.1" @@ -19608,15 +14507,15 @@ "supports-color": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", "dev": true } } }, "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", "dev": true }, "grunt-legacy-log": { @@ -19667,7 +14566,7 @@ "grunt-shell": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-1.1.2.tgz", - "integrity": "sha1-Rz5GUwHSnQtW3xb+MQeYznFNCVY=", + "integrity": "sha512-gPYS+1WzGT9K5A4rFAz6I41Q8Dr3dgt464gNwLggwUP5bl2nzNipbn1QliN3/gFrBmed9BdQpeFKKS1+NTd/gA==", "dev": true, "requires": { "chalk": "^1.0.0" @@ -19676,19 +14575,19 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -19698,10 +14597,25 @@ "supports-color": "^2.0.0" } }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.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=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -19710,15 +14624,15 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true } } }, "grunt-webpack": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-4.0.2.tgz", - "integrity": "sha512-rrqb9SRlY69jEJuCglelB7IvGrI7lRpdfH2GXpFlIOGPRTTtlSxYMU4Fjg8FHaC6ilnMbW5jd55Ff1lR5OibCA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-5.0.0.tgz", + "integrity": "sha512-C7emzVIGJhZ5V5ZYjylr9sDD9PE9Dh/55NaSzP2P2dhif+m/1gHbjDZQ7PDzguyuzwBz4Qc8voQHR06FSp4CKg==", "dev": true, "requires": { "deep-for-each": "^3.0.0", @@ -19734,28 +14648,19 @@ "duplexer": "^0.1.2" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^0.2.0" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", "dev": true } } @@ -19767,18 +14672,18 @@ "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" } }, "has-proto": { @@ -19802,70 +14707,13 @@ "has-symbols": "^1.0.2" } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "function-bind": "^1.1.2" } }, "he": { @@ -19880,17 +14728,6 @@ "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -19903,7 +14740,7 @@ "hooker": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", "dev": true }, "html-encoding-sniffer": { @@ -19953,12 +14790,6 @@ "resolve-alpn": "^1.0.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -19969,12 +14800,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==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -19985,27 +14810,21 @@ } }, "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -20013,9 +14832,9 @@ } }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -20025,25 +14844,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "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 - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -20063,20 +14870,20 @@ "dev": true }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "ipaddr.js": { @@ -20095,26 +14902,6 @@ "is-windows": "^1.0.1" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -20155,13 +14942,12 @@ } }, "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, - "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-boolean-object": { @@ -20174,12 +14960,6 @@ "has-tostringtag": "^1.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.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -20187,32 +14967,12 @@ "dev": true }, "is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "requires": { - "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=", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "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" - } - } + "hasown": "^2.0.0" } }, "is-date-object": { @@ -20224,41 +14984,16 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-finalizationregistry": { @@ -20271,9 +15006,9 @@ } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-generator-function": { @@ -20307,24 +15042,10 @@ "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-number-object": { "version": "1.0.7", @@ -20390,12 +15111,6 @@ "call-bind": "^1.0.2" } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -20415,16 +15130,12 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-unc-path": { @@ -20468,52 +15179,55 @@ "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", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "requires": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "requires": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "dependencies": { "async": { @@ -20524,6 +15238,28 @@ } } }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "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" + } + } + } + }, "jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", @@ -20537,9 +15273,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -20547,9 +15283,9 @@ } }, "jsdoc-type-pratt-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", - "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true }, "jsdom": { @@ -20587,9 +15323,9 @@ }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true }, "form-data": { @@ -20616,10 +15352,10 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "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-traverse": { @@ -20631,17 +15367,14 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsonc-parser": { "version": "3.2.0", @@ -20662,8 +15395,7 @@ } }, "kexec": { - "version": "git+https://git@github.com/ably-forks/node-kexec.git#f29f54037c7db6ad29e1781463b182e5929215a0", - "integrity": "sha512-AF1dssPoaSWqFN8u6seVKCIBjavJ+wRQ5UBdUGMIldfKcJKipXanb43zFL8DWGYSHPR0nGOHsa72xmlQ81bKzw==", + "version": "git+ssh://git@github.com/ably-forks/node-kexec.git#f29f54037c7db6ad29e1781463b182e5929215a0", "dev": true, "from": "kexec@ably-forks/node-kexec#update-for-node-12", "requires": { @@ -20671,9 +15403,9 @@ } }, "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "requires": { "json-buffer": "3.0.1" } @@ -20684,12 +15416,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -20710,30 +15436,12 @@ "findup-sync": "^4.0.0", "fined": "^1.2.0", "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" - }, - "dependencies": { - "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" - } - }, + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "dependencies": { "findup-sync": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", @@ -20746,60 +15454,23 @@ "resolve-dir": "^1.0.1" } }, - "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.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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" - } - }, - "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==", + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { - "is-number": "^7.0.0" + "resolve": "^1.9.0" } } } }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -20824,7 +15495,19 @@ "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "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": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "log-symbols": { @@ -20846,12 +15529,12 @@ } }, "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "requires": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "lowercase-keys": { @@ -20866,14 +15549,6 @@ "dev": true, "requires": { "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } } }, "lunr": { @@ -20888,24 +15563,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -20918,55 +15575,25 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "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" - } - }, "marked": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.17.tgz", - "integrity": "sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "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" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-stream": { @@ -20984,46 +15611,17 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -21047,243 +15645,97 @@ "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "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", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.14.0", + "js-yaml": "4.0.0", "log-symbols": "4.0.0", "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", + "ms": "2.1.3", + "nanoid": "3.1.20", "serialize-javascript": "5.0.1", "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", + "supports-color": "8.1.1", "which": "2.0.2", "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", "yargs-unparser": "2.0.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, - "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==", + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": 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" - } + "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": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "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 - }, - "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.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -21298,70 +15750,50 @@ "path-is-absolute": "^1.0.0" } }, - "has-flag": { + "js-yaml": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.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==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "binary-extensions": "^2.0.0" + "brace-expansion": "^1.1.7" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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 }, - "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==", + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { - "picomatch": "^2.2.1" + "randombytes": "^2.1.0" } }, "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" } - }, - "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" - } } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -21369,40 +15801,27 @@ "dev": true }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "dev": true }, "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "negotiator": { @@ -21417,120 +15836,32 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, "node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "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" - } - }, - "null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "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==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, "nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", @@ -21543,41 +15874,10 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "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.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "object-is": { @@ -21596,15 +15896,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.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -21620,7 +15911,7 @@ "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, "requires": { "array-each": "^1.0.1", @@ -21676,7 +15967,7 @@ "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dev": true, "requires": { "for-own": "^1.0.0", @@ -21686,7 +15977,7 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -21715,20 +16006,11 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -21737,49 +16019,32 @@ "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - } } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/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" + "type-check": "^0.4.0" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "osenv": { @@ -21798,12 +16063,12 @@ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "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": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -21815,38 +16080,12 @@ "p-limit": "^3.0.2" } }, - "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": { - "aggregate-error": "^3.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -21856,23 +16095,10 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, "requires": { "is-absolute": "^1.0.0", @@ -21883,7 +16109,7 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, "parse5": { @@ -21901,25 +16127,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true, - "optional": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -21929,7 +16136,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -21947,7 +16154,7 @@ "path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, "requires": { "path-root-regex": "^0.1.0" @@ -21956,13 +16163,13 @@ "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "path-type": { @@ -21977,19 +16184,6 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -22002,12 +16196,6 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -22057,30 +16245,34 @@ } }, "playwright": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.22.2.tgz", - "integrity": "sha512-hUTpg7LytIl3/O4t0AQJS1V6hWsaSY5uZ7w1oCC8r3a1AQN5d6otIdCkiB3cbzgQkcMaRxisinjMFMVqZkybdQ==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", + "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", "dev": true, "requires": { - "playwright-core": "1.22.2" + "fsevents": "2.3.2", + "playwright-core": "1.39.0" + }, + "dependencies": { + "fsevents": { + "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 + } } }, "playwright-core": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.22.2.tgz", - "integrity": "sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q==", - "dev": true - }, - "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=", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", + "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", "dev": true }, "postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { "nanoid": "^3.3.6", @@ -22103,9 +16295,9 @@ "dev": true }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "pretty-format": { @@ -22127,30 +16319,12 @@ } } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -22180,40 +16354,12 @@ "ipaddr.js": "1.9.1" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -22223,33 +16369,10 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "qs": { @@ -22264,13 +16387,7 @@ "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true }, "querystringify": { @@ -22299,16 +16416,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -22358,78 +16465,34 @@ "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", "dev": true }, - "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" - }, - "dependencies": { - "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 - } - } - }, "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.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": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "requires": { - "resolve": "^1.9.0" - }, - "dependencies": { - "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" - } - } + "resolve": "^1.1.6" } }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, "reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" } @@ -22440,25 +16503,21 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, - "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-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" } }, "regexpp": { @@ -22467,46 +16526,22 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "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 - }, - "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 - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "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==", + "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 }, "requirejs": { "version": "2.1.22", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz", - "integrity": "sha1-3Xj9LTQYDA1ixyS1uK68BmTgNm8=", + "integrity": "sha512-AhZqN7UrWV8R2d1LfGfznskMJNF0Vb6yStwrCn52UbktJg6y5V1I7RoGRyJtACe86d50PyQn0Iw0jYDKMvc4iA==", "dev": true }, "requires-port": { @@ -22516,10 +16551,15 @@ "dev": true }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } }, "resolve-alpn": { "version": "1.2.1", @@ -22546,7 +16586,7 @@ "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "requires": { "expand-tilde": "^2.0.0", @@ -22559,26 +16599,14 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "requires": { "lowercase-keys": "^2.0.0" } }, - "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 - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -22586,56 +16614,37 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" }, "dependencies": { "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } } } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "requires": { "fsevents": "~2.3.2" - }, - "dependencies": { - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - } } }, "run-parallel": { @@ -22647,23 +16656,14 @@ "queue-microtask": "^1.2.2" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -22683,12 +16683,12 @@ "dev": true }, "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "requires": { - "ret": "~0.1.10" + "regexp-tree": "~0.1.1" } }, "safe-regex-test": { @@ -22733,20 +16733,50 @@ } }, "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": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "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 + } } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22760,6 +16790,12 @@ "requires": { "yallist": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -22810,9 +16846,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.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -22830,55 +16866,42 @@ "send": "0.18.0" } }, - "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-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } }, - "set-value": { + "set-function-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "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" - } - } + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "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": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "kind-of": "^6.0.2" } }, "shebang-command": { @@ -22908,39 +16931,31 @@ }, "dependencies": { "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } } } }, "shiki": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", - "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", "dev": true, "requires": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" } }, "side-channel": { @@ -22954,12 +16969,6 @@ "object-inspect": "^1.9.0" } }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -22967,154 +16976,29 @@ "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "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" - } - } + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "integrity": "sha512-jz8leTIGS8+qJywWiO9mKza0hJxexdeIYXhDHw9avTQcXSNAGk3hiiRMpmI2Qf9dOrZDrDpgH9VNefzuacWC9A==", "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" - } - } + "amdefine": ">=0.0.4" } }, - "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-explorer": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.2.tgz", - "integrity": "sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", "dev": true, "requires": { "btoa": "^1.2.1", @@ -23126,125 +17010,35 @@ "gzip-size": "^6.0.0", "lodash": "^4.17.20", "open": "^7.3.1", - "source-map": "^0.7.3", + "source-map": "^0.7.4", "temp": "^0.9.4", "yargs": "^16.2.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" - } - }, - "cliui": { - "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": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "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 - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi": { - "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", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "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.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true } } @@ -23255,19 +17049,6 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "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.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -23286,12 +17067,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-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", @@ -23309,56 +17084,17 @@ } }, "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "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": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -23374,94 +17110,21 @@ "internal-slot": "^1.0.4" } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string_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" - }, - "dependencies": { - "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-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "string.prototype.matchall": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", - "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -23471,49 +17134,50 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "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" } }, "strip-bom": { @@ -23522,12 +17186,6 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -23535,12 +17193,12 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -23556,67 +17214,42 @@ "dev": true }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "table-layout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", - "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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" + } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "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 } } }, - "task-closure-tools": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/task-closure-tools/-/task-closure-tools-0.1.10.tgz", - "integrity": "sha1-2bHs+A7jfi2tIkRbJiAseN0VU3s=", + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "temp": { @@ -23627,15 +17260,38 @@ "requires": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "terser": { - "version": "5.19.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", - "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, - "optional": true, - "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -23644,56 +17300,35 @@ }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "optional": true, - "peer": true + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true } } }, "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "dependencies": { - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -23701,28 +17336,9 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tinypool": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.2.4.tgz", @@ -23735,64 +17351,25 @@ "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", "dev": true }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "to-utf8": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", - "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" + "integrity": "sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==" }, "toidentifier": { "version": "1.0.1", @@ -23822,103 +17399,53 @@ } }, "ts-loader": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.2.0.tgz", - "integrity": "sha512-ebXBFrNyMSmbWgjnb3WBloUBK+VSx1xckaXsMXxlZRDqce/OPdYBVN5efB0W3V0defq0Gcy4YuzvPGqRgjj85A==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", + "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", "dev": true, "requires": { "chalk": "^4.1.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^2.0.0", + "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "dependencies": { - "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" - } - }, - "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 - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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" - } } } }, "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { - "json5": "^2.2.2", + "@types/json5": "^0.0.29", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } } } }, "tsconfig-paths-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -23926,28 +17453,23 @@ "tsconfig-paths": "^4.1.2" }, "dependencies": { - "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true } } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "tsutils": { @@ -23967,12 +17489,6 @@ } } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -23989,9 +17505,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": { @@ -24051,22 +17567,16 @@ "is-typed-array": "^1.1.9" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typedoc": { - "version": "0.23.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.8.tgz", - "integrity": "sha512-NLRTY/7XSrhiowR3xnH/nlfTnHk+dkzhHWAMT8guoZ6RHCQZIu3pJREMCqzdkWVCC5+dr9We7TtNeprR3Qy6Ag==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", "dev": true, "requires": { "lunr": "^2.3.9", - "marked": "^4.0.16", - "minimatch": "^5.1.0", - "shiki": "^0.10.1" + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" }, "dependencies": { "brace-expansion": { @@ -24079,9 +17589,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -24090,15 +17600,9 @@ } }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "unbox-primitive": { @@ -24116,48 +17620,31 @@ "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true }, "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "dev": true, "requires": { - "sprintf-js": "^1.0.3", + "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "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" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "universalify": { "version": "0.2.0", @@ -24171,57 +17658,10 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "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, - "optional": true - }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -24229,24 +17669,18 @@ } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "requires": { "punycode": "1.3.2", @@ -24256,7 +17690,7 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true } } @@ -24271,39 +17705,29 @@ "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": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, "uuid": { @@ -24313,9 +17737,9 @@ "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.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "v8flags": { @@ -24327,107 +17751,22 @@ "homedir-polyfill": "^1.0.1" } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true }, "vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "requires": { "esbuild": "^0.18.10", "fsevents": "~2.3.2", "postcss": "^8.4.27", "rollup": "^3.27.1" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - } } }, "vitest": { @@ -24447,22 +17786,57 @@ "vite": "^2.9.12 || ^3.0.0-0" }, "dependencies": { - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", "dev": true, "optional": true }, - "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" } }, "vite": { @@ -24480,22 +17854,16 @@ } } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "vscode-oniguruma": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", - "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", "dev": true }, "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", "dev": true }, "w3c-xmlserializer": { @@ -24508,126 +17876,13 @@ } }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - }, - "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 - }, - "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" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, - "optional": true, "requires": { - "chokidar": "^2.1.8" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "webidl-conversions": { @@ -24637,115 +17892,129 @@ "dev": true }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "webpack-cli": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz", - "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==", - "dev": true, - "requires": { - "@webpack-cli/info": "^1.1.0", - "@webpack-cli/serve": "^1.1.0", - "colorette": "^1.2.1", - "command-line-usage": "^6.1.0", - "commander": "^6.2.0", - "enquirer": "^2.3.6", - "execa": "^4.1.0", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "leven": "^3.1.0", - "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", - "webpack-merge": "^4.2.2" + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } } } }, "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.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "requires": { - "lodash": "^4.17.15" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" } }, "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true }, "whatwg-encoding": { "version": "2.0.0", @@ -24845,20 +18114,14 @@ "is-weakset": "^2.0.1" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -24879,6 +18142,12 @@ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -24892,7 +18161,7 @@ "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -24900,78 +18169,33 @@ } } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "wordwrapjs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", - "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.0.0" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", "dev": true }, "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==", + "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": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { "version": "8.14.2", @@ -25007,96 +18231,38 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.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" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yargs-unparser": { "version": "2.0.0", @@ -25108,21 +18274,13 @@ "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 - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 024620fcf8..e2ea2b0ff4 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,11 @@ "./build/ably-node.js": "./build/ably-reactnative.js" }, "browser": { - "./build/ably-node.js": "./build/ably-commonjs.js" + "./build/ably-node.js": "./build/ably.js" }, "files": [ "build/**", "ably.d.ts", - "callbacks.d.ts", - "callbacks.js", - "promises.d.ts", - "promises.js", "resources/**", "src/**", "react/**" @@ -46,8 +42,7 @@ "devDependencies": { "@ably/vcdiff-decoder": "1.0.4", "@testing-library/react": "^13.3.0", - "@types/crypto-js": "^4.0.1", - "@types/node": "^15.0.0", + "@types/node": "^18.0.0", "@types/request": "^2.48.7", "@types/ws": "^8.2.0", "@typescript-eslint/eslint-plugin": "^5.14.0", @@ -56,9 +51,10 @@ "async": "ably-forks/async#requirejs", "aws-sdk": "^2.1413.0", "chai": "^4.2.0", - "copy-webpack-plugin": "^6.4.1", + "copy-webpack-plugin": "^11.0.0", "cors": "^2.8.5", - "crypto-js": "ably-forks/crypto-js#crypto-lite", + "esbuild": "^0.18.10", + "esbuild-plugin-umd-wrapper": "^1.0.7", "eslint": "^7.13.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-jsdoc": "^40.0.0", @@ -67,36 +63,33 @@ "eslint-plugin-security": "^1.4.0", "express": "^4.17.1", "glob": "~4.4", - "google-closure-compiler": "^20180610.0.1", "grunt": "^1.6.1", "grunt-bump": "^0.3.1", "grunt-cli": "~1.2.0", - "grunt-closure-tools": "^1.0.0", "grunt-contrib-concat": "~0.5", "grunt-shell": "~1.1", - "grunt-webpack": "^4.0.2", + "grunt-webpack": "^5.0.0", "hexy": "~0.2", "jsdom": "^20.0.0", "kexec": "ably-forks/node-kexec#update-for-node-12", "minimist": "^1.2.5", "mocha": "^8.1.3", - "null-loader": "^4.0.1", "playwright": "^1.10.0", - "prettier": "^2.5.1", + "prettier": "^2.8.8", "react": ">=18.1.0", "react-dom": ">=18.1.0", "requirejs": "~2.1", "shelljs": "~0.8", "source-map-explorer": "^2.5.2", - "ts-loader": "^8.2.0", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^4.0.1", "tslib": "^2.3.1", - "typedoc": "^0.23.8", - "typescript": "^4.6.4", + "typedoc": "^0.24.7", + "typescript": "^4.9.5", "vite": "^4.4.9", "vitest": "^0.18.0", - "webpack": "^4.44.2", - "webpack-cli": "^4.2.0" + "webpack": "^5.79.0", + "webpack-cli": "^5.0.1" }, "engines": { "node": ">=5.10.x" @@ -128,12 +121,11 @@ "requirejs": "grunt requirejs", "lint": "eslint .", "lint:fix": "eslint --fix .", - "check-closure-compiler": "grunt check-closure-compiler", "prepare": "npm run build", "format": "prettier --write --ignore-path .gitignore --ignore-path .prettierignore src test ably.d.ts webpack.config.js Gruntfile.js scripts/cdn_deploy.js docs/chrome-mv3.md", "format:check": "prettier --check --ignore-path .gitignore --ignore-path .prettierignore src test ably.d.ts webpack.config.js Gruntfile.js scripts/cdn_deploy.js", "sourcemap": "source-map-explorer build/ably.min.js", "sourcemap:noencryption": "source-map-explorer build/ably.noencryption.min.js", - "docs": "typedoc --entryPoints ably.d.ts --out docs/generated/default --readme docs/landing-pages/default.md && typedoc --entryPoints promises.d.ts --out docs/generated/promises --name \"ably (Promise-based)\" --readme docs/landing-pages/promises.md && cp docs/landing-pages/choose-library.html docs/generated/index.html" + "docs": "typedoc --entryPoints ably.d.ts --out docs/generated --readme docs/landing-page.md" } } diff --git a/promises.d.ts b/promises.d.ts deleted file mode 100644 index fcbb9ac461..0000000000 --- a/promises.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Ably = require('./ably'); - -/** - * The `Rest` object offers a simple stateless API to interact directly with Ably's REST API. - */ -export declare class Rest extends Ably.Rest.Promise {} -/** - * A client that extends the functionality of {@link Rest} and provides additional realtime-specific features. - */ -export declare class Realtime extends Ably.Realtime.Promise {} -/** - * A generic Ably error object that contains an Ably-specific status code, and a generic status code. Errors returned from the Ably server are compatible with the `ErrorInfo` structure and should result in errors that inherit from `ErrorInfo`. - */ -export declare class ErrorInfo extends Types.ErrorInfo {} - -// Re-export the Types namespace. -import Types = Ably.Types; -export { Types }; diff --git a/promises.js b/promises.js deleted file mode 100644 index efb1645a40..0000000000 --- a/promises.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; -function promisifyOptions(options) { - if (typeof options == 'string') { - options = options.indexOf(':') == -1 ? { token: options } : { key: options }; - } - options.promises = true; - return options; -} - -/* Please note that the file imported below is only generated after running - * the build task. */ -// eslint-disable-next-line @typescript-eslint/no-var-requires -var Ably = require('./build/ably-node'); - -var ErrorInfo = function(message, code, statusCode, cause) { - return new Ably.ErrorInfo(message, code, statusCode, cause); -} - -var RestPromise = function (options) { - return new Ably.Rest(promisifyOptions(options)); -}; -Object.assign(RestPromise, Ably.Rest); - -var RealtimePromise = function (options) { - return new Ably.Realtime(promisifyOptions(options)); -}; -Object.assign(RealtimePromise, Ably.Realtime); - -module.exports = { - ErrorInfo: ErrorInfo, - Rest: RestPromise, - Realtime: RealtimePromise, -}; diff --git a/src/common/constants/TransportNames.ts b/src/common/constants/TransportNames.ts index c3e0ada287..9cda74c614 100644 --- a/src/common/constants/TransportNames.ts +++ b/src/common/constants/TransportNames.ts @@ -3,7 +3,6 @@ enum TransportNames { Comet = 'comet', XhrStreaming = 'xhr_streaming', XhrPolling = 'xhr_polling', - JsonP = 'jsonp', } export default TransportNames; diff --git a/src/common/lib/client/auth.ts b/src/common/lib/client/auth.ts index 5b0a855b63..3425547636 100644 --- a/src/common/lib/client/auth.ts +++ b/src/common/lib/client/auth.ts @@ -2,9 +2,6 @@ import Logger from '../util/logger'; import * as Utils from '../util/utils'; import Multicaster from '../util/multicaster'; import ErrorInfo, { IPartialErrorInfo } from '../types/errorinfo'; -import HmacSHA256 from 'crypto-js/build/hmac-sha256'; -import { stringify as stringifyBase64 } from 'crypto-js/build/enc-base64'; -import { createHmac } from 'crypto'; import { ErrnoException, RequestCallback, RequestParams } from '../../types/http'; import * as API from '../../../../ably'; import { StandardCallback } from '../../types/utils'; @@ -52,12 +49,14 @@ function normaliseAuthcallbackError(err: any) { } let hmac = (text: string, key: string): string => { - if (Platform.Config.createHmac) { - const inst = (Platform.Config.createHmac as typeof createHmac)('SHA256', key); - inst.update(text); - return inst.digest('base64'); - } - return stringifyBase64(HmacSHA256(text, key)); + const bufferUtils = Platform.BufferUtils; + + const textBuffer = bufferUtils.utf8Encode(text); + const keyBuffer = bufferUtils.utf8Encode(key); + + const digest = bufferUtils.hmacSha256(textBuffer, keyBuffer); + + return bufferUtils.base64Encode(digest); }; function c14n(capability?: string | Record>) { @@ -135,11 +134,6 @@ class Auth { if (useTokenAuth(options)) { /* Token auth */ - if (options.key && !hmac) { - const msg = 'client-side token request signing not supported'; - Logger.logAction(Logger.LOG_ERROR, 'Auth()', msg); - throw new Error(msg); - } if (noWayToRenew(options)) { Logger.logAction( Logger.LOG_ERROR, @@ -274,9 +268,7 @@ class Auth { _authOptions = authOptions as API.Types.AuthOptions; } if (!callback) { - if (this.client.options.promises) { - return Utils.promisify(this, 'authorize', arguments); - } + return Utils.promisify(this, 'authorize', arguments); } /* RSA10a: authorize() call implies token auth. If a key is passed it, we @@ -285,19 +277,6 @@ class Auth { throw new ErrorInfo('Unable to update auth options with incompatible key', 40102, 401); } - if (_authOptions && 'force' in _authOptions) { - Logger.logAction( - Logger.LOG_ERROR, - 'Auth.authorize', - 'Deprecation warning: specifying {force: true} in authOptions is no longer necessary, authorize() now always gets a new token. Please remove this, as in version 1.0 and later, having a non-null authOptions will overwrite stored library authOptions, which may not be what you want' - ); - /* Emulate the old behaviour: if 'force' was the only member of authOptions, - * set it to null so it doesn't overwrite stored. TODO: remove in version 1.0 */ - if (Utils.isOnlyPropIn(_authOptions, 'force')) { - _authOptions = null; - } - } - this._forceNewToken( tokenParams as API.Types.TokenParams, _authOptions, @@ -327,11 +306,6 @@ class Auth { ); } - authorise(tokenParams: API.Types.TokenParams | null, authOptions: API.Types.AuthOptions, callback: Function): void { - Logger.deprecated('Auth.authorise', 'Auth.authorize'); - this.authorize(tokenParams, authOptions, callback); - } - /* For internal use, eg by connectionManager - useful when want to call back * as soon as we have the new token, rather than waiting for it to take * effect on the connection as #authorize does */ @@ -451,7 +425,7 @@ class Auth { callback = authOptions; authOptions = null; } - if (!callback && this.client.options.promises) { + if (!callback) { return Utils.promisify(this, 'requestToken', arguments); } @@ -779,7 +753,7 @@ class Auth { callback = authOptions; authOptions = null; } - if (!callback && this.client.options.promises) { + if (!callback) { return Utils.promisify(this, 'createTokenRequest', arguments); } @@ -1063,19 +1037,14 @@ class Auth { return error.code && error.code >= 40140 && error.code < 40150; } - revokeTokens( - specifiers: TokenRevocationTargetSpecifier[], - options?: TokenRevocationOptions, - callback?: API.Types.StandardCallback - ): void; revokeTokens( specifiers: TokenRevocationTargetSpecifier[], options?: TokenRevocationOptions ): Promise; revokeTokens( specifiers: TokenRevocationTargetSpecifier[], - optionsOrCallbackArg?: TokenRevocationOptions | API.Types.StandardCallback, - callbackArg?: API.Types.StandardCallback + optionsOrCallbackArg?: TokenRevocationOptions | StandardCallback, + callbackArg?: StandardCallback ): void | Promise { if (useTokenAuth(this.client.options)) { throw new ErrorInfo('Cannot revoke tokens when using token auth', 40162, 401); @@ -1093,10 +1062,7 @@ class Auth { } if (callbackArg === undefined) { - if (this.client.options.promises) { - return Utils.promisify(this, 'revokeTokens', [specifiers, resolvedOptions]); - } - callbackArg = noop; + return Utils.promisify(this, 'revokeTokens', [specifiers, resolvedOptions]); } const callback = callbackArg; @@ -1107,7 +1073,7 @@ class Auth { }; const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultPostHeaders(this.client.options, format); + headers = Utils.defaultPostHeaders(this.client.options, { format }); if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers); @@ -1121,8 +1087,7 @@ class Auth { null, (err, body, headers, unpacked) => { if (err) { - // TODO remove this type assertion after fixing https://github.com/ably/ably-js/issues/1405 - callback(err as API.Types.ErrorInfo); + callback(err); return; } diff --git a/src/common/lib/client/channel.ts b/src/common/lib/client/channel.ts index 6350ef011d..efb273351e 100644 --- a/src/common/lib/client/channel.ts +++ b/src/common/lib/client/channel.ts @@ -78,10 +78,7 @@ class Channel extends EventEmitter { callback = params; params = null; } else { - if (this.rest.options.promises) { - return Utils.promisify(this, 'history', arguments); - } - callback = noop; + return Utils.promisify(this, 'history', arguments); } } @@ -92,17 +89,17 @@ class Channel extends EventEmitter { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.rest.http.supportsLinkHeaders ? undefined : format, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); const options = this.channelOptions; - new PaginatedResource(rest, this.basePath + '/messages', headers, envelope, function ( + new PaginatedResource(rest, this.basePath + '/messages', headers, envelope, async function ( body: any, headers: Record, unpacked?: boolean ) { - return Message.fromResponseBody(body, options, unpacked ? undefined : format); + return await Message.fromResponseBody(body, options, unpacked ? undefined : format); }).get(params as Record, callback); } @@ -115,10 +112,7 @@ class Channel extends EventEmitter { let params: any; if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'publish', arguments); - } - callback = noop; + return Utils.promisify(this, 'publish', arguments); } if (typeof first === 'string' || first === null) { @@ -148,9 +142,9 @@ class Channel extends EventEmitter { options = rest.options, format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, idempotentRestPublishing = rest.options.idempotentRestPublishing, - headers = Utils.defaultPostHeaders(rest.options, format); + headers = Utils.defaultPostHeaders(rest.options, { format }); - if (options.headers) Utils.mixin(headers, options.headers); + Utils.mixin(headers, options.headers); if (idempotentRestPublishing && allEmptyIds(messages)) { const msgIdBase = Utils.randomString(MSG_ID_ENTROPY_BYTES); @@ -192,12 +186,12 @@ class Channel extends EventEmitter { } status(callback?: StandardCallback): void | Promise { - if (typeof callback !== 'function' && this.rest.options.promises) { + if (typeof callback !== 'function') { return Utils.promisify(this, 'status', []); } const format = this.rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json; - const headers = Utils.defaultPostHeaders(this.rest.options, format); + const headers = Utils.defaultPostHeaders(this.rest.options, { format }); Resource.get(this.rest, this.basePath, headers, {}, format, callback || noop); } diff --git a/src/common/lib/client/connection.ts b/src/common/lib/client/connection.ts index a1f823710d..be5177ba48 100644 --- a/src/common/lib/client/connection.ts +++ b/src/common/lib/client/connection.ts @@ -8,8 +8,6 @@ import { NormalisedClientOptions } from '../../types/ClientOptions'; import Realtime from './realtime'; import Platform from 'common/platform'; -function noop() {} - class Connection extends EventEmitter { ably: Realtime; connectionManager: ConnectionManager; @@ -58,10 +56,7 @@ class Connection extends EventEmitter { ping(callback: Function): Promise | void { Logger.logAction(Logger.LOG_MINOR, 'Connection.ping()', ''); if (!callback) { - if (this.ably.options.promises) { - return Utils.promisify(this, 'ping', arguments); - } - callback = noop; + return Utils.promisify(this, 'ping', arguments); } this.connectionManager.ping(null, callback); } diff --git a/src/common/lib/client/paginatedresource.ts b/src/common/lib/client/paginatedresource.ts index 4d16a3b894..0deff1dace 100644 --- a/src/common/lib/client/paginatedresource.ts +++ b/src/common/lib/client/paginatedresource.ts @@ -5,7 +5,7 @@ import ErrorInfo, { IPartialErrorInfo } from '../types/errorinfo'; import { PaginatedResultCallback } from '../../types/utils'; import Rest from './rest'; -export type BodyHandler = (body: unknown, headers: Record, unpacked?: boolean) => any; +export type BodyHandler = (body: unknown, headers: Record, unpacked?: boolean) => Promise; function getRelParams(linkUrl: string) { const urlMatch = linkUrl.match(/^\.\/(\w+)\?(.*)$/); @@ -149,25 +149,32 @@ class PaginatedResource { callback?.(err); return; } - let items, linkHeader, relParams; - try { - items = this.bodyHandler(body, headers || {}, unpacked); - } catch (e) { - /* If we got an error, the failure to parse the body is almost certainly - * due to that, so callback with that in preference over the parse error */ - callback?.(err || e); - return; - } - if (headers && (linkHeader = headers['Link'] || headers['link'])) { - relParams = parseRelLinks(linkHeader); - } + const handleBody = async () => { + let items, linkHeader, relParams; - if (this.useHttpPaginatedResponse) { - callback(null, new HttpPaginatedResponse(this, items, headers || {}, statusCode as number, relParams, err)); - } else { - callback(null, new PaginatedResult(this, items, relParams)); - } + try { + items = await this.bodyHandler(body, headers || {}, unpacked); + } catch (e) { + /* If we got an error, the failure to parse the body is almost certainly + * due to that, so throw that in preference over the parse error */ + throw err || e; + } + + if (headers && (linkHeader = headers['Link'] || headers['link'])) { + relParams = parseRelLinks(linkHeader); + } + + if (this.useHttpPaginatedResponse) { + return new HttpPaginatedResponse(this, items, headers || {}, statusCode as number, relParams, err); + } else { + return new PaginatedResult(this, items, relParams); + } + }; + + handleBody() + .then((result) => callback(null, result)) + .catch((err) => callback(err, null)); } } @@ -188,7 +195,7 @@ export class PaginatedResult { if (relParams) { if ('first' in relParams) { this.first = function (callback: (result?: ErrorInfo | null) => void) { - if (!callback && self.resource.rest.options.promises) { + if (!callback) { return Utils.promisify(self, 'first', []); } self.get(relParams.first, callback); @@ -196,14 +203,14 @@ export class PaginatedResult { } if ('current' in relParams) { this.current = function (callback: (results?: ErrorInfo | null) => void) { - if (!callback && self.resource.rest.options.promises) { + if (!callback) { return Utils.promisify(self, 'current', []); } self.get(relParams.current, callback); }; } this.next = function (callback: (results?: ErrorInfo | null) => void) { - if (!callback && self.resource.rest.options.promises) { + if (!callback) { return Utils.promisify(self, 'next', []); } if ('next' in relParams) { diff --git a/src/common/lib/client/presence.ts b/src/common/lib/client/presence.ts index d17a68bc85..8d521bdf4c 100644 --- a/src/common/lib/client/presence.ts +++ b/src/common/lib/client/presence.ts @@ -8,8 +8,6 @@ import { PaginatedResultCallback } from '../../types/utils'; import Channel from './channel'; import RealtimeChannel from './realtimechannel'; -function noop() {} - class Presence extends EventEmitter { channel: RealtimeChannel | Channel; basePath: string; @@ -28,26 +26,23 @@ class Presence extends EventEmitter { callback = params; params = null; } else { - if (this.channel.rest.options.promises) { - return Utils.promisify(this, 'get', arguments); - } - callback = noop; + return Utils.promisify(this, 'get', arguments); } } const rest = this.channel.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.channel.rest.http.supportsLinkHeaders ? undefined : format, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); const options = this.channel.channelOptions; - new PaginatedResource(rest, this.basePath, headers, envelope, function ( + new PaginatedResource(rest, this.basePath, headers, envelope, async function ( body: any, headers: Record, unpacked?: boolean ) { - return PresenceMessage.fromResponseBody(body, options as CipherOptions, unpacked ? undefined : format); + return await PresenceMessage.fromResponseBody(body, options as CipherOptions, unpacked ? undefined : format); }).get(params, callback); } @@ -69,27 +64,24 @@ class Presence extends EventEmitter { callback = params; params = null; } else { - if (this.channel.rest.options.promises) { - return Utils.promisify(this, '_history', [params]); - } - callback = noop; + return Utils.promisify(this, '_history', [params]); } } const rest = this.channel.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.channel.rest.http.supportsLinkHeaders ? undefined : format, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); const options = this.channel.channelOptions; - new PaginatedResource(rest, this.basePath + '/history', headers, envelope, function ( + new PaginatedResource(rest, this.basePath + '/history', headers, envelope, async function ( body: any, headers: Record, unpacked?: boolean ) { - return PresenceMessage.fromResponseBody(body, options as CipherOptions, unpacked ? undefined : format); + return await PresenceMessage.fromResponseBody(body, options as CipherOptions, unpacked ? undefined : format); }).get(params, callback); } } diff --git a/src/common/lib/client/push.ts b/src/common/lib/client/push.ts index 0b1a9c4fa7..b628457f50 100644 --- a/src/common/lib/client/push.ts +++ b/src/common/lib/client/push.ts @@ -7,8 +7,6 @@ import PushChannelSubscription from '../types/pushchannelsubscription'; import { ErrCallback, PaginatedResultCallback, StandardCallback } from '../../types/utils'; import Rest from './rest'; -const noop = function () {}; - class Push { rest: Rest; admin: Admin; @@ -33,18 +31,15 @@ class Admin { publish(recipient: any, payload: any, callback: ErrCallback) { const rest = this.rest; const format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultPostHeaders(rest.options, format), + headers = Utils.defaultPostHeaders(rest.options, { format }), params = {}; const body = Utils.mixin({ recipient: recipient }, payload); if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'publish', arguments); - } - callback = noop; + return Utils.promisify(this, 'publish', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); @@ -64,17 +59,14 @@ class DeviceRegistrations { const rest = this.rest; const body = DeviceDetails.fromValues(device); const format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultPostHeaders(rest.options, format), + headers = Utils.defaultPostHeaders(rest.options, { format }), params = {}; if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'save', arguments); - } - callback = noop; + return Utils.promisify(this, 'save', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); @@ -103,14 +95,11 @@ class DeviceRegistrations { get(deviceIdOrDetails: any, callback: StandardCallback) { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultGetHeaders(rest.options, format), + headers = Utils.defaultGetHeaders(rest.options, { format }), deviceId = deviceIdOrDetails.id || deviceIdOrDetails; if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'get', arguments); - } - callback = noop; + return Utils.promisify(this, 'get', arguments); } if (typeof deviceId !== 'string' || !deviceId.length) { @@ -124,7 +113,7 @@ class DeviceRegistrations { return; } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); Resource.get( rest, @@ -150,18 +139,15 @@ class DeviceRegistrations { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.rest.http.supportsLinkHeaders ? undefined : format, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'list', arguments); - } - callback = noop; + return Utils.promisify(this, 'list', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); - new PaginatedResource(rest, '/push/deviceRegistrations', headers, envelope, function ( + new PaginatedResource(rest, '/push/deviceRegistrations', headers, envelope, async function ( body: any, headers: Record, unpacked?: boolean @@ -173,15 +159,12 @@ class DeviceRegistrations { remove(deviceIdOrDetails: any, callback: ErrCallback) { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultGetHeaders(rest.options, format), + headers = Utils.defaultGetHeaders(rest.options, { format }), params = {}, deviceId = deviceIdOrDetails.id || deviceIdOrDetails; if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'remove', arguments); - } - callback = noop; + return Utils.promisify(this, 'remove', arguments); } if (typeof deviceId !== 'string' || !deviceId.length) { @@ -195,7 +178,7 @@ class DeviceRegistrations { return; } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); @@ -212,16 +195,13 @@ class DeviceRegistrations { removeWhere(params: any, callback: ErrCallback) { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'removeWhere', arguments); - } - callback = noop; + return Utils.promisify(this, 'removeWhere', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); @@ -240,17 +220,14 @@ class ChannelSubscriptions { const rest = this.rest; const body = PushChannelSubscription.fromValues(subscription); const format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultPostHeaders(rest.options, format), + headers = Utils.defaultPostHeaders(rest.options, { format }), params = {}; if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'save', arguments); - } - callback = noop; + return Utils.promisify(this, 'save', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); @@ -275,18 +252,15 @@ class ChannelSubscriptions { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.rest.http.supportsLinkHeaders ? undefined : format, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'list', arguments); - } - callback = noop; + return Utils.promisify(this, 'list', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); - new PaginatedResource(rest, '/push/channelSubscriptions', headers, envelope, function ( + new PaginatedResource(rest, '/push/channelSubscriptions', headers, envelope, async function ( body: any, headers: Record, unpacked?: boolean @@ -298,16 +272,13 @@ class ChannelSubscriptions { removeWhere(params: any, callback: PaginatedResultCallback) { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'removeWhere', arguments); - } - callback = noop; + return Utils.promisify(this, 'removeWhere', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); @@ -321,20 +292,17 @@ class ChannelSubscriptions { const rest = this.rest, format = rest.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.rest.http.supportsLinkHeaders ? undefined : format, - headers = Utils.defaultGetHeaders(rest.options, format); + headers = Utils.defaultGetHeaders(rest.options, { format }); if (typeof callback !== 'function') { - if (this.rest.options.promises) { - return Utils.promisify(this, 'listChannels', arguments); - } - callback = noop; + return Utils.promisify(this, 'listChannels', arguments); } - if (rest.options.headers) Utils.mixin(headers, rest.options.headers); + Utils.mixin(headers, rest.options.headers); if (rest.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' }); - new PaginatedResource(rest, '/push/channels', headers, envelope, function ( + new PaginatedResource(rest, '/push/channels', headers, envelope, async function ( body: unknown, headers: Record, unpacked?: boolean diff --git a/src/common/lib/client/realtime.ts b/src/common/lib/client/realtime.ts index 2098f5643e..416f5748f6 100644 --- a/src/common/lib/client/realtime.ts +++ b/src/common/lib/client/realtime.ts @@ -4,11 +4,10 @@ import EventEmitter from '../util/eventemitter'; import Logger from '../util/logger'; import Connection from './connection'; import RealtimeChannel from './realtimechannel'; -import Defaults from '../util/defaults'; import ErrorInfo from '../types/errorinfo'; import ProtocolMessage from '../types/protocolmessage'; import { ChannelOptions } from '../../types/channel'; -import ClientOptions, { DeprecatedClientOptions } from '../../types/ClientOptions'; +import ClientOptions from '../../types/ClientOptions'; import * as API from '../../../../ably'; import ConnectionManager from '../transport/connectionmanager'; import Platform from 'common/platform'; @@ -36,13 +35,6 @@ class Realtime extends Rest { this.connection.close(); } - static Promise = function (options: DeprecatedClientOptions): Realtime { - options = Defaults.objectifyOptions(options); - options.promises = true; - return new Realtime(options); - }; - - static Callbacks = Realtime; static Utils = Utils; static ConnectionManager = ConnectionManager; static Platform = Platform; @@ -83,12 +75,13 @@ class Channels extends EventEmitter { } } - onChannelMessage(msg: ProtocolMessage) { + // Access to this method is synchronised by ConnectionManager#processChannelMessage. + async processChannelMessage(msg: ProtocolMessage) { const channelName = msg.channel; if (channelName === undefined) { Logger.logAction( Logger.LOG_ERROR, - 'Channels.onChannelMessage()', + 'Channels.processChannelMessage()', 'received event unspecified channel, action = ' + msg.action ); return; @@ -97,12 +90,12 @@ class Channels extends EventEmitter { if (!channel) { Logger.logAction( Logger.LOG_ERROR, - 'Channels.onChannelMessage()', + 'Channels.processChannelMessage()', 'received event for non-existent channel: ' + channelName ); return; } - channel.onMessage(msg); + await channel.processMessage(msg); } /* called when a transport becomes connected; reattempt attach/detach diff --git a/src/common/lib/client/realtimechannel.ts b/src/common/lib/client/realtimechannel.ts index 615ab6a686..e3262a65d2 100644 --- a/src/common/lib/client/realtimechannel.ts +++ b/src/common/lib/client/realtimechannel.ts @@ -136,9 +136,7 @@ class RealtimeChannel extends Channel { setOptions(options?: API.Types.ChannelOptions, callback?: ErrCallback): void | Promise { if (!callback) { - if (this.rest.options.promises) { - return Utils.promisify(this, 'setOptions', arguments); - } + return Utils.promisify(this, 'setOptions', arguments); } const _callback = callback || @@ -207,11 +205,7 @@ class RealtimeChannel extends Channel { let callback = args[argCount - 1]; if (typeof callback !== 'function') { - if (this.realtime.options.promises) { - return Utils.promisify(this, 'publish', arguments); - } - callback = noop; - ++argCount; + return Utils.promisify(this, 'publish', arguments); } if (!this.connectionManager.activeState()) { callback(this.connectionManager.getError()); @@ -285,33 +279,11 @@ class RealtimeChannel extends Channel { } } - attach( - flags?: API.Types.ChannelMode[] | ErrCallback, - callback?: StandardCallback - ): void | Promise { - let _flags: API.Types.ChannelMode[] | null | undefined; - if (typeof flags === 'function') { - callback = flags; - _flags = null; - } else { - _flags = flags; - } + attach(callback?: StandardCallback): void | Promise { if (!callback) { - if (this.realtime.options.promises) { - return Utils.promisify(this, 'attach', arguments); - } - callback = function (err?: ErrorInfo | null) { - if (err) { - Logger.logAction(Logger.LOG_MAJOR, 'RealtimeChannel.attach()', 'Channel attach failed: ' + err.toString()); - } - }; + return Utils.promisify(this, 'attach', arguments); } - if (_flags) { - Logger.deprecated('channel.attach() with flags', 'channel.setOptions() with channelOptions.params'); - /* If flags requested, always do a re-attach. TODO only do this if - * current mode differs from requested mode */ - this._requestedFlags = _flags as API.Types.ChannelMode[]; - } else if (this.state === 'attached') { + if (this.state === 'attached') { callback(null, null); return; } @@ -389,10 +361,7 @@ class RealtimeChannel extends Channel { detach(callback: ErrCallback): void | Promise { if (!callback) { - if (this.realtime.options.promises) { - return Utils.promisify(this, 'detach', arguments); - } - callback = noop; + return Utils.promisify(this, 'detach', arguments); } const connectionManager = this.connectionManager; if (!connectionManager.activeState()) { @@ -445,7 +414,7 @@ class RealtimeChannel extends Channel { subscribe(...args: unknown[] /* [event], listener, [callback] */): void | Promise { const [event, listener, callback] = RealtimeChannel.processListenerArgs(args); - if (!callback && this.realtime.options.promises) { + if (!callback) { return Utils.promisify(this, 'subscribe', [event, listener]); } @@ -614,7 +583,8 @@ class RealtimeChannel extends Channel { this.sendMessage(msg, callback); } - onMessage(message: ProtocolMessage): void { + // Access to this method is synchronised by ConnectionManager#processChannelMessage, in order to synchronise access to the state stored in _decodingContext. + async processMessage(message: ProtocolMessage): Promise { if ( message.action === actions.ATTACHED || message.action === actions.MESSAGE || @@ -689,12 +659,12 @@ class RealtimeChannel extends Channel { for (let i = 0; i < presence.length; i++) { try { presenceMsg = presence[i]; - PresenceMessage.decode(presenceMsg, options); + await PresenceMessage.decode(presenceMsg, options); if (!presenceMsg.connectionId) presenceMsg.connectionId = connectionId; if (!presenceMsg.timestamp) presenceMsg.timestamp = timestamp; if (!presenceMsg.id) presenceMsg.id = id + ':' + i; } catch (e) { - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.onMessage()', (e as Error).toString()); + Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', (e as Error).toString()); } } this.presence.setPresence(presence, isSync, syncChannelSerial as any); @@ -705,7 +675,7 @@ class RealtimeChannel extends Channel { if (this.state !== 'attached') { Logger.logAction( Logger.LOG_MAJOR, - 'RealtimeChannel.onMessage()', + 'RealtimeChannel.processMessage()', 'Message "' + message.id + '" skipped as this channel "' + @@ -735,7 +705,7 @@ class RealtimeChannel extends Channel { '" on this channel "' + this.name + '".'; - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.onMessage()', msg); + Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', msg); this._startDecodeFailureRecovery(new ErrorInfo(msg, 40018, 400)); break; } @@ -743,10 +713,10 @@ class RealtimeChannel extends Channel { for (let i = 0; i < messages.length; i++) { const msg = messages[i]; try { - Message.decode(msg, this._decodingContext); + await Message.decode(msg, this._decodingContext); } catch (e) { /* decrypt failed .. the most likely cause is that we have the wrong key */ - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.onMessage()', (e as Error).toString()); + Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', (e as Error).toString()); switch ((e as ErrorInfo).code) { case 40018: /* decode failure */ @@ -786,7 +756,7 @@ class RealtimeChannel extends Channel { default: Logger.logAction( Logger.LOG_ERROR, - 'RealtimeChannel.onMessage()', + 'RealtimeChannel.processMessage()', 'Fatal protocol error: unrecognised action (' + message.action + ')' ); this.connectionManager.abort(ConnectionErrors.unknownChannelErr()); @@ -795,7 +765,11 @@ class RealtimeChannel extends Channel { _startDecodeFailureRecovery(reason: ErrorInfo): void { if (!this._lastPayload.decodeFailureRecoveryInProgress) { - Logger.logAction(Logger.LOG_MAJOR, 'RealtimeChannel.onMessage()', 'Starting decode failure recovery process.'); + Logger.logAction( + Logger.LOG_MAJOR, + 'RealtimeChannel.processMessage()', + 'Starting decode failure recovery process.' + ); this._lastPayload.decodeFailureRecoveryInProgress = true; this._attach(true, reason, () => { this._lastPayload.decodeFailureRecoveryInProgress = false; @@ -983,10 +957,7 @@ class RealtimeChannel extends Channel { callback = params; params = null; } else { - if (this.rest.options.promises) { - return Utils.promisify(this, 'history', arguments); - } - callback = noop; + return Utils.promisify(this, 'history', arguments); } } diff --git a/src/common/lib/client/realtimepresence.ts b/src/common/lib/client/realtimepresence.ts index 51d6f51f22..f76c65021a 100644 --- a/src/common/lib/client/realtimepresence.ts +++ b/src/common/lib/client/realtimepresence.ts @@ -26,8 +26,6 @@ interface RealtimeHistoryParams { from_serial?: string | null; } -const noop = function () {}; - function getClientId(realtimePresence: RealtimePresence) { return realtimePresence.channel.realtime.auth.clientId; } @@ -134,10 +132,7 @@ class RealtimePresence extends Presence { callback = data as ErrCallback; data = null; } else { - if (this.channel.realtime.options.promises) { - return Utils.promisify(this, '_enterOrUpdateClient', [id, clientId, data, action]); - } - callback = noop; + return Utils.promisify(this, '_enterOrUpdateClient', [id, clientId, data, action]); } } @@ -205,10 +200,7 @@ class RealtimePresence extends Presence { callback = data as ErrCallback; data = null; } else { - if (this.channel.realtime.options.promises) { - return Utils.promisify(this, 'leaveClient', [clientId, data]); - } - callback = noop; + return Utils.promisify(this, 'leaveClient', [clientId, data]); } } @@ -262,10 +254,7 @@ class RealtimePresence extends Presence { const waitForSync = !params || ('waitForSync' in params ? params.waitForSync : true); if (!callback) { - if (this.channel.realtime.options.promises) { - return Utils.promisify(this, 'get', args); - } - callback = noop; + return Utils.promisify(this, 'get', args); } function returnMembers(members: PresenceMap) { @@ -311,10 +300,7 @@ class RealtimePresence extends Presence { callback = params; params = null; } else { - if (this.channel.realtime.options.promises) { - return Utils.promisify(this, 'history', arguments); - } - callback = noop; + return Utils.promisify(this, 'history', arguments); } } @@ -506,18 +492,6 @@ class RealtimePresence extends Presence { }); } - /* Deprecated */ - on(...args: unknown[]): void { - Logger.deprecated('presence.on', 'presence.subscribe'); - this.subscribe(...args); - } - - /* Deprecated */ - off(...args: unknown[]): void { - Logger.deprecated('presence.off', 'presence.unsubscribe'); - this.unsubscribe(...args); - } - subscribe(..._args: unknown[] /* [event], listener, [callback] */): void | Promise { const args = RealtimeChannel.processListenerArgs(_args); const event = args[0]; @@ -526,10 +500,7 @@ class RealtimePresence extends Presence { const channel = this.channel; if (!callback) { - if (this.channel.realtime.options.promises) { - return Utils.promisify(this, 'subscribe', [event, listener]); - } - callback = noop; + return Utils.promisify(this, 'subscribe', [event, listener]); } if (channel.state === 'failed') { diff --git a/src/common/lib/client/rest.ts b/src/common/lib/client/rest.ts index ef7dd31dcc..f70d9ef8fa 100644 --- a/src/common/lib/client/rest.ts +++ b/src/common/lib/client/rest.ts @@ -11,7 +11,7 @@ import HttpMethods from '../../constants/HttpMethods'; import { ChannelOptions } from '../../types/channel'; import { PaginatedResultCallback, StandardCallback } from '../../types/utils'; import { ErrnoException, IHttp, RequestParams } from '../../types/http'; -import ClientOptions, { DeprecatedClientOptions, NormalisedClientOptions } from '../../types/ClientOptions'; +import ClientOptions, { NormalisedClientOptions } from '../../types/ClientOptions'; import * as API from '../../../../ably'; import Platform from '../../platform'; @@ -51,9 +51,7 @@ class Rest { } const optionsObj = Defaults.objectifyOptions(options); - if (optionsObj.log) { - Logger.setLog(optionsObj.log.level, optionsObj.log.handler); - } + Logger.setLog(optionsObj.logLevel, optionsObj.logHandler); Logger.logAction(Logger.LOG_MICRO, 'Rest()', 'initialized with clientOptions ' + Platform.Config.inspect(options)); const normalOptions = (this.options = Defaults.normaliseOptions(optionsObj)); @@ -105,17 +103,14 @@ class Rest { callback = params; params = null; } else { - if (this.options.promises) { - return Utils.promisify(this, 'stats', [params]) as Promise>; - } - callback = noop; + return Utils.promisify(this, 'stats', [params]) as Promise>; } } const headers = Utils.defaultGetHeaders(this.options), format = this.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.http.supportsLinkHeaders ? undefined : format; - if (this.options.headers) Utils.mixin(headers, this.options.headers); + Utils.mixin(headers, this.options.headers); new PaginatedResource(this, '/stats', headers, envelope, function ( body: unknown, @@ -135,9 +130,7 @@ class Rest { callback = params; params = null; } else { - if (this.options.promises) { - return Utils.promisify(this, 'time', [params]) as Promise; - } + return Utils.promisify(this, 'time', [params]) as Promise; } } @@ -181,6 +174,7 @@ class Rest { request( method: string, path: string, + version: number, params: RequestParams, body: unknown, customHeaders: Record, @@ -194,23 +188,20 @@ class Rest { params = params || {}; const _method = method.toLowerCase() as HttpMethods; const headers = - _method == 'get' ? Utils.defaultGetHeaders(this.options, format) : Utils.defaultPostHeaders(this.options, format); + _method == 'get' + ? Utils.defaultGetHeaders(this.options, { format, protocolVersion: version }) + : Utils.defaultPostHeaders(this.options, { format, protocolVersion: version }); if (callback === undefined) { - if (this.options.promises) { - return Utils.promisify(this, 'request', [method, path, params, body, customHeaders]) as Promise< - HttpPaginatedResponse - >; - } - callback = noop; + return Utils.promisify(this, 'request', [method, path, version, params, body, customHeaders]) as Promise< + HttpPaginatedResponse + >; } if (typeof body !== 'string') { body = encoder(body); } - if (this.options.headers) { - Utils.mixin(headers, this.options.headers); - } + Utils.mixin(headers, this.options.headers); if (customHeaders) { Utils.mixin(headers, customHeaders); } @@ -219,7 +210,7 @@ class Rest { path, headers, envelope, - function (resbody: unknown, headers: Record, unpacked?: boolean) { + async function (resbody: unknown, headers: Record, unpacked?: boolean) { return Utils.ensureArray(unpacked ? resbody : decoder(resbody as string & Buffer)); }, /* useHttpPaginatedResponse: */ true @@ -239,26 +230,17 @@ class Rest { } } - batchPublish( - specOrSpecs: T, - callback: API.Types.StandardCallback - ): void; batchPublish( specOrSpecs: T ): Promise; batchPublish( specOrSpecs: T, - callbackArg?: API.Types.StandardCallback + callback?: StandardCallback ): void | Promise { - if (callbackArg === undefined) { - if (this.options.promises) { - return Utils.promisify(this, 'batchPublish', [specOrSpecs]); - } - callbackArg = noop; + if (callback === undefined) { + return Utils.promisify(this, 'batchPublish', [specOrSpecs]); } - const callback = callbackArg; - let requestBodyDTO: BatchPublishSpec[]; let singleSpecMode: boolean; if (Utils.isArray(specOrSpecs)) { @@ -270,7 +252,7 @@ class Rest { } const format = this.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultPostHeaders(this.options, format); + headers = Utils.defaultPostHeaders(this.options, { format }); if (this.options.headers) Utils.mixin(headers, this.options.headers); @@ -284,8 +266,7 @@ class Rest { null, (err, body, headers, unpacked) => { if (err) { - // TODO remove this type assertion after fixing https://github.com/ably/ably-js/issues/1405 - callback(err as API.Types.ErrorInfo); + callback(err); return; } @@ -293,31 +274,25 @@ class Rest { // I don't love the below type assertions for `callback` but not sure how to avoid them if (singleSpecMode) { - (callback as API.Types.StandardCallback)(null, batchResults[0]); + (callback as StandardCallback)(null, batchResults[0]); } else { - (callback as API.Types.StandardCallback)(null, batchResults); + (callback as StandardCallback)(null, batchResults); } } ); } - batchPresence(channels: string[], callback: API.Types.StandardCallback): void; batchPresence(channels: string[]): Promise; batchPresence( channels: string[], - callbackArg?: API.Types.StandardCallback + callback?: StandardCallback ): void | Promise { - if (callbackArg === undefined) { - if (this.options.promises) { - return Utils.promisify(this, 'batchPresence', [channels]); - } - callbackArg = noop; + if (callback === undefined) { + return Utils.promisify(this, 'batchPresence', [channels]); } - const callback = callbackArg; - const format = this.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, - headers = Utils.defaultPostHeaders(this.options, format); + headers = Utils.defaultPostHeaders(this.options, { format }); if (this.options.headers) Utils.mixin(headers, this.options.headers); @@ -331,8 +306,7 @@ class Rest { null, (err, body, headers, unpacked) => { if (err) { - // TODO remove this type assertion after fixing https://github.com/ably/ably-js/issues/1405 - callback(err as API.Types.ErrorInfo); + callback(err); return; } @@ -347,13 +321,6 @@ class Rest { Logger.setLog(logOptions.level, logOptions.handler); } - static Promise = function (options: DeprecatedClientOptions): Rest { - options = Defaults.objectifyOptions(options); - options.promises = true; - return new Rest(options); - }; - - static Callbacks = Rest; static Platform = Platform; static Crypto?: typeof Platform.Crypto; static Message = Message; diff --git a/src/common/lib/transport/comettransport.ts b/src/common/lib/transport/comettransport.ts index bcb39c7fe2..c2c68fa3da 100644 --- a/src/common/lib/transport/comettransport.ts +++ b/src/common/lib/transport/comettransport.ts @@ -363,12 +363,18 @@ abstract class CometTransport extends Transport { return responseData; } - /* For comet, we could do the auth update by aborting the current recv and - * starting a new one with the new token, that'd be sufficient for realtime. - * Problem is JSONP - you can't cancel truly abort a recv once started. So - * we need to send an AUTH for jsonp. In which case it's simpler to keep all - * comet transports the same and do it for all of them. So we send the AUTH - * instead, and don't need to abort the recv */ + /* Historical comment, back from when we supported JSONP: + * + * > For comet, we could do the auth update by aborting the current recv and + * > starting a new one with the new token, that'd be sufficient for realtime. + * > Problem is JSONP - you can't cancel truly abort a recv once started. So + * > we need to send an AUTH for jsonp. In which case it's simpler to keep all + * > comet transports the same and do it for all of them. So we send the AUTH + * > instead, and don't need to abort the recv + * + * Now that we’ve dropped JSONP support, we may be able to revisit the above; + * see https://github.com/ably/ably-js/issues/1214. + */ onAuthUpdated = (tokenDetails: API.Types.TokenDetails): void => { this.authParams = { access_token: tokenDetails.token }; }; diff --git a/src/common/lib/transport/connectionmanager.ts b/src/common/lib/transport/connectionmanager.ts index 20cae106ec..3ec2f39bb4 100644 --- a/src/common/lib/transport/connectionmanager.ts +++ b/src/common/lib/transport/connectionmanager.ts @@ -21,6 +21,8 @@ import HttpStatusCodes from 'common/constants/HttpStatusCodes'; type Realtime = any; type ClientOptions = any; +let globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self; + const haveWebStorage = () => typeof Platform.WebStorage !== 'undefined' && Platform.WebStorage?.localSupported; const haveSessionStorage = () => typeof Platform.WebStorage !== 'undefined' && Platform.WebStorage?.sessionSupported; const actions = ProtocolMessage.Action; @@ -215,6 +217,12 @@ class ConnectionManager extends EventEmitter { suspendTimer?: number | NodeJS.Timeout | null; retryTimer?: number | NodeJS.Timeout | null; disconnectedRetryCount: number = 0; + pendingChannelMessagesState: { + // Whether a message is currently being processed + isProcessing: boolean; + // The messages remaining to be processed (excluding any message currently being processed) + queue: { message: ProtocolMessage; transport: Transport }[]; + } = { isProcessing: false, queue: [] }; constructor(realtime: Realtime, options: ClientOptions) { super(); @@ -300,9 +308,7 @@ class ConnectionManager extends EventEmitter { ConnectionManager.supportedTransports ); /* baseTransports selects the leftmost transport in the Defaults.baseTransportOrder list - * that's both requested and supported. Normally this will be xhr_polling; - * if xhr isn't supported it will be jsonp. If the user has forced a - * transport, it'll just be that one. */ + * that's both requested and supported. */ this.baseTransport = Utils.intersect(Defaults.baseTransportOrder, this.transports)[0]; this.upgradeTransports = Utils.intersect(this.transports, Defaults.upgradeTransports); this.transportPreference = null; @@ -1132,7 +1138,7 @@ class ConnectionManager extends EventEmitter { setSessionRecoverData({ recoveryKey: recoveryKey, disconnectedAt: Utils.now(), - location: global.location, + location: globalObject.location, clientId: this.realtime.auth.clientId, }); } @@ -1494,9 +1500,7 @@ class ConnectionManager extends EventEmitter { * needed (will only be in the case where the preference is xhrs and the * browser supports ws). * - base: we try to connect with the best transport that we think will - * never fail for this browser (usually this is xhr_polling; for very old - * browsers will be jsonp, for node will be comet). If it doesn't work, we - * try fallback hosts. + * never fail for this platform. If it doesn't work, we try fallback hosts. * - upgrade: given a connected transport, we see if there are any better * ones, and if so, try to upgrade to them. * @@ -1967,6 +1971,34 @@ class ConnectionManager extends EventEmitter { } onChannelMessage(message: ProtocolMessage, transport: Transport): void { + this.pendingChannelMessagesState.queue.push({ message, transport }); + + if (!this.pendingChannelMessagesState.isProcessing) { + this.processNextPendingChannelMessage(); + } + } + + private processNextPendingChannelMessage() { + if (this.pendingChannelMessagesState.queue.length > 0) { + this.pendingChannelMessagesState.isProcessing = true; + + const pendingChannelMessage = this.pendingChannelMessagesState.queue.shift()!; + this.processChannelMessage(pendingChannelMessage.message, pendingChannelMessage.transport) + .catch((err) => { + Logger.logAction( + Logger.LOG_ERROR, + 'ConnectionManager.processNextPendingChannelMessage() received error ', + err + ); + }) + .finally(() => { + this.pendingChannelMessagesState.isProcessing = false; + this.processNextPendingChannelMessage(); + }); + } + } + + private async processChannelMessage(message: ProtocolMessage, transport: Transport) { const onActiveTransport = this.activeProtocol && transport === this.activeProtocol.getTransport(), onUpgradeTransport = Utils.arrIn(this.pendingTransports, transport) && this.state == this.states.synchronizing; @@ -1974,13 +2006,13 @@ class ConnectionManager extends EventEmitter { * before it's become active (while waiting for the old one to become * idle), message can validly arrive on it even though it isn't active */ if (onActiveTransport || onUpgradeTransport) { - this.realtime.channels.onChannelMessage(message); + await this.realtime.channels.processChannelMessage(message); } else { // Message came in on a defunct transport. Allow only acks, nacks, & errors for outstanding // messages, no new messages (as sync has been sent on new transport so new messages will // be resent there, or connection has been closed so don't want new messages) if (Utils.arrIndexOf([actions.ACK, actions.NACK, actions.ERROR], message.action) > -1) { - this.realtime.channels.onChannelMessage(message); + await this.realtime.channels.processChannelMessage(message); } else { Logger.logAction( Logger.LOG_MICRO, diff --git a/src/common/lib/transport/websockettransport.ts b/src/common/lib/transport/websockettransport.ts index fc12dddf27..ed805197cc 100644 --- a/src/common/lib/transport/websockettransport.ts +++ b/src/common/lib/transport/websockettransport.ts @@ -102,7 +102,7 @@ class WebSocketTransport extends Transport { return; } try { - wsConnection.send(ProtocolMessage.serialize(message, this.params.format)); + (wsConnection as NodeWebSocket).send(ProtocolMessage.serialize(message, this.params.format)); } catch (e) { const msg = 'Exception from ws connection when trying to send: ' + Utils.inspectError(e); Logger.logAction(Logger.LOG_ERROR, 'WebSocketTransport.send()', msg); diff --git a/src/common/lib/types/devicedetails.ts b/src/common/lib/types/devicedetails.ts index e7ba9ffde5..59cc80b514 100644 --- a/src/common/lib/types/devicedetails.ts +++ b/src/common/lib/types/devicedetails.ts @@ -1,5 +1,5 @@ import * as Utils from '../util/utils'; -import ErrorInfo from './errorinfo'; +import ErrorInfo, { IConvertibleToErrorInfo } from './errorinfo'; enum DeviceFormFactor { Phone = 'phone', @@ -88,7 +88,7 @@ class DeviceDetails { } static fromValues(values: Record): DeviceDetails { - values.error = values.error && ErrorInfo.fromValues(values.error as Error); + values.error = values.error && ErrorInfo.fromValues(values.error as IConvertibleToErrorInfo); return Object.assign(new DeviceDetails(), values); } diff --git a/src/common/lib/types/errorinfo.ts b/src/common/lib/types/errorinfo.ts index 88bfd27ca7..f7ed5193b7 100644 --- a/src/common/lib/types/errorinfo.ts +++ b/src/common/lib/types/errorinfo.ts @@ -20,6 +20,12 @@ function toString(err: ErrorInfo | PartialErrorInfo) { return result; } +export interface IConvertibleToErrorInfo { + message: string; + code: number; + statusCode: number; +} + export default class ErrorInfo extends Error implements IPartialErrorInfo, API.Types.ErrorInfo { code: number; statusCode: number; @@ -40,8 +46,8 @@ export default class ErrorInfo extends Error implements IPartialErrorInfo, API.T return toString(this); } - static fromValues(values: Record | ErrorInfo | Error): ErrorInfo { - const { message, code, statusCode } = values as ErrorInfo; + static fromValues(values: IConvertibleToErrorInfo): ErrorInfo { + const { message, code, statusCode } = values; if (typeof message !== 'string' || typeof code !== 'number' || typeof statusCode !== 'number') { throw new Error('ErrorInfo.fromValues(): invalid values: ' + Platform.Config.inspect(values)); } diff --git a/src/common/lib/types/message.ts b/src/common/lib/types/message.ts index 45dcc9a2e0..052df0b178 100644 --- a/src/common/lib/types/message.ts +++ b/src/common/lib/types/message.ts @@ -197,10 +197,10 @@ class Message { static serialize = Utils.encodeBody; - static decode( + static async decode( message: Message | PresenceMessage, inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions - ): void { + ): Promise { const context = normaliseContext(inputContext); let lastPayload = message.data; @@ -243,7 +243,7 @@ class Message { if (xformAlgorithm != cipher.algorithm) { throw new Error('Unable to decrypt message with given cipher; incompatible cipher params'); } - data = cipher.decrypt(data); + data = await cipher.decrypt(data); continue; } else { throw new Error('Unable to decrypt message; not an encrypted channel'); @@ -269,13 +269,11 @@ class Message { deltaBase = Platform.BufferUtils.utf8Encode(deltaBase); } - /* vcdiff expects Uint8Arrays, can't copy with ArrayBuffers. (also, if we - * don't have a TextDecoder, deltaBase might be a WordArray here, so need - * to process it into a buffer anyway) */ + // vcdiff expects Uint8Arrays, can't copy with ArrayBuffers. deltaBase = Platform.BufferUtils.toBuffer(deltaBase as Buffer); data = Platform.BufferUtils.toBuffer(data); - data = Platform.BufferUtils.typedArrayToBuffer(context.plugins.vcdiff.decode(data, deltaBase)); + data = Platform.BufferUtils.arrayBufferViewToBuffer(context.plugins.vcdiff.decode(data, deltaBase)); lastPayload = data; } catch (e) { throw new ErrorInfo('Vcdiff delta decode failed with ' + e, 40018, 400); @@ -301,11 +299,11 @@ class Message { context.baseEncodedPreviousPayload = lastPayload; } - static fromResponseBody( + static async fromResponseBody( body: Array, options: ChannelOptions | EncodingDecodingContext, format?: Utils.Format - ): Message[] { + ): Promise { if (format) { body = Utils.decodeBody(body, format); } @@ -313,7 +311,7 @@ class Message { for (let i = 0; i < body.length; i++) { const msg = (body[i] = Message.fromValues(body[i])); try { - Message.decode(msg, options); + await Message.decode(msg, options); } catch (e) { Logger.logAction(Logger.LOG_ERROR, 'Message.fromResponseBody()', (e as Error).toString()); } @@ -332,23 +330,25 @@ class Message { return result; } - static fromEncoded(encoded: unknown, inputOptions?: API.Types.ChannelOptions): Message { + static async fromEncoded(encoded: unknown, inputOptions?: API.Types.ChannelOptions): Promise { const msg = Message.fromValues(encoded); const options = normalizeCipherOptions(inputOptions ?? null); /* if decoding fails at any point, catch and return the message decoded to * the fullest extent possible */ try { - Message.decode(msg, options); + await Message.decode(msg, options); } catch (e) { Logger.logAction(Logger.LOG_ERROR, 'Message.fromEncoded()', (e as Error).toString()); } return msg; } - static fromEncodedArray(encodedArray: Array, options?: API.Types.ChannelOptions): Message[] { - return encodedArray.map(function (encoded) { - return Message.fromEncoded(encoded, options); - }); + static async fromEncodedArray(encodedArray: Array, options?: API.Types.ChannelOptions): Promise { + return Promise.all( + encodedArray.map(function (encoded) { + return Message.fromEncoded(encoded, options); + }) + ); } /* This should be called on encode()d (and encrypt()d) Messages (as it diff --git a/src/common/lib/types/presencemessage.ts b/src/common/lib/types/presencemessage.ts index 593172acb2..2b9c04e766 100644 --- a/src/common/lib/types/presencemessage.ts +++ b/src/common/lib/types/presencemessage.ts @@ -108,11 +108,11 @@ class PresenceMessage { static encode = Message.encode; static decode = Message.decode; - static fromResponseBody( + static async fromResponseBody( body: Record[], options: CipherOptions, format?: Utils.Format - ): PresenceMessage[] { + ): Promise { const messages: PresenceMessage[] = []; if (format) { body = Utils.decodeBody(body, format); @@ -121,7 +121,7 @@ class PresenceMessage { for (let i = 0; i < body.length; i++) { const msg = (messages[i] = PresenceMessage.fromValues(body[i], true)); try { - PresenceMessage.decode(msg, options); + await PresenceMessage.decode(msg, options); } catch (e) { Logger.logAction(Logger.LOG_ERROR, 'PresenceMessage.fromResponseBody()', (e as Error).toString()); } @@ -143,22 +143,27 @@ class PresenceMessage { return result; } - static fromEncoded(encoded: unknown, options?: API.Types.ChannelOptions): PresenceMessage { + static async fromEncoded(encoded: unknown, options?: API.Types.ChannelOptions): Promise { const msg = PresenceMessage.fromValues(encoded as PresenceMessage | Record, true); /* if decoding fails at any point, catch and return the message decoded to * the fullest extent possible */ try { - PresenceMessage.decode(msg, options ?? {}); + await PresenceMessage.decode(msg, options ?? {}); } catch (e) { Logger.logAction(Logger.LOG_ERROR, 'PresenceMessage.fromEncoded()', (e as Error).toString()); } return msg; } - static fromEncodedArray(encodedArray: unknown[], options?: API.Types.ChannelOptions): PresenceMessage[] { - return encodedArray.map(function (encoded) { - return PresenceMessage.fromEncoded(encoded, options); - }); + static async fromEncodedArray( + encodedArray: unknown[], + options?: API.Types.ChannelOptions + ): Promise { + return Promise.all( + encodedArray.map(function (encoded) { + return PresenceMessage.fromEncoded(encoded, options); + }) + ); } static fromData(data: unknown): PresenceMessage { diff --git a/src/common/lib/util/defaults.ts b/src/common/lib/util/defaults.ts index 03810b673f..1b1fd275fe 100644 --- a/src/common/lib/util/defaults.ts +++ b/src/common/lib/util/defaults.ts @@ -3,7 +3,7 @@ import * as Utils from './utils'; import Logger from './logger'; import ErrorInfo from 'common/lib/types/errorinfo'; import { version } from '../../../../package.json'; -import ClientOptions, { DeprecatedClientOptions, NormalisedClientOptions } from 'common/types/ClientOptions'; +import ClientOptions, { InternalClientOptions, NormalisedClientOptions } from 'common/types/ClientOptions'; import IDefaults from '../../types/IDefaults'; let agent = 'ably-js/' + version; @@ -41,7 +41,7 @@ type CompleteDefaults = IDefaults & { checkHost(host: string): void; getRealtimeHost(options: ClientOptions, production: boolean, environment: string): string; objectifyOptions(options: ClientOptions | string): ClientOptions; - normaliseOptions(options: DeprecatedClientOptions): NormalisedClientOptions; + normaliseOptions(options: InternalClientOptions): NormalisedClientOptions; }; const Defaults = { @@ -181,58 +181,7 @@ export function objectifyOptions(options: ClientOptions | string): ClientOptions return options; } -export function normaliseOptions(options: DeprecatedClientOptions): NormalisedClientOptions { - /* Deprecated options */ - if (options.host) { - Logger.deprecated('host', 'restHost'); - options.restHost = options.host; - } - if (options.wsHost) { - Logger.deprecated('wsHost', 'realtimeHost'); - options.realtimeHost = options.wsHost; - } - if (options.queueEvents) { - Logger.deprecated('queueEvents', 'queueMessages'); - options.queueMessages = options.queueEvents; - } - - if (options.fallbackHostsUseDefault) { - /* fallbackHostsUseDefault and fallbackHosts are mutually exclusive as per TO3k7 */ - if (options.fallbackHosts) { - const msg = 'fallbackHosts and fallbackHostsUseDefault cannot both be set'; - Logger.logAction(Logger.LOG_ERROR, 'Defaults.normaliseOptions', msg); - throw new ErrorInfo(msg, 40000, 400); - } - - /* default fallbacks can't be used with custom ports */ - if (options.port || options.tlsPort) { - const msg = 'fallbackHostsUseDefault cannot be set when port or tlsPort are set'; - Logger.logAction(Logger.LOG_ERROR, 'Defaults.normaliseOptions', msg); - throw new ErrorInfo(msg, 40000, 400); - } - - /* emit an appropriate deprecation warning */ - if (options.environment) { - Logger.deprecatedWithMsg( - 'fallbackHostsUseDefault', - 'There is no longer a need to set this when the environment option is also set since the library will now generate the correct fallback hosts using the environment option.' - ); - } else { - Logger.deprecated('fallbackHostsUseDefault', 'fallbackHosts: Ably.Defaults.FALLBACK_HOSTS'); - } - - /* use the default fallback hosts as requested */ - options.fallbackHosts = Defaults.FALLBACK_HOSTS; - } - - /* options.recover as a boolean is deprecated, and therefore is not part of the public typing */ - if ((options.recover as any) === true) { - Logger.deprecated('{recover: true}', '{recover: function(lastConnectionDetails, cb) { cb(true); }}'); - options.recover = function (lastConnectionDetails: unknown, cb: (shouldRecover: boolean) => void) { - cb(true); - }; - } - +export function normaliseOptions(options: InternalClientOptions): NormalisedClientOptions { if (typeof options.recover === 'function' && options.closeOnUnload === true) { Logger.logAction( Logger.LOG_ERROR, @@ -248,12 +197,6 @@ export function normaliseOptions(options: DeprecatedClientOptions): NormalisedCl options.closeOnUnload = !options.recover; } - if (options.transports && Utils.arrIn(options.transports, 'xhr')) { - Logger.deprecated('transports: ["xhr"]', 'transports: ["xhr_streaming"]'); - Utils.arrDeleteValue(options.transports, 'xhr'); - options.transports.push('xhr_streaming'); - } - if (!('queueMessages' in options)) options.queueMessages = true; /* infer hosts and fallbacks based on the configured environment */ @@ -281,8 +224,8 @@ export function normaliseOptions(options: DeprecatedClientOptions): NormalisedCl options.useBinaryProtocol = Platform.Config.preferBinary; } + const headers: Record = {}; if (options.clientId) { - const headers = (options.headers = options.headers || {}); headers['X-Ably-ClientId'] = Platform.BufferUtils.base64Encode(Platform.BufferUtils.utf8Encode(options.clientId)); } @@ -290,15 +233,6 @@ export function normaliseOptions(options: DeprecatedClientOptions): NormalisedCl options.idempotentRestPublishing = true; } - if (options.promises && !Platform.Config.Promise) { - Logger.logAction( - Logger.LOG_ERROR, - 'Defaults.normaliseOptions', - '{promises: true} was specified, but no Promise constructor found; disabling promises' - ); - options.promises = false; - } - let connectivityCheckParams = null; let connectivityCheckUrl = options.connectivityCheckUrl; if (options.connectivityCheckUrl) { @@ -318,10 +252,11 @@ export function normaliseOptions(options: DeprecatedClientOptions): NormalisedCl : Platform.Config.preferBinary, realtimeHost, restHost, - maxMessageSize: options.maxMessageSize || Defaults.maxMessageSize, + maxMessageSize: options.internal?.maxMessageSize || Defaults.maxMessageSize, timeouts, connectivityCheckParams, connectivityCheckUrl, + headers, }; } diff --git a/src/common/lib/util/eventemitter.ts b/src/common/lib/util/eventemitter.ts index d24e448e8b..4044343b31 100644 --- a/src/common/lib/util/eventemitter.ts +++ b/src/common/lib/util/eventemitter.ts @@ -241,9 +241,9 @@ class EventEmitter { once(...args: unknown[]): void | Promise { const argCount = args.length; - if ((argCount === 0 || (argCount === 1 && typeof args[0] !== 'function')) && Platform.Config.Promise) { + if (argCount === 0 || (argCount === 1 && typeof args[0] !== 'function')) { const event = args[0]; - return new Platform.Config.Promise((resolve) => { + return new Promise((resolve) => { this.once(event as string | string[] | null, resolve); }); } @@ -300,8 +300,8 @@ class EventEmitter { if (typeof targetState !== 'string' || typeof currentState !== 'string') { throw 'whenState requires a valid event String argument'; } - if (typeof listener !== 'function' && Platform.Config.Promise) { - return new Platform.Config.Promise((resolve) => { + if (typeof listener !== 'function') { + return new Promise((resolve) => { EventEmitter.prototype.whenState.apply( this, [targetState, currentState, resolve].concat(listenerArgs as any[]) as any diff --git a/src/common/lib/util/logger.ts b/src/common/lib/util/logger.ts index 6e0ff2af1f..bfafe2c500 100644 --- a/src/common/lib/util/logger.ts +++ b/src/common/lib/util/logger.ts @@ -8,7 +8,7 @@ type LoggerFunction = (...args: string[]) => void; // Workaround for salesforce lightning locker compatibility // This is a shorthand version of Utils.getGlobalObject (which we can't use here without creating a circular import) -let globalObject = global || (typeof window !== 'undefined' ? window : self); +let globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self; enum LogLevels { None = 0, @@ -104,18 +104,6 @@ class Logger { } }; - static deprecated = function (original: string, replacement: string) { - Logger.deprecatedWithMsg(original, "Please use '" + replacement + "' instead."); - }; - - static deprecatedWithMsg = (funcName: string, msg: string) => { - if (Logger.shouldLog(LogLevels.Error)) { - Logger.logErrorHandler( - "Ably: Deprecation warning - '" + funcName + "' is deprecated and will be removed from a future version. " + msg - ); - } - }; - /* Where a logging operation is expensive, such as serialisation of data, use shouldLog will prevent the object being serialised if the log level will not output the message */ static shouldLog = (level: LogLevels) => { diff --git a/src/common/lib/util/utils.ts b/src/common/lib/util/utils.ts index cbd1214fd6..8d8477a2ee 100644 --- a/src/common/lib/util/utils.ts +++ b/src/common/lib/util/utils.ts @@ -2,8 +2,6 @@ import Platform from 'common/platform'; import Defaults, { getAgentString } from './defaults'; import ErrorInfo, { PartialErrorInfo } from 'common/lib/types/errorinfo'; import { NormalisedClientOptions } from 'common/types/ClientOptions'; -import { stringify as stringifyBase64 } from 'crypto-js/build/enc-base64'; -import { parse as parseUtf8 } from 'crypto-js/build/enc-utf8'; function randomPosn(arrOrStr: Array | string) { return Math.floor(Math.random() * arrOrStr.length); @@ -83,15 +81,6 @@ export function isEmpty(ob: Record | unknown[]): boolean { return true; } -export function isOnlyPropIn(ob: Record, property: string): boolean { - for (const prop in ob) { - if (prop !== property) { - return false; - } - } - return true; -} - /* * Determine whether or not an argument to an overloaded function is * undefined (missing) or null. @@ -180,7 +169,7 @@ export function arrIntersect(arr1: Array, arr2: Array): Array { return result; } -export function arrIntersectOb(arr: Array, ob: Record): T[] { +export function arrIntersectOb(arr: Array, ob: Record): string[] { const result = []; for (let i = 0; i < arr.length; i++) { const member = arr[i]; @@ -343,29 +332,55 @@ export function allSame(arr: Array>, prop: string): bool const contentTypes = { json: 'application/json', - jsonp: 'application/javascript', xml: 'application/xml', html: 'text/html', msgpack: 'application/x-msgpack', }; -export function defaultGetHeaders(options: NormalisedClientOptions, format?: Format): Record { - const accept = contentTypes[format || Format.json]; +export enum Format { + msgpack = 'msgpack', + json = 'json', +} + +export interface HeadersOptions { + format?: Format; + protocolVersion?: number; +} + +const defaultHeadersOptions: Required = { + format: Format.json, + protocolVersion: Defaults.protocolVersion, +}; + +export function defaultGetHeaders( + options: NormalisedClientOptions, + { + format = defaultHeadersOptions.format, + protocolVersion = defaultHeadersOptions.protocolVersion, + }: HeadersOptions = {} +): Record { + const accept = contentTypes[format]; return { accept: accept, - 'X-Ably-Version': Defaults.protocolVersion.toString(), + 'X-Ably-Version': protocolVersion.toString(), 'Ably-Agent': getAgentString(options), }; } -export function defaultPostHeaders(options: NormalisedClientOptions, format?: Format): Record { +export function defaultPostHeaders( + options: NormalisedClientOptions, + { + format = defaultHeadersOptions.format, + protocolVersion = defaultHeadersOptions.protocolVersion, + }: HeadersOptions = {} +): Record { let contentType; - const accept = (contentType = contentTypes[format || Format.json]); + const accept = (contentType = contentTypes[format]); return { accept: accept, 'content-type': contentType, - 'X-Ably-Version': Defaults.protocolVersion.toString(), + 'X-Ably-Version': protocolVersion.toString(), 'Ably-Agent': getAgentString(options), }; } @@ -400,11 +415,7 @@ export const now = }; export function isErrorInfoOrPartialErrorInfo(err: unknown): err is ErrorInfo | PartialErrorInfo { - return ( - typeof err == 'object' && - err !== null && - (err.constructor.name == 'ErrorInfo' || err.constructor.name == 'PartialErrorInfo') - ); + return typeof err == 'object' && err !== null && (err instanceof ErrorInfo || err instanceof PartialErrorInfo); } export function inspectError(err: unknown): string { @@ -451,9 +462,9 @@ export const randomString = (numBytes: number): string => { (Platform.Config.getRandomValues as Function)(uIntArr); return Platform.BufferUtils.base64Encode(uIntArr); } - /* Old browser; fall back to Math.random. Could just use a - * CryptoJS version of the above, but want this to still work in nocrypto - * versions of the library */ + /* No secure random generator available; fall back to Math.random. + * TODO we should no longer end up in this scenario — and hence should be able to remove this code — given that all supported platforms should now have a random generator — see https://github.com/ably/ably-js/issues/1332 + */ const charset = Platform.BufferUtils.base64CharSet; /* base64 has 33% overhead; round length up */ const length = Math.round((numBytes * 4) / 3); @@ -464,21 +475,6 @@ export const randomString = (numBytes: number): string => { return result; }; -export const randomHexString = (numBytes: number): string => { - if (Platform.Config.getRandomValues && typeof Uint8Array !== 'undefined') { - const uIntArr = new Uint8Array(numBytes); - (Platform.Config.getRandomValues as Function)(uIntArr); - return Platform.BufferUtils.hexEncode(uIntArr); - } - const charset = Platform.BufferUtils.hexCharSet; - const length = numBytes * 2; - let result = ''; - for (let i = 0; i < length; i++) { - result += charset[randomPosn(charset)]; - } - return result; -}; - /* Pick n elements at random without replacement from an array */ export function arrChooseN(arr: Array, n: number): Array { const numItems = Math.min(n, arr.length), @@ -506,11 +502,6 @@ export function promisify(ob: Record, fnName: string, args: IArg }); } -export enum Format { - msgpack = 'msgpack', - json = 'json', -} - export function decodeBody(body: unknown, format?: Format | null): T { return format == 'msgpack' ? Platform.Config.msgpack.decode(body as Buffer) : JSON.parse(String(body)); } @@ -554,7 +545,7 @@ export function getRetryTime(initialTimeout: number, retryAttempt: number) { } export function getGlobalObject() { - if (global) { + if (typeof global !== 'undefined') { return global; } @@ -599,10 +590,9 @@ export function matchDerivedChannel(name: string) { } export function toBase64(str: string) { - if (Platform.Config.createHmac) { - return Buffer.from(str, 'ascii').toString('base64'); - } - return stringifyBase64(parseUtf8(str)); + const bufferUtils = Platform.BufferUtils; + const textBuffer = bufferUtils.utf8Encode(str); + return bufferUtils.base64Encode(textBuffer); } export function arrEquals(a: any[], b: any[]) { diff --git a/src/common/platform.ts b/src/common/platform.ts index ff6ad04d66..41992c3bc5 100644 --- a/src/common/platform.ts +++ b/src/common/platform.ts @@ -11,7 +11,6 @@ import * as NodeBufferUtils from '../platform/nodejs/lib/util/bufferutils'; type Bufferlike = WebBufferUtils.Bufferlike | NodeBufferUtils.Bufferlike; type BufferUtilsOutput = WebBufferUtils.Output | NodeBufferUtils.Output; type ToBufferOutput = WebBufferUtils.ToBufferOutput | NodeBufferUtils.ToBufferOutput; -type ComparableBuffer = WebBufferUtils.ComparableBuffer | NodeBufferUtils.ComparableBuffer; export default class Platform { static Config: IPlatformConfig; @@ -22,8 +21,14 @@ export default class Platform { BufferUtils object that accepts a broader range of data types than it can in reality handle. */ - static BufferUtils: IBufferUtils; - static Crypto: any; //Not typed + static BufferUtils: IBufferUtils; + /* + This should be a class whose static methods implement the ICryptoStatic + interface, but (for the same reasons as described in the BufferUtils + comment above) Platform doesn’t currently allow us to express the + generic parameters, hence keeping the type as `any`. + */ + static Crypto: any; static Http: typeof IHttp; static Transports: Array<(connectionManager: typeof ConnectionManager) => Transport>; static Defaults: IDefaults; diff --git a/src/common/types/ClientOptions.ts b/src/common/types/ClientOptions.ts index 1aae41b21e..98c96f046d 100644 --- a/src/common/types/ClientOptions.ts +++ b/src/common/types/ClientOptions.ts @@ -12,20 +12,20 @@ export default interface ClientOptions extends API.Types.ClientOptions { agents?: Record; } -export type DeprecatedClientOptions = Modify< +/** + * Properties which internal and test code wish to be able to pass to the public constructor of `Rest` and `Realtime` in order to modify the behaviour of those classes. + */ +export type InternalClientOptions = Modify< ClientOptions, { - host?: string; - wsHost?: string; - queueEvents?: boolean; - promises?: boolean; - headers?: Record; - maxMessageSize?: number; + internal?: { + maxMessageSize?: number; + }; } >; export type NormalisedClientOptions = Modify< - DeprecatedClientOptions, + InternalClientOptions, { realtimeHost: string; restHost: string; @@ -34,5 +34,6 @@ export type NormalisedClientOptions = Modify< timeouts: Record; maxMessageSize: number; connectivityCheckParams: Record | null; + headers: Record; } >; diff --git a/src/common/types/IBufferUtils.ts b/src/common/types/IBufferUtils.ts index e98c9bccbd..efa1b51209 100644 --- a/src/common/types/IBufferUtils.ts +++ b/src/common/types/IBufferUtils.ts @@ -1,10 +1,7 @@ -import { TypedArray } from './IPlatformConfig'; - -export default interface IBufferUtils { +export default interface IBufferUtils { base64CharSet: string; hexCharSet: string; isBuffer: (buffer: unknown) => buffer is Bufferlike; - isArrayBuffer: (buffer: unknown) => buffer is ArrayBuffer; // On browser this returns a Uint8Array, on node a Buffer toBuffer: (buffer: Bufferlike) => ToBufferOutput; toArrayBuffer: (buffer: Bufferlike) => ArrayBuffer; @@ -14,7 +11,8 @@ export default interface IBufferUtils Output; utf8Encode: (string: string) => Output; utf8Decode: (buffer: Bufferlike) => string; - bufferCompare: (buffer1: ComparableBuffer, buffer2: ComparableBuffer) => number; + areBuffersEqual: (buffer1: Bufferlike, buffer2: Bufferlike) => boolean; byteLength: (buffer: Bufferlike) => number; - typedArrayToBuffer: (typedArray: TypedArray) => Bufferlike; + arrayBufferViewToBuffer: (arrayBufferView: ArrayBufferView) => Bufferlike; + hmacSha256(message: Bufferlike, key: Bufferlike): Output; } diff --git a/src/common/types/ICipher.ts b/src/common/types/ICipher.ts new file mode 100644 index 0000000000..a7d07c0598 --- /dev/null +++ b/src/common/types/ICipher.ts @@ -0,0 +1,5 @@ +export default interface ICipher { + algorithm: string; + encrypt: (plaintext: InputPlaintext, callback: (error: Error | null, data: OutputCiphertext | null) => void) => void; + decrypt: (ciphertext: InputCiphertext) => Promise; +} diff --git a/src/common/types/ICryptoStatic.ts b/src/common/types/ICryptoStatic.ts new file mode 100644 index 0000000000..97dac8fcce --- /dev/null +++ b/src/common/types/ICryptoStatic.ts @@ -0,0 +1,15 @@ +import * as API from '../../../ably'; +import ICipher from './ICipher'; + +export type IGetCipherParams = (API.Types.CipherParams | API.Types.CipherParamOptions) & { iv?: IV }; +export interface IGetCipherReturnValue { + cipher: Cipher; + cipherParams: API.Types.CipherParams; +} + +export default interface ICryptoStatic + extends API.Types.Crypto { + getCipher( + params: IGetCipherParams + ): IGetCipherReturnValue>; +} diff --git a/src/common/types/IDefaults.d.ts b/src/common/types/IDefaults.d.ts index 7c4db18aaf..3fb342cbc8 100644 --- a/src/common/types/IDefaults.d.ts +++ b/src/common/types/IDefaults.d.ts @@ -3,7 +3,6 @@ import { RestAgentOptions } from './ClientOptions'; export default interface IDefaults { connectivityCheckUrl: string; - jsonpInternetUpUrl?: string; defaultTransports: TransportNames[]; baseTransportOrder: TransportNames[]; transportPreferenceOrder: TransportNames[]; diff --git a/src/common/types/IPlatformConfig.d.ts b/src/common/types/IPlatformConfig.d.ts index 4b4d9091e1..ecb0e4868d 100644 --- a/src/common/types/IPlatformConfig.d.ts +++ b/src/common/types/IPlatformConfig.d.ts @@ -1,14 +1,3 @@ -export type TypedArray = - | Int8Array - | Uint8Array - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Uint8ClampedArray - | Float32Array - | Float64Array; - interface MsgPack { encode(value: any, sparse?: boolean): Buffer | ArrayBuffer | undefined; decode(buffer: Buffer): any; @@ -20,9 +9,6 @@ export interface IPlatformConfig { binaryType: BinaryType; WebSocket: typeof WebSocket | typeof import('ws'); useProtocolHeartbeats: boolean; - createHmac: - | ((algorithm: string, key: import('crypto').BinaryLike | import('crypto').KeyObject) => import('crypto').Hmac) - | null; msgpack: MsgPack; supportsBinary: boolean; preferBinary: boolean; @@ -30,24 +16,22 @@ export interface IPlatformConfig { inspect: (value: unknown) => string; stringByteSize: Buffer.byteLength; addEventListener?: typeof window.addEventListener | typeof global.addEventListener | null; - Promise: typeof Promise; - getRandomValues?: (arr: TypedArray, callback?: (error?: Error | null) => void) => void; + getRandomValues?: (arr: ArrayBufferView, callback?: (error: Error | null) => void) => void; userAgent?: string | null; inherits?: typeof import('util').inherits; currentUrl?: string; noUpgrade?: boolean | string; fetchSupported?: boolean; xhrSupported?: boolean; - jsonpSupported?: boolean; allowComet?: boolean; streamingSupported?: boolean; ArrayBuffer?: typeof ArrayBuffer | false; atob?: typeof atob | null; TextEncoder?: typeof TextEncoder; TextDecoder?: typeof TextDecoder; - getRandomWordArray?: ( + getRandomArrayBuffer?: ( byteLength: number, - callback: (err: Error, result: boolean | CryptoJS.lib.WordArray) => void + callback: (err: Error | null, result: ArrayBuffer | null) => void ) => void; isWebworker?: boolean; } diff --git a/src/common/types/crypto-js.d.ts b/src/common/types/crypto-js.d.ts deleted file mode 100644 index 8a0c9f9e4b..0000000000 --- a/src/common/types/crypto-js.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -declare module 'crypto-js/build/enc-base64' { - import CryptoJS from 'crypto-js'; - export const parse: typeof CryptoJS.enc.Base64.parse; - export const stringify: typeof CryptoJS.enc.Base64.stringify; -} - -declare module 'crypto-js/build/enc-hex' { - import CryptoJS from 'crypto-js'; - export const parse: typeof CryptoJS.enc.Hex.parse; - export const stringify: typeof CryptoJS.enc.Hex.stringify; -} - -declare module 'crypto-js/build/enc-utf8' { - import CryptoJS from 'crypto-js'; - export const parse: typeof CryptoJS.enc.Utf8.parse; - export const stringify: typeof CryptoJS.enc.Utf8.stringify; -} - -declare module 'crypto-js/build/lib-typedarrays' { - import CryptoJS from 'crypto-js'; - export default CryptoJS.lib.WordArray; -} - -declare module 'crypto-js/build/hmac-sha256' { - import CryptoJS from 'crypto-js'; - export default CryptoJS.HmacSHA256; -} diff --git a/src/common/types/cryptoDataTypes.ts b/src/common/types/cryptoDataTypes.ts new file mode 100644 index 0000000000..aed70f6489 --- /dev/null +++ b/src/common/types/cryptoDataTypes.ts @@ -0,0 +1,25 @@ +/** + Allows us to derive the generic type arguments for a platform’s `ICryptoStatic` implementation, given other properties of the platform. + */ +export namespace CryptoDataTypes { + /** + The type of initialization vector that the platform is expected to be able to use when creating a cipher. + */ + export type IV = BufferUtilsOutput; + + /** + The type of plaintext that the platform is expected to be able to encrypt. + + - `Bufferlike`: The `Bufferlike` of the platform’s `IBufferUtils` implementation. + - `BufferUtilsOutput`: The `Output` of the platform’s `IBufferUtils` implementation. + */ + export type InputPlaintext = Bufferlike | BufferUtilsOutput; + + /** + The type of ciphertext that the platform is expected to be able to decrypt. + + - `MessagePackBinaryType`: The type to which this platform’s MessagePack implementation deserializes elements of the `bin` or `ext` type. + - `BufferUtilsOutput`: The `Output` of the platform’s `IBufferUtils` implementation. + */ + export type InputCiphertext = MessagePackBinaryType | BufferUtilsOutput; +} diff --git a/src/platform/nativescript/config.js b/src/platform/nativescript/config.js index 03a2b7d9fc..31090e0240 100644 --- a/src/platform/nativescript/config.js +++ b/src/platform/nativescript/config.js @@ -26,10 +26,8 @@ var Config = { WebSocket: WebSocket, xhrSupported: XMLHttpRequest, allowComet: true, - jsonpSupported: false, streamingSupported: false, useProtocolHeartbeats: true, - createHmac: null, msgpack: msgpack, supportsBinary: typeof TextDecoder !== 'undefined' && TextDecoder, preferBinary: false, @@ -49,7 +47,6 @@ var Config = { }, TextEncoder: global.TextEncoder, TextDecoder: global.TextDecoder, - Promise: global.Promise, getRandomValues: function (arr, callback) { var bytes = randomBytes(arr.length); for (var i = 0; i < arr.length; i++) { diff --git a/src/platform/nodejs/config.ts b/src/platform/nodejs/config.ts index 86d0a7e5b7..716be3b12a 100644 --- a/src/platform/nodejs/config.ts +++ b/src/platform/nodejs/config.ts @@ -1,4 +1,4 @@ -import { TypedArray, IPlatformConfig } from '../../common/types/IPlatformConfig'; +import { IPlatformConfig } from '../../common/types/IPlatformConfig'; import crypto from 'crypto'; import WebSocket from 'ws'; import util from 'util'; @@ -10,7 +10,6 @@ const Config: IPlatformConfig = { binaryType: 'nodebuffer' as BinaryType, WebSocket, useProtocolHeartbeats: false, - createHmac: crypto.createHmac, msgpack: require('@ably/msgpack-js'), supportsBinary: true, preferBinary: true, @@ -19,14 +18,18 @@ const Config: IPlatformConfig = { stringByteSize: Buffer.byteLength, inherits: util.inherits, addEventListener: null, - getRandomValues: function (arr: TypedArray, callback?: (err?: Error | null) => void): void { - const bytes = crypto.randomBytes(arr.length); - arr.set(bytes); + getRandomValues: function (arr: ArrayBufferView, callback?: (err: Error | null) => void): void { + const bytes = crypto.randomBytes(arr.byteLength); + const dataView = new DataView(arr.buffer, arr.byteOffset, arr.byteLength); + + for (let i = 0; i < bytes.length; i++) { + dataView.setUint8(i, bytes[i]); + } + if (callback) { callback(null); } }, - Promise: global && global.Promise, }; export default Config; diff --git a/src/platform/nodejs/index.ts b/src/platform/nodejs/index.ts index a819eccd86..aa1b3403f4 100644 --- a/src/platform/nodejs/index.ts +++ b/src/platform/nodejs/index.ts @@ -7,7 +7,7 @@ import ErrorInfo from '../../common/lib/types/errorinfo'; // Platform Specific import BufferUtils from './lib/util/bufferutils'; // @ts-ignore -import Crypto from './lib/util/crypto'; +import CryptoFactory from './lib/util/crypto'; import Http from './lib/util/http'; import Config from './config'; // @ts-ignore @@ -16,6 +16,8 @@ import Logger from '../../common/lib/util/logger'; import { getDefaults } from '../../common/lib/util/defaults'; import PlatformDefaults from './lib/util/defaults'; +const Crypto = CryptoFactory(BufferUtils); + Platform.Crypto = Crypto; Platform.BufferUtils = BufferUtils as typeof Platform.BufferUtils; Platform.Http = Http; diff --git a/src/platform/nodejs/lib/util/bufferutils.ts b/src/platform/nodejs/lib/util/bufferutils.ts index c972886e40..e1c6fbcb67 100644 --- a/src/platform/nodejs/lib/util/bufferutils.ts +++ b/src/platform/nodejs/lib/util/bufferutils.ts @@ -1,12 +1,11 @@ -import { TypedArray } from 'common/types/IPlatformConfig'; import IBufferUtils from 'common/types/IBufferUtils'; +import crypto from 'crypto'; -export type Bufferlike = Buffer | ArrayBuffer | TypedArray; +export type Bufferlike = Buffer | ArrayBuffer | ArrayBufferView; export type Output = Buffer; export type ToBufferOutput = Buffer; -export type ComparableBuffer = Buffer; -class BufferUtils implements IBufferUtils { +class BufferUtils implements IBufferUtils { base64CharSet: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; hexCharSet: string = '0123456789abcdef'; @@ -18,10 +17,9 @@ class BufferUtils implements IBufferUtils; +type InputPlaintext = CryptoDataTypes.InputPlaintext; +type OutputCiphertext = Buffer; +type InputCiphertext = CryptoDataTypes.InputCiphertext; +type OutputPlaintext = Buffer; + +var CryptoFactory = function (bufferUtils: typeof BufferUtils) { + var DEFAULT_ALGORITHM = 'aes'; + var DEFAULT_KEYLENGTH = 256; // bits + var DEFAULT_MODE = 'cbc'; + var DEFAULT_BLOCKLENGTH = 16; // bytes + + /** + * Internal: generate a buffer of secure random bytes of the given length + * @param bytes + * @param callback (optional) + */ + function generateRandom(bytes: number): Buffer; + function generateRandom(bytes: number, callback: (err: Error | null, buf: Buffer) => void): void; + function generateRandom(bytes: number, callback?: (err: Error | null, buf: Buffer) => void) { + return callback === undefined ? crypto.randomBytes(bytes) : crypto.randomBytes(bytes, callback); + } + + /** + * Internal: calculate the padded length of a given plaintext + * using PKCS5. + * @param plaintextLength + * @return + */ + function getPaddedLength(plaintextLength: number) { + return (plaintextLength + DEFAULT_BLOCKLENGTH) & -DEFAULT_BLOCKLENGTH; + } + + /** + * Internal: checks that the cipherParams are a valid combination. Currently + * just checks that the calculated keyLength is a valid one for aes-cbc + */ + function validateCipherParams(params: API.Types.CipherParams) { + if (params.algorithm === 'aes' && params.mode === 'cbc') { + if (params.keyLength === 128 || params.keyLength === 256) { + return; + } + throw new Error( + 'Unsupported key length ' + + params.keyLength + + ' for aes-cbc encryption. Encryption key must be 128 or 256 bits (16 or 32 ASCII characters)' + ); + } + } + + function normaliseBase64(string: string) { + /* url-safe base64 strings use _ and - instread of / and + */ + return string.replace('_', '/').replace('-', '+'); + } + + /** + * Internal: obtain the pkcs5 padding string for a given padded length; + */ + function filledBuffer(length: number, value: number) { + var result = Buffer.alloc(length); + result.fill(value); + return result; + } + var pkcs5Padding = [filledBuffer(16, 16)]; + for (var i = 1; i <= 16; i++) pkcs5Padding.push(filledBuffer(i, i)); + + /** + * Internal: convert a binary string to Buffer (for node 0.8.x) + * @param bufferOrString + * @returns {Buffer} + */ + function toBuffer(bufferOrString: Buffer | string) { + return typeof bufferOrString == 'string' ? Buffer.from(bufferOrString, 'binary') : bufferOrString; + } + + /** + * A class encapsulating the client-specifiable parameters for + * the cipher. + * + * algorithm is the name of the algorithm in the default system provider, + * or the lower-cased version of it; eg "aes" or "AES". + * + * Clients may instance a CipherParams directly and populate it, or may + * query the implementation to obtain a default system CipherParams. + */ + class CipherParams implements API.Types.CipherParams { + algorithm: string; + keyLength: number; + mode: string; + key: NodeCipherKey; + iv: unknown; + + constructor(algorithm: string, keyLength: number, mode: string, key: NodeCipherKey) { + this.algorithm = algorithm; + this.keyLength = keyLength; + this.mode = mode; + this.key = key; + this.iv = null; + } + } + + function isInstCipherParams( + params: API.Types.CipherParams | API.Types.CipherParamOptions + ): params is API.Types.CipherParams { + /* In node, can't use instanceof CipherParams due to the vm context problem (see + * https://github.com/nwjs/nw.js/wiki/Differences-of-JavaScript-contexts). + * So just test for presence of all necessary attributes */ + return !!(params.algorithm && params.key && params.keyLength && params.mode); + } + + /** + * Utility classes and interfaces for message payload encryption. + * + * This class supports AES/CBC/PKCS5 with a default keylength of 128 bits + * but supporting other keylengths. Other algorithms and chaining modes are + * not supported directly, but supportable by extending/implementing the base + * classes and interfaces here. + * + * Secure random data for creation of Initialization Vectors (IVs) and keys + * is obtained from the default system SecureRandom. Future extensions of this + * class might make the SecureRandom pluggable or at least seedable with + * client-provided entropy. + * + * Each message payload is encrypted with an IV in CBC mode, and the IV is + * concatenated with the resulting raw ciphertext to construct the "ciphertext" + * data passed to the recipient. + */ + class Crypto { + static CipherParams = CipherParams; + + /** + * Obtain a complete CipherParams instance from the provided params, filling + * in any not provided with default values, calculating a keyLength from + * the supplied key, and validating the result. + * @param params an object containing at a minimum a `key` key with value the + * key, as either a binary or a base64-encoded string. + * May optionally also contain: algorithm (defaults to AES), + * mode (defaults to 'cbc') + */ + static getDefaultParams(params: API.Types.CipherParamOptions) { + var key: NodeCipherKey; + + if (!params.key) { + throw new Error('Crypto.getDefaultParams: a key is required'); + } + + if (typeof params.key === 'string') { + key = bufferUtils.base64Decode(normaliseBase64(params.key)); + } else if (params.key instanceof ArrayBuffer) { + key = Buffer.from(params.key); + } else { + key = params.key; + } + + var algorithm = params.algorithm || DEFAULT_ALGORITHM; + var keyLength = key.length * 8; + var mode = params.mode || DEFAULT_MODE; + var cipherParams = new CipherParams(algorithm, keyLength, mode, key); + + if (params.keyLength && params.keyLength !== cipherParams.keyLength) { + throw new Error( + 'Crypto.getDefaultParams: a keyLength of ' + + params.keyLength + + ' was specified, but the key actually has length ' + + cipherParams.keyLength + ); + } + + validateCipherParams(cipherParams); + return cipherParams; + } + + /** + * Generate a random encryption key from the supplied keylength (or the + * default keyLength if none supplied) as a Buffer + * @param keyLength (optional) the required keyLength in bits + * @param callback (optional) (err, key) + */ + static async generateRandomKey(keyLength?: number): Promise { + return new Promise((resolve, reject) => { + generateRandom((keyLength || DEFAULT_KEYLENGTH) / 8, function (err, buf) { + if (err) { + const errorInfo = new ErrorInfo('Failed to generate random key: ' + err.message, 500, 50000, err); + reject(errorInfo); + } else { + resolve(buf!); + } + }); + }); + } + + /** + * Internal; get a ChannelCipher instance based on the given cipherParams + * @param params either a CipherParams instance or some subset of its + * fields that includes a key + */ + static getCipher(params: IGetCipherParams) { + var cipherParams = isInstCipherParams(params) ? (params as CipherParams) : this.getDefaultParams(params); + + var iv = params.iv || generateRandom(DEFAULT_BLOCKLENGTH); + return { + cipherParams: cipherParams, + cipher: new CBCCipher(cipherParams, iv), + }; + } + } + + Crypto satisfies ICryptoStatic; + + class CBCCipher implements ICipher { + algorithm: string; + key: NodeCipherKey; + iv: Buffer | null; + encryptCipher: NodeCipher; + blockLength: number; + + constructor(params: CipherParams, iv: Buffer) { + this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode; + this.key = params.key; + this.iv = iv; + this.encryptCipher = crypto.createCipheriv(this.algorithm, this.key, this.iv); + this.blockLength = this.iv.length; + } + + encrypt(plaintext: InputPlaintext, callback: (error: Error | null, data: OutputCiphertext | null) => void) { + Logger.logAction(Logger.LOG_MICRO, 'CBCCipher.encrypt()', ''); + var plaintextBuffer = bufferUtils.toBuffer(plaintext); + var plaintextLength = plaintextBuffer.length, + paddedLength = getPaddedLength(plaintextLength), + iv = this.getIv(); + var cipherOut = this.encryptCipher.update( + Buffer.concat([plaintextBuffer, pkcs5Padding[paddedLength - plaintextLength]]) + ); + var ciphertext = Buffer.concat([iv, toBuffer(cipherOut)]); + return callback(null, ciphertext); + } + + async decrypt(ciphertext: InputCiphertext): Promise { + var blockLength = this.blockLength, + decryptCipher = crypto.createDecipheriv(this.algorithm, this.key, ciphertext.slice(0, blockLength)), + plaintext = toBuffer(decryptCipher.update(ciphertext.slice(blockLength))), + final = decryptCipher.final(); + if (final && final.length) plaintext = Buffer.concat([plaintext, toBuffer(final)]); + return plaintext; + } + + getIv() { + if (this.iv) { + var iv = this.iv; + this.iv = null; + return iv; + } + + var randomBlock = generateRandom(DEFAULT_BLOCKLENGTH); + /* Since the iv for a new block is the ciphertext of the last, this + * sets a new iv (= aes(randomBlock XOR lastCipherText)) as well as + * returning it */ + return toBuffer(this.encryptCipher.update(randomBlock)); + } + } + + return Crypto; +}; + +export default CryptoFactory; diff --git a/src/platform/nodejs/lib/util/defaults.ts b/src/platform/nodejs/lib/util/defaults.ts index 5ec0f8139b..adaf8a5083 100644 --- a/src/platform/nodejs/lib/util/defaults.ts +++ b/src/platform/nodejs/lib/util/defaults.ts @@ -4,9 +4,7 @@ import TransportNames from '../../../../common/constants/TransportNames'; const Defaults: IDefaults = { connectivityCheckUrl: 'https://internet-up.ably-realtime.com/is-the-internet-up.txt', /* Note: order matters here: the base transport is the leftmost one in the - * intersection of baseTransportOrder and the transports clientOption that's supported. - * (For node this is the same as the transportPreferenceOrder, but for - * browsers it's different*/ + * intersection of baseTransportOrder and the transports clientOption that's supported. */ defaultTransports: [TransportNames.WebSocket], baseTransportOrder: [TransportNames.Comet, TransportNames.WebSocket], transportPreferenceOrder: [TransportNames.Comet, TransportNames.WebSocket], diff --git a/src/platform/react-hooks/sample-app/src/script.tsx b/src/platform/react-hooks/sample-app/src/script.tsx index 3d316f81aa..14853ee6e6 100644 --- a/src/platform/react-hooks/sample-app/src/script.tsx +++ b/src/platform/react-hooks/sample-app/src/script.tsx @@ -13,7 +13,7 @@ function generateRandomId() { return Math.random().toString(36).substr(2, 9); } -const client = new Ably.Realtime.Promise({ +const client = new Ably.Realtime({ key: import.meta.env.VITE_ABLY_API_KEY, clientId: generateRandomId(), }); diff --git a/src/platform/react-hooks/src/AblyProvider.tsx b/src/platform/react-hooks/src/AblyProvider.tsx index c26f8e12a4..a7ef61b879 100644 --- a/src/platform/react-hooks/src/AblyProvider.tsx +++ b/src/platform/react-hooks/src/AblyProvider.tsx @@ -8,11 +8,11 @@ const canUseSymbol = typeof Symbol === 'function' && typeof Symbol.for === 'func interface AblyProviderProps { children?: React.ReactNode | React.ReactNode[] | null; - client?: Ably.Types.RealtimePromise; + client?: Ably.Types.Realtime; id?: string; } -type AblyContextType = React.Context; +type AblyContextType = React.Context; // An object is appended to `React.createContext` which stores all contexts // indexed by id, which is used by useAbly to find the correct context when an @@ -31,10 +31,6 @@ export const AblyProvider = ({ client, children, id = 'default' }: AblyProviderP throw new Error('AblyProvider: the `client` prop is required'); } - if (!(client instanceof Ably.Realtime) && !client?.options?.promises) { - throw new Error('AblyProvider: the `client` prop must take an instance of Ably.Realtime.Promise'); - } - const realtime = useMemo(() => client, [client]); let context = getContext(id); diff --git a/src/platform/react-hooks/src/fakes/ably.ts b/src/platform/react-hooks/src/fakes/ably.ts index a94cf735f1..6f0695b100 100644 --- a/src/platform/react-hooks/src/fakes/ably.ts +++ b/src/platform/react-hooks/src/fakes/ably.ts @@ -4,7 +4,8 @@ export class FakeAblySdk { public clientId: string; public channels: ClientChannelsCollection; public connection: Connection; - public options = { promises: true }; + // TODO check we can remove this + //public options = { promises: true }; constructor() { this.clientId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); diff --git a/src/platform/react-hooks/src/hooks/useAbly.ts b/src/platform/react-hooks/src/hooks/useAbly.ts index 9ddff98321..be2910857b 100644 --- a/src/platform/react-hooks/src/hooks/useAbly.ts +++ b/src/platform/react-hooks/src/hooks/useAbly.ts @@ -1,9 +1,9 @@ import React from 'react'; import { getContext } from '../AblyProvider.js'; -import * as API from '../../../../../callbacks.js'; +import * as API from '../../../../../ably.js'; -export function useAbly(id = 'default'): API.Types.RealtimePromise { - const client = React.useContext(getContext(id)) as API.Types.RealtimePromise; +export function useAbly(id = 'default'): API.Types.Realtime { + const client = React.useContext(getContext(id)) as API.Types.Realtime; if (!client) { throw new Error( diff --git a/src/platform/react-hooks/src/hooks/useChannel.test.tsx b/src/platform/react-hooks/src/hooks/useChannel.test.tsx index b499c05158..741d064576 100644 --- a/src/platform/react-hooks/src/hooks/useChannel.test.tsx +++ b/src/platform/react-hooks/src/hooks/useChannel.test.tsx @@ -8,7 +8,7 @@ import { act } from 'react-dom/test-utils'; import { AblyProvider } from '../AblyProvider.js'; function renderInCtxProvider(client: FakeAblySdk, children: React.ReactNode | React.ReactNode[]) { - return render({children}); + return render({children}); } describe('useChannel', () => { @@ -57,7 +57,7 @@ describe('useChannel', () => { it('useChannel works with multiple clients', async () => { renderInCtxProvider( ablyClient, - + ); diff --git a/src/platform/react-hooks/src/hooks/useChannel.ts b/src/platform/react-hooks/src/hooks/useChannel.ts index d747281a7d..a92958c08e 100644 --- a/src/platform/react-hooks/src/hooks/useChannel.ts +++ b/src/platform/react-hooks/src/hooks/useChannel.ts @@ -7,8 +7,8 @@ import { useStateErrors } from './useStateErrors.js'; export type AblyMessageCallback = Types.messageCallback; export interface ChannelResult { - channel: Types.RealtimeChannelPromise; - ably: Types.RealtimePromise; + channel: Types.RealtimeChannel; + ably: Types.Realtime; connectionError: Types.ErrorInfo | null; channelError: Types.ErrorInfo | null; } @@ -88,11 +88,11 @@ export function useChannel( return { channel, ably, connectionError, channelError }; } -async function handleChannelMount(channel: Types.RealtimeChannelPromise, ...subscribeArgs: SubscribeArgs) { +async function handleChannelMount(channel: Types.RealtimeChannel, ...subscribeArgs: SubscribeArgs) { await (channel.subscribe as any)(...subscribeArgs); } -async function handleChannelUnmount(channel: Types.RealtimeChannelPromise, ...subscribeArgs: SubscribeArgs) { +async function handleChannelUnmount(channel: Types.RealtimeChannel, ...subscribeArgs: SubscribeArgs) { await (channel.unsubscribe as any)(...subscribeArgs); setTimeout(async () => { diff --git a/src/platform/react-hooks/src/hooks/useChannelStateListener.test.tsx b/src/platform/react-hooks/src/hooks/useChannelStateListener.test.tsx index 3dc4d58fca..eee3e4d1fe 100644 --- a/src/platform/react-hooks/src/hooks/useChannelStateListener.test.tsx +++ b/src/platform/react-hooks/src/hooks/useChannelStateListener.test.tsx @@ -9,7 +9,7 @@ import { act } from 'react-dom/test-utils'; import { AblyProvider } from '../AblyProvider.js'; function renderInCtxProvider(client: FakeAblySdk, children: React.ReactNode | React.ReactNode[]) { - return render({children}); + return render({children}); } describe('useChannelStateListener', () => { diff --git a/src/platform/react-hooks/src/hooks/useConnectionStateListener.test.tsx b/src/platform/react-hooks/src/hooks/useConnectionStateListener.test.tsx index 87fe35be03..068449d54e 100644 --- a/src/platform/react-hooks/src/hooks/useConnectionStateListener.test.tsx +++ b/src/platform/react-hooks/src/hooks/useConnectionStateListener.test.tsx @@ -9,7 +9,7 @@ import { AblyProvider } from '../AblyProvider.js'; import { useConnectionStateListener } from './useConnectionStateListener.js'; function renderInCtxProvider(client: FakeAblySdk, children: React.ReactNode | React.ReactNode[]) { - return render({children}); + return render({children}); } describe('useConnectionStateListener', () => { diff --git a/src/platform/react-hooks/src/hooks/usePresence.test.tsx b/src/platform/react-hooks/src/hooks/usePresence.test.tsx index 99704f07c2..8553832a30 100644 --- a/src/platform/react-hooks/src/hooks/usePresence.test.tsx +++ b/src/platform/react-hooks/src/hooks/usePresence.test.tsx @@ -7,7 +7,7 @@ import { AblyProvider } from '../AblyProvider.js'; import { Types } from '../../../../../ably.js'; function renderInCtxProvider(client: FakeAblySdk, children: React.ReactNode | React.ReactNode[]) { - return render({children}); + return render({children}); } const testChannelName = 'testChannel'; @@ -97,7 +97,7 @@ describe('usePresence', () => { it('usePresence works with multiple clients', async () => { renderInCtxProvider( ablyClient, - + ); diff --git a/src/platform/react-native/config.ts b/src/platform/react-native/config.ts index e6b5073ca3..f6e6f29a2e 100644 --- a/src/platform/react-native/config.ts +++ b/src/platform/react-native/config.ts @@ -1,49 +1,46 @@ import msgpack from '../web/lib/util/msgpack'; -import { parse as parseBase64 } from 'crypto-js/build/enc-base64'; import { IPlatformConfig } from '../../common/types/IPlatformConfig'; +import BufferUtils from '../web/lib/util/bufferutils'; -const Platform: IPlatformConfig = { - agent: 'reactnative', - logTimestamps: true, - noUpgrade: false, - binaryType: 'arraybuffer', - WebSocket: WebSocket, - xhrSupported: true, - allowComet: true, - jsonpSupported: false, - streamingSupported: true, - useProtocolHeartbeats: true, - createHmac: null, - msgpack: msgpack, - supportsBinary: !!(typeof TextDecoder !== 'undefined' && TextDecoder), - preferBinary: false, - ArrayBuffer: typeof ArrayBuffer !== 'undefined' && ArrayBuffer, - atob: global.atob, - nextTick: function (f: Function) { - setTimeout(f, 0); - }, - addEventListener: null, - inspect: JSON.stringify, - stringByteSize: function (str: string) { - /* str.length will be an underestimate for non-ascii strings. But if we're - * in a browser too old to support TextDecoder, not much we can do. Better - * to underestimate, so if we do go over-size, the server will reject the - * message */ - return (typeof TextDecoder !== 'undefined' && new TextEncoder().encode(str).length) || str.length; - }, - TextEncoder: global.TextEncoder, - TextDecoder: global.TextDecoder, - Promise: global.Promise, - getRandomWordArray: (function (RNRandomBytes) { - return function (byteLength: number, callback: Function) { - RNRandomBytes.randomBytes(byteLength, function (err: Error, base64String: string) { - callback(err, !err && parseBase64(base64String)); - }); - }; - // Installing @types/react-native would fix this but conflicts with @types/node - // See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/15960 - // eslint-disable-next-line @typescript-eslint/no-var-requires - })(require('react-native').NativeModules.RNRandomBytes), -}; - -export default Platform; +export default function (bufferUtils: typeof BufferUtils): IPlatformConfig { + return { + agent: 'reactnative', + logTimestamps: true, + noUpgrade: false, + binaryType: 'arraybuffer', + WebSocket: WebSocket, + xhrSupported: true, + allowComet: true, + streamingSupported: true, + useProtocolHeartbeats: true, + msgpack: msgpack, + supportsBinary: !!(typeof TextDecoder !== 'undefined' && TextDecoder), + preferBinary: false, + ArrayBuffer: typeof ArrayBuffer !== 'undefined' && ArrayBuffer, + atob: global.atob, + nextTick: function (f: Function) { + setTimeout(f, 0); + }, + addEventListener: null, + inspect: JSON.stringify, + stringByteSize: function (str: string) { + /* str.length will be an underestimate for non-ascii strings. But if we're + * in a browser too old to support TextDecoder, not much we can do. Better + * to underestimate, so if we do go over-size, the server will reject the + * message */ + return (typeof TextDecoder !== 'undefined' && new TextEncoder().encode(str).length) || str.length; + }, + TextEncoder: global.TextEncoder, + TextDecoder: global.TextDecoder, + getRandomArrayBuffer: (function (RNRandomBytes) { + return function (byteLength: number, callback: (err: Error | null, result: ArrayBuffer | null) => void) { + RNRandomBytes.randomBytes(byteLength, function (err: Error | null, base64String: string | null) { + callback(err, base64String ? bufferUtils.toArrayBuffer(bufferUtils.base64Decode(base64String)) : null); + }); + }; + // Installing @types/react-native would fix this but conflicts with @types/node + // See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/15960 + // eslint-disable-next-line @typescript-eslint/no-var-requires + })(require('react-native').NativeModules.RNRandomBytes), + }; +} diff --git a/src/platform/react-native/index.ts b/src/platform/react-native/index.ts index 1a7868174d..d59af64fe2 100644 --- a/src/platform/react-native/index.ts +++ b/src/platform/react-native/index.ts @@ -9,7 +9,7 @@ import BufferUtils from '../web/lib/util/bufferutils'; // @ts-ignore import CryptoFactory from '../web/lib/util/crypto'; import Http from '../web/lib/util/http'; -import Config from './config'; +import configFactory from './config'; // @ts-ignore import Transports from '../web/lib/transport'; import Logger from '../../common/lib/util/logger'; @@ -18,6 +18,8 @@ import WebStorage from '../web/lib/util/webstorage'; import PlatformDefaults from '../web/lib/util/defaults'; import msgpack from '../web/lib/util/msgpack'; +const Config = configFactory(BufferUtils); + const Crypto = CryptoFactory(Config, BufferUtils); Platform.Crypto = Crypto; diff --git a/src/platform/web/config.ts b/src/platform/web/config.ts index 18d17c3f0f..87536361ad 100644 --- a/src/platform/web/config.ts +++ b/src/platform/web/config.ts @@ -1,5 +1,5 @@ import msgpack from './lib/util/msgpack'; -import { IPlatformConfig, TypedArray } from '../../common/types/IPlatformConfig'; +import { IPlatformConfig } from '../../common/types/IPlatformConfig'; import * as Utils from 'common/lib/util/utils'; // Workaround for salesforce lightning locker compat @@ -34,11 +34,9 @@ const Config: IPlatformConfig = { WebSocket: globalObject.WebSocket, fetchSupported: !!globalObject.fetch, xhrSupported: globalObject.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest(), - jsonpSupported: typeof document !== 'undefined', allowComet: allowComet(), streamingSupported: true, useProtocolHeartbeats: true, - createHmac: null, msgpack: msgpack, supportsBinary: !!globalObject.TextDecoder, preferBinary: false, @@ -61,12 +59,11 @@ const Config: IPlatformConfig = { }, TextEncoder: globalObject.TextEncoder, TextDecoder: globalObject.TextDecoder, - Promise: globalObject.Promise, getRandomValues: (function (crypto) { if (crypto === undefined) { return undefined; } - return function (arr: TypedArray, callback?: (error: Error | null) => void) { + return function (arr: ArrayBufferView, callback?: (error: Error | null) => void) { crypto.getRandomValues(arr); if (callback) { callback(null); diff --git a/src/platform/web/index.ts b/src/platform/web/index.ts index 9adc0acaff..be345548b4 100644 --- a/src/platform/web/index.ts +++ b/src/platform/web/index.ts @@ -47,6 +47,8 @@ if (Platform.Config.noUpgrade) { Platform.Defaults.upgradeTransports = []; } +export { Rest, Realtime, msgpack }; + export default { ErrorInfo, Rest, diff --git a/src/platform/web/lib/transport/index.js b/src/platform/web/lib/transport/index.js index 2e53447e06..8fd7afb26a 100644 --- a/src/platform/web/lib/transport/index.js +++ b/src/platform/web/lib/transport/index.js @@ -1,5 +1,4 @@ -import JSONPTransport from './jsonptransport'; import XHRPollingTransport from './xhrpollingtransport'; import XHRStreamingTransport from './xhrstreamingtransport'; -export default [JSONPTransport, XHRPollingTransport, XHRStreamingTransport]; +export default [XHRPollingTransport, XHRStreamingTransport]; diff --git a/src/platform/web/lib/transport/jsonptransport.ts b/src/platform/web/lib/transport/jsonptransport.ts deleted file mode 100644 index dac890a147..0000000000 --- a/src/platform/web/lib/transport/jsonptransport.ts +++ /dev/null @@ -1,256 +0,0 @@ -import * as Utils from 'common/lib/util/utils'; -import CometTransport from 'common/lib/transport/comettransport'; -import Platform from 'common/platform'; -import EventEmitter from 'common/lib/util/eventemitter'; -import ErrorInfo, { IPartialErrorInfo, PartialErrorInfo } from 'common/lib/types/errorinfo'; -import Defaults from 'common/lib/util/defaults'; -import Logger from 'common/lib/util/logger'; -import Auth from 'common/lib/client/auth'; -import HttpMethods from 'common/constants/HttpMethods'; -import { RequestParams } from 'common/types/http'; -import ConnectionManager, { TransportParams } from 'common/lib/transport/connectionmanager'; -import XHRStates from 'common/constants/XHRStates'; - -// Workaround for salesforce lightning locker compatibility -let globalObject = Utils.getGlobalObject() as unknown as { - _ablyjs_jsonp: Record; - JSONPTransport: typeof JSONPTransport; -}; - -const noop = function () {}; -/* Can't just use window.Ably, as that won't exist if using the commonjs version. */ -const _: Record = (globalObject._ablyjs_jsonp = {}); - -/* express strips out parantheses from the callback! - * Kludge to still alow its responses to work, while not keeping the - * function form for normal use and not cluttering window.Ably - * https://github.com/expressjs/express/blob/5b4d4b4ab1324743534fbcd4709f4e75bb4b4e9d/lib/response.js#L305 - */ -_._ = function (id: string) { - return _['_' + id] || noop; -}; -let idCounter = 1; -const shortName = 'jsonp'; - -export function createRequest( - uri: string, - headers: Record | null, - params?: RequestParams, - body?: unknown, - requestMode?: number, - timeouts?: Record | null, - method?: HttpMethods -) { - /* JSONP requests are used either with the context being a realtime - * transport, or with timeouts passed in (for when used by a rest client), - * or completely standalone. Use the appropriate timeouts in each case */ - timeouts = timeouts || Defaults.TIMEOUTS; - return new Request( - undefined, - uri, - headers, - Utils.copy(params), - body, - requestMode as number, - timeouts as Record, - method - ); -} - -class JSONPTransport extends CometTransport { - shortName = shortName; - - constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) { - super(connectionManager, auth, params); - params.stream = false; - } - - static isAvailable() { - return Platform.Config.jsonpSupported && Platform.Config.allowComet; - } - - toString() { - return 'JSONPTransport; uri=' + this.baseUri + '; isConnected=' + this.isConnected; - } - - createRequest( - uri: string, - headers: Record | null, - params?: Record, - body?: unknown, - requestMode?: number, - timeouts?: Record, - method?: HttpMethods - ) { - /* JSONP requests are used either with the context being a realtime - * transport, or with timeouts passed in (for when used by a rest client), - * or completely standalone. Use the appropriate timeouts in each case */ - timeouts = this?.timeouts || timeouts || Defaults.TIMEOUTS; - return createRequest(uri, headers, params, body, requestMode, timeouts, method); - } -} - -export class Request extends EventEmitter { - id: string | number; - uri: string; - params: Record; - body: unknown; - requestMode: number; - timeouts: Record; - requestComplete: boolean; - method?: HttpMethods; - script?: HTMLScriptElement; - timer?: number | NodeJS.Timeout | null; - - constructor( - id: string | number | undefined, - uri: string, - headers: Record | null, - params: Record | null, - body: unknown | null, - requestMode: number, - timeouts: Record, - method?: HttpMethods - ) { - super(); - if (id === undefined) id = idCounter++; - this.id = id; - this.uri = uri; - this.params = params || {}; - this.params.rnd = Utils.cheapRandStr(); - if (headers) { - /* JSONP doesn't allow headers. Cherry-pick a couple to turn into qs params */ - if (headers['X-Ably-Version']) this.params.v = headers['X-Ably-Version']; - if (headers['X-Ably-Lib']) this.params.lib = headers['X-Ably-Lib']; - } - this.body = body; - this.method = method; - this.requestMode = requestMode; - this.timeouts = timeouts; - this.requestComplete = false; - } - - exec() { - const id = this.id, - body = this.body, - method = this.method, - uri = this.uri, - params = this.params; - - params.callback = '_ablyjs_jsonp._(' + id + ')'; - - params.envelope = 'jsonp'; - if (body) { - params.body = body as string; - } - if (method && method !== 'get') { - params.method = method; - } - - const script = (this.script = document.createElement('script')); - const src = uri + Utils.toQueryString(params); - script.src = src; - if (script.src.split('/').slice(-1)[0] !== src.split('/').slice(-1)[0]) { - /* The src has been truncated. Can't abort, but can at least emit an - * error so the user knows what's gone wrong. (Can't compare strings - * directly as src may have a port, script.src won't) */ - Logger.logAction( - Logger.LOG_ERROR, - 'JSONP Request.exec()', - 'Warning: the browser appears to have truncated the script URI. This will likely result in the request failing due to an unparseable body param' - ); - } - script.async = true; - script.type = 'text/javascript'; - script.charset = 'UTF-8'; - script.onerror = (err: string | Event) => { - this.complete( - new PartialErrorInfo('JSONP script error (event: ' + Platform.Config.inspect(err) + ')', null, 400) - ); - }; - - type JSONPResponse = { - statusCode?: number; - response: { - error?: ErrorInfo; - }; - headers?: Record; - }; - - _['_' + id] = (message: JSONPResponse) => { - if (message.statusCode) { - /* Handle as enveloped jsonp, as all jsonp transport uses should be */ - const response = message.response; - if (message.statusCode == 204) { - this.complete(null, null, null, message.statusCode); - } else if (!response) { - this.complete(new PartialErrorInfo('Invalid server response: no envelope detected', null, 500)); - } else if (message.statusCode < 400 || Utils.isArray(response)) { - /* If response is an array, it's an array of protocol messages -- even if - * it contains an error action (hence the nonsuccess statuscode), we can - * consider the request to have succeeded, just pass it on to - * onProtocolMessage to decide what to do */ - this.complete(null, response, message.headers, message.statusCode); - } else { - const err = - response.error || new PartialErrorInfo('Error response received from server', null, message.statusCode); - this.complete(err); - } - } else { - /* Handle as non-enveloped -- as will be eg from a customer's authUrl server */ - this.complete(null, message); - } - }; - - const timeout = - this.requestMode == XHRStates.REQ_SEND ? this.timeouts.httpRequestTimeout : this.timeouts.recvTimeout; - this.timer = setTimeout(this.abort.bind(this), timeout); - let head = document.getElementsByTagName('head')[0]; - (head as HTMLHeadElement).insertBefore(script, (head as HTMLHeadElement).firstChild); - } - - complete( - err?: IPartialErrorInfo | null, - body?: unknown, - headers?: Record | null, - statusCode?: number - ) { - headers = headers || {}; - if (!this.requestComplete) { - this.requestComplete = true; - let contentType; - if (body) { - contentType = typeof body == 'string' ? 'text/plain' : 'application/json'; - headers['content-type'] = contentType; - this.emit('data', body); - } - - this.emit('complete', err, body, headers, /* unpacked: */ true, statusCode); - this.dispose(); - } - } - - abort() { - this.dispose(); - } - - dispose() { - const timer = this.timer; - if (timer) { - clearTimeout(timer as NodeJS.Timeout); - this.timer = null; - } - const script = this.script as HTMLScriptElement; - if (script.parentNode) script.parentNode.removeChild(script); - delete _[this.id]; - this.emit('disposed'); - } -} - -export default function (connectionManager: typeof ConnectionManager): typeof JSONPTransport { - globalObject.JSONPTransport = JSONPTransport; - if (JSONPTransport.isAvailable()) { - connectionManager.supportedTransports[shortName] = JSONPTransport; - } - return JSONPTransport; -} diff --git a/src/platform/web/lib/transport/withoutjsonp.js b/src/platform/web/lib/transport/withoutjsonp.js deleted file mode 100644 index 983f0cf0f4..0000000000 --- a/src/platform/web/lib/transport/withoutjsonp.js +++ /dev/null @@ -1,7 +0,0 @@ -/** - * This file exists for React Native and Nativescript in order to exclude the unsupported JSONP transport from these platforms. - */ -import XHRPollingTransport from './xhrpollingtransport'; -import XHRStreamingTransport from './xhrstreamingtransport'; - -export default [XHRPollingTransport, XHRStreamingTransport]; diff --git a/src/platform/web/lib/transport/xhrpollingtransport.js b/src/platform/web/lib/transport/xhrpollingtransport.js deleted file mode 100644 index af75d43abb..0000000000 --- a/src/platform/web/lib/transport/xhrpollingtransport.js +++ /dev/null @@ -1,35 +0,0 @@ -import * as Utils from '../../../../common/lib/util/utils'; -import Platform from '../../../../common/platform'; -import CometTransport from '../../../../common/lib/transport/comettransport'; -import XHRRequest from './xhrrequest'; - -var XHRPollingTransport = function (connectionManager) { - var shortName = 'xhr_polling'; - - function XHRPollingTransport(connectionManager, auth, params) { - params.stream = false; - CometTransport.call(this, connectionManager, auth, params); - this.shortName = shortName; - } - Utils.inherits(XHRPollingTransport, CometTransport); - - XHRPollingTransport.isAvailable = function () { - return Platform.Config.xhrSupported && Platform.Config.allowComet; - }; - - XHRPollingTransport.prototype.toString = function () { - return 'XHRPollingTransport; uri=' + this.baseUri + '; isConnected=' + this.isConnected; - }; - - XHRPollingTransport.prototype.createRequest = function (uri, headers, params, body, requestMode) { - return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts); - }; - - if (typeof connectionManager !== 'undefined' && XHRPollingTransport.isAvailable()) { - connectionManager.supportedTransports[shortName] = XHRPollingTransport; - } - - return XHRPollingTransport; -}; - -export default XHRPollingTransport; diff --git a/src/platform/web/lib/transport/xhrpollingtransport.ts b/src/platform/web/lib/transport/xhrpollingtransport.ts new file mode 100644 index 0000000000..212af4682f --- /dev/null +++ b/src/platform/web/lib/transport/xhrpollingtransport.ts @@ -0,0 +1,42 @@ +import Platform from '../../../../common/platform'; +import CometTransport from '../../../../common/lib/transport/comettransport'; +import XHRRequest from './xhrrequest'; +import ConnectionManager, { TransportParams } from 'common/lib/transport/connectionmanager'; +import Auth from 'common/lib/client/auth'; +import { RequestParams } from 'common/types/http'; + +var shortName = 'xhr_polling'; +class XHRPollingTransport extends CometTransport { + shortName = shortName; + constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) { + super(connectionManager, auth, params); + params.stream = false; + this.shortName = shortName; + } + + static isAvailable() { + return Platform.Config.xhrSupported && Platform.Config.allowComet; + } + + toString() { + return 'XHRPollingTransport; uri=' + this.baseUri + '; isConnected=' + this.isConnected; + } + + createRequest( + uri: string, + headers: Record, + params: RequestParams, + body: unknown, + requestMode: number + ) { + return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts); + } +} + +function initialiseTransport(connectionManager: any): typeof XHRPollingTransport { + if (XHRPollingTransport.isAvailable()) connectionManager.supportedTransports[shortName] = XHRPollingTransport; + + return XHRPollingTransport; +} + +export default initialiseTransport; diff --git a/src/platform/web/lib/transport/xhrstreamingtransport.js b/src/platform/web/lib/transport/xhrstreamingtransport.js deleted file mode 100644 index faf40f15ff..0000000000 --- a/src/platform/web/lib/transport/xhrstreamingtransport.js +++ /dev/null @@ -1,35 +0,0 @@ -import * as Utils from '../../../../common/lib/util/utils'; -import CometTransport from '../../../../common/lib/transport/comettransport'; -import Platform from '../../../../common/platform'; -import XHRRequest from './xhrrequest'; - -var XHRStreamingTransport = function (connectionManager) { - var shortName = 'xhr_streaming'; - - /* public constructor */ - function XHRStreamingTransport(connectionManager, auth, params) { - CometTransport.call(this, connectionManager, auth, params); - this.shortName = shortName; - } - Utils.inherits(XHRStreamingTransport, CometTransport); - - XHRStreamingTransport.isAvailable = function () { - return Platform.Config.xhrSupported && Platform.Config.streamingSupported && Platform.Config.allowComet; - }; - - XHRStreamingTransport.prototype.toString = function () { - return 'XHRStreamingTransport; uri=' + this.baseUri + '; isConnected=' + this.isConnected; - }; - - XHRStreamingTransport.prototype.createRequest = function (uri, headers, params, body, requestMode) { - return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts); - }; - - if (typeof connectionManager !== 'undefined' && XHRStreamingTransport.isAvailable()) { - connectionManager.supportedTransports[shortName] = XHRStreamingTransport; - } - - return XHRStreamingTransport; -}; - -export default XHRStreamingTransport; diff --git a/src/platform/web/lib/transport/xhrstreamingtransport.ts b/src/platform/web/lib/transport/xhrstreamingtransport.ts new file mode 100644 index 0000000000..d2b816a650 --- /dev/null +++ b/src/platform/web/lib/transport/xhrstreamingtransport.ts @@ -0,0 +1,40 @@ +import CometTransport from '../../../../common/lib/transport/comettransport'; +import Platform from '../../../../common/platform'; +import XHRRequest from './xhrrequest'; +import ConnectionManager, { TransportParams } from 'common/lib/transport/connectionmanager'; +import Auth from 'common/lib/client/auth'; +import { RequestParams } from 'common/types/http'; + +const shortName = 'xhr_streaming'; +class XHRStreamingTransport extends CometTransport { + shortName = shortName; + constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) { + super(connectionManager, auth, params); + } + + static isAvailable() { + return Platform.Config.xhrSupported && Platform.Config.streamingSupported && Platform.Config.allowComet; + } + + toString() { + return 'XHRStreamingTransport; uri=' + this.baseUri + '; isConnected=' + this.isConnected; + } + + createRequest( + uri: string, + headers: Record, + params: RequestParams, + body: unknown, + requestMode: number + ) { + return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts); + } +} + +function initialiseTransport(connectionManager: any): typeof XHRStreamingTransport { + if (XHRStreamingTransport.isAvailable()) connectionManager.supportedTransports[shortName] = XHRStreamingTransport; + + return XHRStreamingTransport; +} + +export default initialiseTransport; diff --git a/src/platform/web/lib/util/bufferutils.ts b/src/platform/web/lib/util/bufferutils.ts index 2210f281cb..279112ed95 100644 --- a/src/platform/web/lib/util/bufferutils.ts +++ b/src/platform/web/lib/util/bufferutils.ts @@ -1,36 +1,19 @@ -import { parse as parseHex, stringify as stringifyHex } from 'crypto-js/build/enc-hex'; -import { parse as parseUtf8, stringify as stringifyUtf8 } from 'crypto-js/build/enc-utf8'; -import { parse as parseBase64, stringify as stringifyBase64 } from 'crypto-js/build/enc-base64'; -import WordArray from 'crypto-js/build/lib-typedarrays'; import Platform from 'common/platform'; -import { TypedArray } from 'common/types/IPlatformConfig'; import IBufferUtils from 'common/types/IBufferUtils'; +import { hmac as hmacSha256 } from './hmac-sha256'; /* Most BufferUtils methods that return a binary object return an ArrayBuffer - * if supported, else a CryptoJS WordArray. The exception is toBuffer, which - * returns a Uint8Array (and won't work on browsers too old to support it) */ + * The exception is toBuffer, which returns a Uint8Array (and won't work on + * browsers too old to support it) */ -export type Bufferlike = WordArray | ArrayBuffer | TypedArray; +export type Bufferlike = BufferSource; export type Output = Bufferlike; export type ToBufferOutput = Uint8Array; -export type ComparableBuffer = ArrayBuffer; -class BufferUtils implements IBufferUtils { +class BufferUtils implements IBufferUtils { base64CharSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; hexCharSet = '0123456789abcdef'; - isWordArray(ob: unknown): ob is WordArray { - return ob !== null && ob !== undefined && (ob as WordArray).sigBytes !== undefined; - } - - isArrayBuffer(ob: unknown): ob is ArrayBuffer { - return ob !== null && ob !== undefined && (ob as ArrayBuffer).constructor === ArrayBuffer; - } - - isTypedArray(ob: unknown): ob is TypedArray { - return !!ArrayBuffer && ArrayBuffer.isView && ArrayBuffer.isView(ob); - } - // // https://gist.githubusercontent.com/jonleighton/958841/raw/f200e30dfe95212c0165ccf1ae000ca51e9de803/gistfile1.js uint8ViewToBase64(bytes: Uint8Array) { let base64 = ''; @@ -95,7 +78,7 @@ class BufferUtils implements IBufferUtils>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - } - - return uint8View; - } - - throw new Error('BufferUtils.toBuffer expected an arraybuffer, typed array, or CryptoJS wordarray'); + throw new Error('BufferUtils.toBuffer expected an ArrayBuffer or a view onto one'); } toArrayBuffer(buffer: Bufferlike): ArrayBuffer { - if (this.isArrayBuffer(buffer)) { + if (buffer instanceof ArrayBuffer) { return buffer; } return this.toBuffer(buffer).buffer; } - toWordArray(buffer: Bufferlike | number[]) { - if (this.isTypedArray(buffer)) { - buffer = buffer.buffer; - } - return this.isWordArray(buffer) ? buffer : WordArray.create(buffer as number[]); - } - base64Encode(buffer: Bufferlike) { - if (this.isWordArray(buffer)) { - return stringifyBase64(buffer); - } return this.uint8ViewToBase64(this.toBuffer(buffer)); } base64Decode(str: string): Output { if (ArrayBuffer && Platform.Config.atob) { return this.base64ToArrayBuffer(str); + } else { + throw new Error('Expected ArrayBuffer to exist and Platform.Config.atob to be configured'); } - return parseBase64(str); } hexEncode(buffer: Bufferlike) { - return stringifyHex(this.toWordArray(buffer)); + const arrayBuffer = + buffer instanceof ArrayBuffer + ? buffer + : buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); + const uint8Array = new Uint8Array(arrayBuffer); + return uint8Array.reduce((accum, byte) => accum + byte.toString(16).padStart(2, '0'), ''); } - hexDecode(string: string) { - var wordArray = parseHex(string); - return ArrayBuffer ? this.toArrayBuffer(wordArray) : wordArray; + hexDecode(hexEncodedBytes: string) { + if (hexEncodedBytes.length % 2 !== 0) { + throw new Error("Can't create a byte array from a hex string of odd length"); + } + + const uint8Array = new Uint8Array(hexEncodedBytes.length / 2); + + for (let i = 0; i < uint8Array.length; i++) { + uint8Array[i] = parseInt(hexEncodedBytes.slice(2 * i, 2 * (i + 1)), 16); + } + + return uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength); } utf8Encode(string: string) { if (Platform.Config.TextEncoder) { return new Platform.Config.TextEncoder().encode(string).buffer; + } else { + throw new Error('Expected TextEncoder to be configured'); } - return parseUtf8(string); } /* For utf8 decoding we apply slightly stricter input validation than to @@ -179,46 +155,45 @@ class BufferUtils implements IBufferUtils; +type InputPlaintext = CryptoDataTypes.InputPlaintext; +type OutputCiphertext = ArrayBuffer; +type InputCiphertext = CryptoDataTypes.InputCiphertext; +type OutputPlaintext = ArrayBuffer; + +var CryptoFactory = function (config: IPlatformConfig, bufferUtils: typeof BufferUtils) { + var DEFAULT_ALGORITHM = 'aes'; + var DEFAULT_KEYLENGTH = 256; // bits + var DEFAULT_MODE = 'cbc'; + var DEFAULT_BLOCKLENGTH = 16; // bytes + var DEFAULT_BLOCKLENGTH_WORDS = 4; // 32-bit words + var UINT32_SUP = 0x100000000; + + /** + * Internal: generate an array of secure random data corresponding to the given length of bytes + * @param bytes + * @param callback + */ + var generateRandom: (byteLength: number, callback: (error: Error | null, result: ArrayBuffer | null) => void) => void; + if (config.getRandomArrayBuffer) { + generateRandom = config.getRandomArrayBuffer; + } else if (typeof Uint32Array !== 'undefined' && config.getRandomValues) { + var blockRandomArray = new Uint32Array(DEFAULT_BLOCKLENGTH_WORDS); + generateRandom = function (bytes, callback) { + var words = bytes / 4, + nativeArray = words == DEFAULT_BLOCKLENGTH_WORDS ? blockRandomArray : new Uint32Array(words); + config.getRandomValues!(nativeArray, function (err) { + if (typeof callback !== 'undefined') { + callback(err, bufferUtils.toArrayBuffer(nativeArray)); + } + }); + }; + } else { + generateRandom = function (bytes, callback) { + Logger.logAction( + Logger.LOG_MAJOR, + 'Ably.Crypto.generateRandom()', + 'Warning: the browser you are using does not support secure cryptographically secure randomness generation; falling back to insecure Math.random()' + ); + var words = bytes / 4, + array = new Uint32Array(words); + for (var i = 0; i < words; i++) { + array[i] = Math.floor(Math.random() * UINT32_SUP); + } + + callback(null, bufferUtils.toArrayBuffer(array)); + }; + } + + /** + * Internal: checks that the cipherParams are a valid combination. Currently + * just checks that the calculated keyLength is a valid one for aes-cbc + */ + function validateCipherParams(params: API.Types.CipherParams) { + if (params.algorithm === 'aes' && params.mode === 'cbc') { + if (params.keyLength === 128 || params.keyLength === 256) { + return; + } + throw new Error( + 'Unsupported key length ' + + params.keyLength + + ' for aes-cbc encryption. Encryption key must be 128 or 256 bits (16 or 32 ASCII characters)' + ); + } + } + + function normaliseBase64(string: string) { + /* url-safe base64 strings use _ and - instread of / and + */ + return string.replace('_', '/').replace('-', '+'); + } + + function isCipherParams( + params: API.Types.CipherParams | API.Types.CipherParamOptions + ): params is API.Types.CipherParams { + // Although API.Types.CipherParams is an interface, the documentation for its `key` property makes it clear that the only valid way to form one is by using getDefaultParams. The implementation of getDefaultParams returns an instance of CipherParams. + return params instanceof CipherParams; + } + + /** + * A class encapsulating the client-specifiable parameters for + * the cipher. + * + * algorithm is the name of the algorithm in the default system provider, + * or the lower-cased version of it; eg "aes" or "AES". + * + * Clients are recommended to not call this directly, but instead to use the + * Crypto.getDefaultParams helper, which will fill in any fields not supplied + * with default values and validation the result. + */ + class CipherParams implements API.Types.CipherParams { + algorithm: string; + keyLength: number; + mode: string; + key: ArrayBuffer; + + constructor(algorithm: string, keyLength: number, mode: string, key: ArrayBuffer) { + this.algorithm = algorithm; + this.keyLength = keyLength; + this.mode = mode; + this.key = key; + } + } + + /** + * Utility classes and interfaces for message payload encryption. + * + * This class supports AES/CBC/PKCS5 with a default keylength of 128 bits + * but supporting other keylengths. Other algorithms and chaining modes are + * not supported directly, but supportable by extending/implementing the base + * classes and interfaces here. + *- + * Secure random data for creation of Initialization Vectors (IVs) and keys + * is obtained from window.crypto.getRandomValues if available, or from + * Math.random() if not. Clients who do not want to depend on Math.random() + * should polyfill window.crypto.getRandomValues with a library that seeds + * a PRNG with real entropy. + * + * Each message payload is encrypted with an IV in CBC mode, and the IV is + * concatenated with the resulting raw ciphertext to construct the "ciphertext" + * data passed to the recipient. + */ + class Crypto { + static CipherParams = CipherParams; + + /** + * Obtain a complete CipherParams instance from the provided params, filling + * in any not provided with default values, calculating a keyLength from + * the supplied key, and validating the result. + * @param params an object containing at a minimum a `key` key with value the + * key, as either a binary or a base64-encoded string. + * May optionally also contain: algorithm (defaults to AES), + * mode (defaults to 'cbc') + */ + static getDefaultParams(params: API.Types.CipherParamOptions) { + var key: ArrayBuffer; + + if (!params.key) { + throw new Error('Crypto.getDefaultParams: a key is required'); + } + + if (typeof params.key === 'string') { + key = bufferUtils.toArrayBuffer(bufferUtils.base64Decode(normaliseBase64(params.key))); + } else if (params.key instanceof ArrayBuffer) { + key = params.key; + } else { + key = bufferUtils.toArrayBuffer(params.key); + } + + var algorithm = params.algorithm || DEFAULT_ALGORITHM; + var keyLength = key.byteLength * 8; + var mode = params.mode || DEFAULT_MODE; + var cipherParams = new CipherParams(algorithm, keyLength, mode, key); + + if (params.keyLength && params.keyLength !== cipherParams.keyLength) { + throw new Error( + 'Crypto.getDefaultParams: a keyLength of ' + + params.keyLength + + ' was specified, but the key actually has length ' + + cipherParams.keyLength + ); + } + + validateCipherParams(cipherParams); + return cipherParams; + } + + /** + * Generate a random encryption key from the supplied keylength (or the + * default keyLength if none supplied) as an ArrayBuffer + * @param keyLength (optional) the required keyLength in bits + */ + static async generateRandomKey(keyLength?: number): Promise { + return new Promise((resolve, reject) => { + generateRandom((keyLength || DEFAULT_KEYLENGTH) / 8, function (err, buf) { + if (err) { + const errorInfo = new ErrorInfo('Failed to generate random key: ' + err.message, 400, 50000, err); + reject(errorInfo); + } else { + resolve(buf!); + } + }); + }); + } + + /** + * Internal; get a ChannelCipher instance based on the given cipherParams + * @param params either a CipherParams instance or some subset of its + * fields that includes a key + */ + static getCipher(params: IGetCipherParams) { + var cipherParams = isCipherParams(params) ? (params as CipherParams) : this.getDefaultParams(params); + + return { + cipherParams: cipherParams, + cipher: new CBCCipher(cipherParams, params.iv ?? null), + }; + } + } + + Crypto satisfies ICryptoStatic; + + class CBCCipher implements ICipher { + algorithm: string; + webCryptoAlgorithm: string; + key: ArrayBuffer; + iv: ArrayBuffer | null; + + constructor(params: CipherParams, iv: IV | null) { + if (!crypto.subtle) { + if (isSecureContext) { + throw new Error( + 'Crypto operations are not possible since the browser’s SubtleCrypto class is unavailable (reason unknown).' + ); + } else { + throw new Error( + 'Crypto operations are is not possible since the current environment is a non-secure context and hence the browser’s SubtleCrypto class is not available.' + ); + } + } + + this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode; + this.webCryptoAlgorithm = params.algorithm + '-' + params.mode; + this.key = bufferUtils.toArrayBuffer(params.key); + this.iv = iv ? bufferUtils.toArrayBuffer(iv) : null; + } + + private concat(buffer1: Bufferlike, buffer2: Bufferlike) { + const output = new ArrayBuffer(buffer1.byteLength + buffer2.byteLength); + const outputView = new DataView(output); + + const buffer1View = new DataView(bufferUtils.toArrayBuffer(buffer1)); + for (let i = 0; i < buffer1View.byteLength; i++) { + outputView.setInt8(i, buffer1View.getInt8(i)); + } + + const buffer2View = new DataView(bufferUtils.toArrayBuffer(buffer2)); + for (let i = 0; i < buffer2View.byteLength; i++) { + outputView.setInt8(buffer1View.byteLength + i, buffer2View.getInt8(i)); + } + + return output; + } + + encrypt(plaintext: InputPlaintext, callback: (error: Error | null, data: OutputCiphertext | null) => void) { + Logger.logAction(Logger.LOG_MICRO, 'CBCCipher.encrypt()', ''); + + const encryptAsync = async () => { + const iv = await new Promise((resolve: (iv: IV) => void, reject: (error: Error) => void) => { + this.getIv((error, iv) => { + if (error) { + reject(error); + } else { + resolve(iv!); + } + }); + }); + + const cryptoKey = await crypto.subtle.importKey('raw', this.key, this.webCryptoAlgorithm, false, ['encrypt']); + const ciphertext = await crypto.subtle.encrypt({ name: this.webCryptoAlgorithm, iv }, cryptoKey, plaintext); + + return this.concat(iv, ciphertext); + }; + + encryptAsync() + .then((ciphertext) => { + callback(null, ciphertext); + }) + .catch((error) => { + callback(error, null); + }); + } + + async decrypt(ciphertext: InputCiphertext): Promise { + Logger.logAction(Logger.LOG_MICRO, 'CBCCipher.decrypt()', ''); + + const ciphertextArrayBuffer = bufferUtils.toArrayBuffer(ciphertext); + const iv = ciphertextArrayBuffer.slice(0, DEFAULT_BLOCKLENGTH); + const ciphertextBody = ciphertextArrayBuffer.slice(DEFAULT_BLOCKLENGTH); + + const cryptoKey = await crypto.subtle.importKey('raw', this.key, this.webCryptoAlgorithm, false, ['decrypt']); + return crypto.subtle.decrypt({ name: this.webCryptoAlgorithm, iv }, cryptoKey, ciphertextBody); + } + + getIv(callback: (error: Error | null, iv: ArrayBuffer | null) => void) { + if (this.iv) { + var iv = this.iv; + this.iv = null; + callback(null, iv); + return; + } + + /* Since the iv for a new block is the ciphertext of the last, this + * sets a new iv (= aes(randomBlock XOR lastCipherText)) as well as + * returning it */ + generateRandom(DEFAULT_BLOCKLENGTH, function (err, randomBlock) { + if (err) { + callback(err, null); + return; + } + callback(null, bufferUtils.toArrayBuffer(randomBlock!)); + }); + } + } + + return Crypto; +}; + +export default CryptoFactory; diff --git a/src/platform/web/lib/util/defaults.ts b/src/platform/web/lib/util/defaults.ts index d5c26535b0..7366ec75a4 100644 --- a/src/platform/web/lib/util/defaults.ts +++ b/src/platform/web/lib/util/defaults.ts @@ -3,30 +3,12 @@ import TransportNames from 'common/constants/TransportNames'; const Defaults: IDefaults = { connectivityCheckUrl: 'https://internet-up.ably-realtime.com/is-the-internet-up.txt', - jsonpInternetUpUrl: 'https://internet-up.ably-realtime.com/is-the-internet-up-0-9.js', /* Order matters here: the base transport is the leftmost one in the * intersection of baseTransportOrder and the transports clientOption that's - * supported. This is not quite the same as the preference order -- e.g. - * xhr_polling is preferred to jsonp, but for browsers that support it we want - * the base transport to be xhr_polling, not jsonp */ - defaultTransports: [ - TransportNames.XhrPolling, - TransportNames.XhrStreaming, - TransportNames.JsonP, - TransportNames.WebSocket, - ], - baseTransportOrder: [ - TransportNames.XhrPolling, - TransportNames.XhrStreaming, - TransportNames.JsonP, - TransportNames.WebSocket, - ], - transportPreferenceOrder: [ - TransportNames.JsonP, - TransportNames.XhrPolling, - TransportNames.XhrStreaming, - TransportNames.WebSocket, - ], + * supported. */ + defaultTransports: [TransportNames.XhrPolling, TransportNames.XhrStreaming, TransportNames.WebSocket], + baseTransportOrder: [TransportNames.XhrPolling, TransportNames.XhrStreaming, TransportNames.WebSocket], + transportPreferenceOrder: [TransportNames.XhrPolling, TransportNames.XhrStreaming, TransportNames.WebSocket], upgradeTransports: [TransportNames.XhrStreaming, TransportNames.WebSocket], }; diff --git a/src/platform/web/lib/util/hmac-sha256.ts b/src/platform/web/lib/util/hmac-sha256.ts new file mode 100644 index 0000000000..1000b5172d --- /dev/null +++ b/src/platform/web/lib/util/hmac-sha256.ts @@ -0,0 +1,217 @@ +/** + * Copied from https://gist.github.com/stevendesu/2d52f7b5e1f1184af3b667c0b5e054b8 + * + * "A simple, open-source, HMAC-SHA256 implementation in pure JavaScript. Designed for efficient minification." + * + * I asked about licensing, and the author said: + * + * > Feel free to use it however you'd like 😄 As the gist title indicates, + * > this is "a simple open source implementation". Feel free to choose whatever + * > license you find most permissible, but I offer no warranty for the code. + * > It's 100% free to do with as you please. + */ + +// To ensure cross-browser support even without a proper SubtleCrypto +// impelmentation (or without access to the impelmentation, as is the case with +// Chrome loaded over HTTP instead of HTTPS), this library can create SHA-256 +// HMAC signatures using nothing but raw JavaScript + +/* eslint-disable no-magic-numbers, id-length, no-param-reassign, new-cap */ + +// By giving internal functions names that we can mangle, future calls to +// them are reduced to a single byte (minor space savings in minified file) +var uint8Array = Uint8Array; +var uint32Array = Uint32Array; +var pow = Math.pow; + +// Will be initialized below +// Using a Uint32Array instead of a simple array makes the minified code +// a bit bigger (we lose our `unshift()` hack), but comes with huge +// performance gains +var DEFAULT_STATE = new uint32Array(8); +var ROUND_CONSTANTS: number[] = []; + +// Reusable object for expanded message +// Using a Uint32Array instead of a simple array makes the minified code +// 7 bytes larger, but comes with huge performance gains +var M = new uint32Array(64); + +// After minification the code to compute the default state and round +// constants is smaller than the output. More importantly, this serves as a +// good educational aide for anyone wondering where the magic numbers come +// from. No magic numbers FTW! +function getFractionalBits(n: number) { + return ((n - (n | 0)) * pow(2, 32)) | 0; +} + +var n = 2, + nPrime = 0; +while (nPrime < 64) { + // isPrime() was in-lined from its original function form to save + // a few bytes + var isPrime = true; + // Math.sqrt() was replaced with pow(n, 1/2) to save a few bytes + // var sqrtN = pow(n, 1 / 2); + // So technically to determine if a number is prime you only need to + // check numbers up to the square root. However this function only runs + // once and we're only computing the first 64 primes (up to 311), so on + // any modern CPU this whole function runs in a couple milliseconds. + // By going to n / 2 instead of sqrt(n) we net 8 byte savings and no + // scaling performance cost + for (var factor = 2; factor <= n / 2; factor++) { + if (n % factor === 0) { + isPrime = false; + } + } + if (isPrime) { + if (nPrime < 8) { + DEFAULT_STATE[nPrime] = getFractionalBits(pow(n, 1 / 2)); + } + ROUND_CONSTANTS[nPrime] = getFractionalBits(pow(n, 1 / 3)); + + nPrime++; + } + + n++; +} + +// For cross-platform support we need to ensure that all 32-bit words are +// in the same endianness. A UTF-8 TextEncoder will return BigEndian data, +// so upon reading or writing to our ArrayBuffer we'll only swap the bytes +// if our system is LittleEndian (which is about 99% of CPUs) +var LittleEndian = !!new uint8Array(new uint32Array([1]).buffer)[0]; + +function convertEndian(word: number) { + if (LittleEndian) { + return ( + // byte 1 -> byte 4 + (word >>> 24) | + // byte 2 -> byte 3 + (((word >>> 16) & 0xff) << 8) | + // byte 3 -> byte 2 + ((word & 0xff00) << 8) | + // byte 4 -> byte 1 + (word << 24) + ); + } else { + return word; + } +} + +function rightRotate(word: number, bits: number) { + return (word >>> bits) | (word << (32 - bits)); +} + +function sha256(data: Uint8Array) { + // Copy default state + var STATE = DEFAULT_STATE.slice(); + + // Caching this reduces occurrences of ".length" in minified JavaScript + // 3 more byte savings! :D + var legth = data.length; + + // Pad data + var bitLength = legth * 8; + var newBitLength = 512 - ((bitLength + 64) % 512) - 1 + bitLength + 65; + + // "bytes" and "words" are stored BigEndian + var bytes = new uint8Array(newBitLength / 8); + var words = new uint32Array(bytes.buffer); + + bytes.set(data, 0); + // Append a 1 + bytes[legth] = 0b10000000; + // Store length in BigEndian + words[words.length - 1] = convertEndian(bitLength); + + // Loop iterator (avoid two instances of "var") -- saves 2 bytes + var round; + + // Process blocks (512 bits / 64 bytes / 16 words at a time) + for (var block = 0; block < newBitLength / 32; block += 16) { + var workingState = STATE.slice(); + + // Rounds + for (round = 0; round < 64; round++) { + var MRound; + // Expand message + if (round < 16) { + // Convert to platform Endianness for later math + MRound = convertEndian(words[block + round]); + } else { + var gamma0x = M[round - 15]; + var gamma1x = M[round - 2]; + MRound = + M[round - 7] + + M[round - 16] + + (rightRotate(gamma0x, 7) ^ rightRotate(gamma0x, 18) ^ (gamma0x >>> 3)) + + (rightRotate(gamma1x, 17) ^ rightRotate(gamma1x, 19) ^ (gamma1x >>> 10)); + } + + // M array matches platform endianness + M[round] = MRound |= 0; + + // Computation + var t1 = + (rightRotate(workingState[4], 6) ^ rightRotate(workingState[4], 11) ^ rightRotate(workingState[4], 25)) + + ((workingState[4] & workingState[5]) ^ (~workingState[4] & workingState[6])) + + workingState[7] + + MRound + + ROUND_CONSTANTS[round]; + var t2 = + (rightRotate(workingState[0], 2) ^ rightRotate(workingState[0], 13) ^ rightRotate(workingState[0], 22)) + + ((workingState[0] & workingState[1]) ^ (workingState[2] & (workingState[0] ^ workingState[1]))); + for (var i = 7; i > 0; i--) { + workingState[i] = workingState[i - 1]; + } + workingState[0] = (t1 + t2) | 0; + workingState[4] = (workingState[4] + t1) | 0; + } + + // Update state + for (round = 0; round < 8; round++) { + STATE[round] = (STATE[round] + workingState[round]) | 0; + } + } + + // Finally the state needs to be converted to BigEndian for output + // And we want to return a Uint8Array, not a Uint32Array + return new uint8Array( + new uint32Array( + STATE.map(function (val) { + return convertEndian(val); + }) + ).buffer + ); +} + +export function hmac(key: Uint8Array, data: Uint8Array) { + if (key.length > 64) key = sha256(key); + + if (key.length < 64) { + const tmp = new Uint8Array(64); + tmp.set(key, 0); + key = tmp; + } + + // Generate inner and outer keys + var innerKey = new Uint8Array(64); + var outerKey = new Uint8Array(64); + for (var i = 0; i < 64; i++) { + innerKey[i] = 0x36 ^ key[i]; + outerKey[i] = 0x5c ^ key[i]; + } + + // Append the innerKey + var msg = new Uint8Array(data.length + 64); + msg.set(innerKey, 0); + msg.set(data, 64); + + // Has the previous message and append the outerKey + var result = new Uint8Array(64 + 32); + result.set(outerKey, 0); + result.set(sha256(msg), 64); + + // Hash the previous message + return sha256(result); +} diff --git a/src/platform/web/lib/util/http.ts b/src/platform/web/lib/util/http.ts index 2be9519de7..cad0a06185 100644 --- a/src/platform/web/lib/util/http.ts +++ b/src/platform/web/lib/util/http.ts @@ -10,7 +10,6 @@ import XHRRequest from '../transport/xhrrequest'; import XHRStates from 'common/constants/XHRStates'; import Logger from 'common/lib/util/logger'; import { StandardCallback } from 'common/types/utils'; -import { createRequest, Request } from '../transport/jsonptransport'; import fetchRequest from '../transport/fetchrequest'; import { NormalisedClientOptions } from 'common/types/ClientOptions'; import { isSuccessCode } from 'common/constants/HttpStatusCodes'; @@ -115,68 +114,6 @@ const Http: typeof IHttp = class { ); }; } - } else if (Platform.Config.jsonpSupported) { - this.Request = function ( - method: HttpMethods, - rest: Rest | null, - uri: string, - headers: Record | null, - params: RequestParams, - body: unknown, - callback: RequestCallback - ) { - const req = createRequest( - uri, - headers, - params, - body, - XHRStates.REQ_SEND, - rest && rest.options.timeouts, - method - ); - req.once('complete', callback); - Platform.Config.nextTick(function () { - req.exec(); - }); - return req; - }; - - if (this.options.disableConnectivityCheck) { - this.checkConnectivity = function (callback: (err: null, connectivity: true) => void) { - callback(null, true); - }; - } else { - this.checkConnectivity = function (callback: (err: ErrorInfo | null, connectivity?: boolean) => void) { - const upUrl = Defaults.jsonpInternetUpUrl; - - if (this.checksInProgress) { - this.checksInProgress.push(callback); - return; - } - this.checksInProgress = [callback]; - Logger.logAction(Logger.LOG_MICRO, '(JSONP)Http.checkConnectivity()', 'Sending; ' + upUrl); - - const req = new Request( - 'isTheInternetUp', - upUrl as string, - null, - null, - null, - XHRStates.REQ_SEND, - Defaults.TIMEOUTS - ); - req.once('complete', (err: Error, response: string) => { - const result = !err && response; - Logger.logAction(Logger.LOG_MICRO, '(JSONP)Http.checkConnectivity()', 'Result: ' + result); - for (let i = 0; i < (this.checksInProgress as Array>).length; i++) - (this.checksInProgress as Array>)[i](null, result); - this.checksInProgress = null; - }); - Platform.Config.nextTick(function () { - req.exec(); - }); - }; - } } else if (Platform.Config.fetchSupported) { this.supportsAuthHeaders = true; this.Request = fetchRequest; diff --git a/src/platform/web/lib/util/webstorage.ts b/src/platform/web/lib/util/webstorage.ts index d1ac7e4ec2..010bff419b 100644 --- a/src/platform/web/lib/util/webstorage.ts +++ b/src/platform/web/lib/util/webstorage.ts @@ -3,6 +3,8 @@ import IWebStorage from 'common/types/IWebStorage'; const test = 'ablyjs-storage-test'; +let globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self; + class Webstorage implements IWebStorage { sessionSupported: boolean; localSupported: boolean; @@ -14,16 +16,16 @@ class Webstorage implements IWebStorage { * somewhat roundabout way. (If unsupported or no global object, * will throw on accessing a property of undefined) */ try { - global.sessionStorage.setItem(test, test); - global.sessionStorage.removeItem(test); + globalObject.sessionStorage.setItem(test, test); + globalObject.sessionStorage.removeItem(test); this.sessionSupported = true; } catch (e) { this.sessionSupported = false; } try { - global.localStorage.setItem(test, test); - global.localStorage.removeItem(test); + globalObject.localStorage.setItem(test, test); + globalObject.localStorage.removeItem(test); this.localSupported = true; } catch (e) { this.localSupported = false; @@ -80,7 +82,7 @@ class Webstorage implements IWebStorage { } private storageInterface(session?: boolean) { - return session ? global.sessionStorage : global.localStorage; + return session ? globalObject.sessionStorage : globalObject.localStorage; } } diff --git a/test/browser/http.test.js b/test/browser/http.test.js index c9822b3918..5db5ea7894 100644 --- a/test/browser/http.test.js +++ b/test/browser/http.test.js @@ -3,15 +3,14 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var rest; var expect = chai.expect; + var whenPromiseSettles = helper.whenPromiseSettles; describe('rest/http/fetch', function () { this.timeout(60 * 1000); - let initialXhrSupported, initialJsonpSupported; + let initialXhrSupported; before(function (done) { initialXhrSupported = Ably.Rest.Platform.Config.xhrSupported; - initialJsonpSupported = Ably.Rest.Platform.Config.jsonpSupported; Ably.Rest.Platform.Config.xhrSupported = false; - Ably.Rest.Platform.Config.jsonpSupported = false; helper.setupApp(function () { rest = helper.AblyRest(); done(); @@ -20,11 +19,10 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { after((done) => { Ably.Rest.Platform.Config.xhrSupported = initialXhrSupported; - Ably.Rest.Platform.Config.jsonpSupported = initialJsonpSupported; done(); }); - it('Should use fetch when XHR and JSONP are not supported', function (done) { + it('Should use fetch when XHR is not supported', function (done) { let oldFetch = window.fetch; window.fetch = () => { done(); @@ -36,7 +34,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { it('Should succeed in using fetch to publish a message', function (done) { const channel = rest.channels.get('http_test_channel'); - channel.publish('test', 'Testing fetch support', (err) => { + whenPromiseSettles(channel.publish('test', 'Testing fetch support'), (err) => { expect(err).to.not.exist; done(); }); @@ -44,7 +42,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { it('Should pass errors correctly', function (done) { const channel = rest.channels.get(''); - channel.publish('test', 'Invalid message', (err) => { + whenPromiseSettles(channel.publish('test', 'Invalid message'), (err) => { expect(err).to.exist; done(); }); diff --git a/test/browser/simple.test.js b/test/browser/simple.test.js index 03245bfbac..bfc22014d7 100644 --- a/test/browser/simple.test.js +++ b/test/browser/simple.test.js @@ -2,6 +2,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var expect = chai.expect; + var whenPromiseSettles = helper.whenPromiseSettles; describe('browser/simple', function () { this.timeout(60 * 1000); @@ -71,7 +72,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { ably.connection.on('connected', function () { connectionTimeout.stop(); heartbeatTimeout = failWithin(25, done, ably, 'wait for heartbeat'); - ably.connection.ping(function (err) { + whenPromiseSettles(ably.connection.ping(), function (err) { heartbeatTimeout.stop(); done(err); ably.close(); @@ -115,7 +116,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { receiveMessagesTimeout = failWithin(15, done, ably, 'wait for published messages to be received'); timer = setInterval(function () { - channel.publish('event0', 'Hello world at: ' + new Date(), function (err) { + whenPromiseSettles(channel.publish('event0', 'Hello world at: ' + new Date()), function (err) { sentCbCount++; checkFinish(); }); @@ -221,27 +222,6 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { }); } - var jsonpTransport = 'jsonp'; - if (isTransportAvailable(jsonpTransport)) { - it('jsonpbase0', function (done) { - connectionWithTransport(done, jsonpTransport); - }); - - /* - * Publish and subscribe, json transport - */ - it('jsonppublish0', function (done) { - publishWithTransport(done, jsonpTransport); - }); - - /* - * Check heartbeat - */ - it('jsonpheartbeat0', function (done) { - heartbeatWithTransport(done, jsonpTransport); - }); - } - it('auto_transport_base0', function (done) { connectionWithTransport(done); }); diff --git a/test/common/globals/environment.js b/test/common/globals/environment.js index 9329ebf974..9a75be7273 100644 --- a/test/common/globals/environment.js +++ b/test/common/globals/environment.js @@ -41,15 +41,13 @@ define(function (require) { port: port, tlsPort: tlsPort, tls: tls, - log: { - level: logLevel, - handler: function (msg) { - var time = new Date(); - console.log( - time.getHours() + ':' + time.getMinutes() + ':' + time.getSeconds() + '.' + time.getMilliseconds(), - msg - ); - }, + logLevel: logLevel, + logHandler: function (msg) { + var time = new Date(); + console.log( + time.getHours() + ':' + time.getMinutes() + ':' + time.getSeconds() + '.' + time.getMilliseconds(), + msg + ); }, }); }); diff --git a/test/common/globals/named_dependencies.js b/test/common/globals/named_dependencies.js index 3228c893c6..4fc3a7407e 100644 --- a/test/common/globals/named_dependencies.js +++ b/test/common/globals/named_dependencies.js @@ -4,8 +4,6 @@ define(function () { // Ably modules ably: { browser: 'build/ably', node: 'build/ably-node' }, 'ably.noencryption': { browser: 'build/ably.noencryption' }, - base64: { browser: 'node_modules/crypto-js/build/enc-base64', node: 'skip' }, - utf8: { browser: 'node_modules/crypto-js/build/enc-utf8', node: 'skip' }, 'vcdiff-decoder': { browser: 'node_modules/@ably/vcdiff-decoder/dist/vcdiff-decoder', node: 'node_modules/@ably/vcdiff-decoder', diff --git a/test/common/modules/shared_helper.js b/test/common/modules/shared_helper.js index d6b6812910..fdf2a82587 100644 --- a/test/common/modules/shared_helper.js +++ b/test/common/modules/shared_helper.js @@ -12,14 +12,7 @@ define([ var utils = clientModule.Ably.Realtime.Utils; var platform = clientModule.Ably.Realtime.Platform; clientModule.Ably.Realtime.ConnectionManager.initTransports(); - var supportedTransports = utils.keysArray(clientModule.Ably.Realtime.ConnectionManager.supportedTransports), - /* Don't include jsonp in availableTransports if xhr works. Why? Because - * you can't abort requests. So recv's stick around for 90s till realtime - * ends them. So in a test, the browsers max-connections-per-host limit - * fills up quickly, which messes up other comet transports too */ - availableTransports = utils.arrIn(supportedTransports, 'xhr_polling') - ? utils.arrWithoutValue(supportedTransports, 'jsonp') - : supportedTransports, + var availableTransports = utils.keysArray(clientModule.Ably.Realtime.ConnectionManager.supportedTransports), bestTransport = availableTransports[0], /* IANA reserved; requests to it will hang forever */ unroutableHost = '10.255.255.1', @@ -64,6 +57,19 @@ define([ }); } + /** + * Uses a callback to communicate the result of a `Promise`. The first argument passed to the callback will be either an error (when the promise is rejected) or `null` (when the promise is fulfilled). In the case where the promise is fulfilled, the resulting value will be passed to the callback as a second argument. + */ + function whenPromiseSettles(promise, callback) { + promise + .then((result) => { + callback(null, result); + }) + .catch((err) => { + callback(err); + }); + } + function simulateDroppedConnection(realtime) { // Go into the 'disconnected' state before actually disconnecting the transports // to avoid the instantaneous reconnect attempt that would be triggered in @@ -157,11 +163,11 @@ define([ function restTestOnJsonMsgpack(name, testFn, skip) { var itFn = skip ? it.skip : it; - itFn(name + ' with binary protocol', function (done) { - testFn(done, new clientModule.AblyRest({ useBinaryProtocol: true }), name + '_binary'); + itFn(name + ' with binary protocol', async function () { + await testFn(new clientModule.AblyRest({ useBinaryProtocol: true }), name + '_binary'); }); - itFn(name + ' with text protocol', function (done) { - testFn(done, new clientModule.AblyRest({ useBinaryProtocol: false }), name + '_text'); + itFn(name + ' with text protocol', async function () { + await testFn(new clientModule.AblyRest({ useBinaryProtocol: false }), name + '_text'); }); } @@ -246,6 +252,7 @@ define([ unroutableAddress: unroutableAddress, arrFind: arrFind, arrFilter: arrFilter, + whenPromiseSettles: whenPromiseSettles, randomString: randomString, }); }); diff --git a/test/common/modules/testapp_manager.js b/test/common/modules/testapp_manager.js index b1da1db152..41724490e3 100644 --- a/test/common/modules/testapp_manager.js +++ b/test/common/modules/testapp_manager.js @@ -2,14 +2,13 @@ /* global define, isNativescript, fetch */ /* testapp module is responsible for setting up and tearing down apps in the test environment */ -define(['globals', 'base64', 'utf8', 'ably'], function (ablyGlobals, Base64, UTF8, ably) { +define(['globals', 'ably'], function (ablyGlobals, ably) { var restHost = ablyGlobals.restHost || prefixDomainWithEnvironment('rest.ably.io', ablyGlobals.environment), tlsPort = ablyGlobals.tlsPort; var isBrowser = typeof window === 'object', isNativescript = typeof global === 'object' && global.isNativescript, httpReq = httpReqFunction(), - toBase64 = base64Function(), loadJsonData = loadJsonDataNode, testResourcesPath = 'test/common/ably-common/test-resources/'; @@ -42,24 +41,10 @@ define(['globals', 'base64', 'utf8', 'ably'], function (ablyGlobals, Base64, UTF return null; } - function NSbase64Function(d) { - return Base64.stringify(d); - } - - function base64Function() { - if (isBrowser) { - return function (str) { - return Base64.stringify(UTF8.parse(str)); - }; - } else { - return function (str) { - return Buffer.from(str, 'ascii').toString('base64'); - }; - } - } - - function schemeMatchesCurrent(scheme) { - return scheme === window.location.protocol.slice(0, -1); + function toBase64(str) { + var bufferUtils = ably.Realtime.Platform.BufferUtils; + var buffer = bufferUtils.utf8Encode(str); + return bufferUtils.base64Encode(buffer); } function httpReqFunction() { @@ -90,32 +75,6 @@ define(['globals', 'base64', 'utf8', 'ably'], function (ablyGlobals, Base64, UTF uri = options.scheme + '://' + options.host + ':' + options.port + options.path; - if (xhr.isXDR && !schemeMatchesCurrent(options.scheme)) { - /* Can't use XDR for cross-scheme. For some requests could just force - * the same scheme and be done with it, but not for authenticated - * requests to ably, can't use basic auth for non-tls endpoints. - * Luckily ably can handle jsonp, so just use the ably Http method, - * which will use the jsonp transport. Can't just do this all the time - * as the local express webserver serves files statically, so can't do - * jsonp. */ - if (options.method === 'DELETE') { - /* Ignore DELETEs -- can't be done with jsonp at the moment, and - * simulation apps self-delete after a while */ - callback(); - } else { - new ably.Rest.Platform.Http().doUri( - options.method, - null, - uri, - options.headers, - options.body, - options.paramsIfNoHeaders || {}, - callback - ); - } - return; - } - xhr.open(options.method, uri); if (options.headers && !xhr.isXDR) { for (var h in options.headers) if (h !== 'Content-Length') xhr.setRequestHeader(h, options.headers[h]); diff --git a/test/realtime/api.test.js b/test/realtime/api.test.js index 1a4dae77be..951c0d0669 100644 --- a/test/realtime/api.test.js +++ b/test/realtime/api.test.js @@ -6,9 +6,6 @@ define(['ably', 'chai'], function (Ably, chai) { describe('realtime/api', function () { it('Client constructors', function () { expect(typeof Ably.Realtime).to.equal('function'); - expect(typeof Ably.Realtime.Promise).to.equal('function'); - expect(typeof Ably.Realtime.Callbacks).to.equal('function'); - expect(Ably.Realtime.Callbacks).to.equal(Ably.Realtime); }); it('Crypto', function () { diff --git a/test/realtime/auth.test.js b/test/realtime/auth.test.js index 0e76918547..92dde3019a 100644 --- a/test/realtime/auth.test.js +++ b/test/realtime/auth.test.js @@ -15,6 +15,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var http = new Ably.Realtime.Platform.Http(); var jwtTestChannelName = 'JWT_test' + String(Math.floor(Math.random() * 10000) + 1); var echoServer = 'https://echo.ably.io'; + var whenPromiseSettles = helper.whenPromiseSettles; /* * Helper function to fetch JWT tokens from the echo server @@ -40,13 +41,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } var rest = helper.AblyRest({ queryTime: true }); - rest.time(function (err, time) { + whenPromiseSettles(rest.time(), function (err, time) { if (err) { done(err); return; } else { currentTime = time; - rest.auth.requestToken({}, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({}), function (err, tokenDetails) { try { expect(!err, err && displayError(err)).to.be.ok; done(); @@ -64,7 +65,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async */ it('authbase0', function (done) { var realtime = helper.AblyRealtime(); - realtime.auth.requestToken(function (err, tokenDetails) { + whenPromiseSettles(realtime.auth.requestToken(), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -88,7 +89,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('auth_useAuthUrl_json', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.requestToken(null, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(null, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -113,7 +114,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('auth_useAuthUrl_post_json', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.requestToken(null, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(null, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -138,7 +139,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('auth_useAuthUrl_plainText', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.requestToken(null, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(null, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -164,7 +165,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime, rest = helper.AblyRest(); var authCallback = function (tokenParams, callback) { - rest.auth.createTokenRequest(tokenParams, null, function (err, tokenRequest) { + whenPromiseSettles(rest.auth.createTokenRequest(tokenParams, null), function (err, tokenRequest) { if (err) { closeAndFinish(done, realtime, err); return; @@ -202,7 +203,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async rest = helper.AblyRest(); var clientId = 'test clientid'; var authCallback = function (tokenParams, callback) { - rest.auth.requestToken(tokenParams, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -238,7 +239,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime, rest = helper.AblyRest(); var authCallback = function (tokenParams, callback) { - rest.auth.requestToken(tokenParams, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -275,7 +276,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('auth_useAuthUrl_mixed_authParams_qsParams', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.createTokenRequest(null, null, function (err, tokenRequest) { + whenPromiseSettles(rest.auth.createTokenRequest(null, null), function (err, tokenRequest) { if (err) { closeAndFinish(done, realtime, err); return; @@ -312,7 +313,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var rest = helper.AblyRest(), testClientId = 'testClientId'; var authCallback = function (tokenParams, callback) { - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId }), function (err, tokenDetails) { if (err) { done(err); return; @@ -350,7 +351,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientRealtime, testClientId = 'test client id'; var rest = helper.AblyRest(); - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId }), function (err, tokenDetails) { if (err) { done(err); return; @@ -376,7 +377,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime, testClientId = 'test client id'; var rest = helper.AblyRest(); - rest.auth.requestToken({ clientId: '*' }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: '*' }), function (err, tokenDetails) { if (err) { done(err); return; @@ -404,7 +405,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime, testClientId = 'test client id'; var rest = helper.AblyRest(); - rest.auth.requestToken({ clientId: '*' }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: '*' }), function (err, tokenDetails) { if (err) { done(err); return; @@ -432,7 +433,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientRealtime, testClientId = 'test client id'; var rest = helper.AblyRest(); - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId }), function (err, tokenDetails) { if (err) { done(err); return; @@ -459,28 +460,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(realtimeOptions); realtime.connection.on(function (stateChange) { if (stateChange.previous !== 'initialized') { - if (helper.bestTransport === 'jsonp') { - try { - // auth endpoints don't envelope, so we assume the 'least harmful' option, which is a disconnection with concomitant retry - expect(stateChange.current).to.equal('disconnected', 'Check connection goes to the expected state'); - // jsonp doesn't let you examine the statuscode - expect(stateChange.reason.statusCode).to.equal(401, 'Check correct cause error code'); - } catch (err) { - done(err); - } - } else { - try { - expect(stateChange.current).to.equal( - expectFailure ? 'failed' : 'disconnected', - 'Check connection goes to the expected state' - ); - expect(stateChange.reason.statusCode).to.equal( - expectFailure ? 403 : 401, - 'Check correct cause error code' - ); - } catch (err) { - done(err); - } + try { + expect(stateChange.current).to.equal( + expectFailure ? 'failed' : 'disconnected', + 'Check connection goes to the expected state' + ); + expect(stateChange.reason.statusCode).to.equal( + expectFailure ? 403 : 401, + 'Check correct cause error code' + ); + } catch (err) { + done(err); } try { expect(stateChange.reason.code).to.equal(80019, 'Check correct error code'); @@ -615,46 +605,42 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ) ); - /* auth endpoints don't envelope, so this won't work with jsonp */ - if (helper.bestTransport !== 'jsonp') { - it('authUrl_403_previously_active', function (done) { - var realtime, - rest = helper.AblyRest(); - rest.auth.requestToken(null, null, function (err, tokenDetails) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } + it('authUrl_403_previously_active', function (done) { + var realtime, + rest = helper.AblyRest(); + whenPromiseSettles(rest.auth.requestToken(null, null), function (err, tokenDetails) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } - var authPath = echoServer + '/?type=json&body=' + encodeURIComponent(JSON.stringify(tokenDetails)); + var authPath = echoServer + '/?type=json&body=' + encodeURIComponent(JSON.stringify(tokenDetails)); - realtime = helper.AblyRealtime({ authUrl: authPath }); + realtime = helper.AblyRealtime({ authUrl: authPath }); - realtime.connection.on('connected', function () { - /* replace the authUrl and reauth */ - realtime.auth.authorize( - null, - { authUrl: echoServer + '/respondwith?status=403' }, - function (err, tokenDetails) { - try { - expect(err && err.statusCode).to.equal(403, 'Check err statusCode'); - expect(err && err.code).to.equal(40300, 'Check err code'); - expect(realtime.connection.state).to.equal('failed', 'Check connection goes to the failed state'); - expect(realtime.connection.errorReason && realtime.connection.errorReason.statusCode).to.equal( - 403, - 'Check correct cause error code' - ); - expect(realtime.connection.errorReason.code).to.equal(80019, 'Check correct connection error code'); - closeAndFinish(done, realtime); - } catch (err) { - closeAndFinish(done, realtime, err); - } + realtime.connection.on('connected', function () { + /* replace the authUrl and reauth */ + whenPromiseSettles( + realtime.auth.authorize(null, { authUrl: echoServer + '/respondwith?status=403' }), + function (err, tokenDetails) { + try { + expect(err && err.statusCode).to.equal(403, 'Check err statusCode'); + expect(err && err.code).to.equal(40300, 'Check err code'); + expect(realtime.connection.state).to.equal('failed', 'Check connection goes to the failed state'); + expect(realtime.connection.errorReason && realtime.connection.errorReason.statusCode).to.equal( + 403, + 'Check correct cause error code' + ); + expect(realtime.connection.errorReason.code).to.equal(80019, 'Check correct connection error code'); + closeAndFinish(done, realtime); + } catch (err) { + closeAndFinish(done, realtime, err); } - ); - }); + } + ); }); }); - } + }); /* * Check state change reason is propogated during a disconnect @@ -665,7 +651,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientRealtime, rest = helper.AblyRest(); - rest.auth.requestToken({ ttl: 5000 }, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ ttl: 5000 }, null), function (err, tokenDetails) { if (err) { done(err); return; @@ -720,7 +706,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var asyncFns = []; for (var i = 0; i < 10; i++) { asyncFns.push(function (callback) { - rest.auth.createTokenRequest({}, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.createTokenRequest({}, null), function (err, tokenDetails) { if (err) { return callback(err); } @@ -759,7 +745,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientId = 'test clientid'; var authCallback = function (tokenParams, callback) { tokenParams.ttl = 5000; - rest.auth.requestToken(tokenParams, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -800,7 +786,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientId = 'test clientid'; var authCallback = function (tokenParams, callback) { tokenParams.ttl = 5000; - rest.auth.requestToken(tokenParams, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -838,33 +824,36 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime, rest = helper.AblyRest(); var clientId = 'test clientid'; - rest.auth.requestToken({ ttl: 5000, clientId: clientId }, null, function (err, tokenDetails) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } - realtime = helper.AblyRealtime(mixin(realtimeOpts, { token: tokenDetails.token, clientId: clientId })); - realtime.connection.once('connected', function () { - realtime.connection.once('disconnected', function (stateChange) { - try { - expect(stateChange.reason.code).to.equal(40142, 'Verify correct disconnect code'); - } catch (err) { - done(err); - return; - } - realtime.connection.once('failed', function (stateChange) { - /* Library has no way to generate a new token, so should fail */ + whenPromiseSettles( + rest.auth.requestToken({ ttl: 5000, clientId: clientId }, null), + function (err, tokenDetails) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } + realtime = helper.AblyRealtime(mixin(realtimeOpts, { token: tokenDetails.token, clientId: clientId })); + realtime.connection.once('connected', function () { + realtime.connection.once('disconnected', function (stateChange) { try { - expect(stateChange.reason.code).to.equal(40171, 'Verify correct cause failure code'); - realtime.close(); - done(); + expect(stateChange.reason.code).to.equal(40142, 'Verify correct disconnect code'); } catch (err) { done(err); + return; } + realtime.connection.once('failed', function (stateChange) { + /* Library has no way to generate a new token, so should fail */ + try { + expect(stateChange.reason.code).to.equal(40171, 'Verify correct cause failure code'); + realtime.close(); + done(); + } catch (err) { + done(err); + } + }); }); }); - }); - }); + } + ); }; }); @@ -876,7 +865,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime, rest = helper.AblyRest(); var clientId = 'test clientid'; - rest.auth.requestToken({ ttl: 1, clientId: clientId }, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ ttl: 1, clientId: clientId }, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -919,7 +908,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async tokenParams.clientId = '*'; tokenParams.capability = firstTime ? { wrong: ['*'] } : { right: ['*'] }; firstTime = false; - rest.auth.requestToken(tokenParams, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -931,7 +920,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async realtime = helper.AblyRealtime(mixin(realtimeOpts, { authCallback: authCallback })); realtime.connection.once('connected', function () { var channel = realtime.channels.get('right'); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { try { expect(err, 'Check using first token, without channel attach capability').to.be.ok; expect(err.code).to.equal(40160, 'Check expected error code'); @@ -941,14 +930,14 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } /* soon after connected, reauth */ - realtime.auth.authorize(null, null, function (err) { + whenPromiseSettles(realtime.auth.authorize(null, null), function (err) { try { expect(!err, err && displayError(err)).to.be.ok; } catch (err) { done(err); return; } - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { try { expect(!err, 'Check using second token, with channel attach capability').to.be.ok; closeAndFinish(done, realtime); @@ -986,14 +975,6 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async 'Check authorize completely replaces stored authOptions with passed in ones' ); - /* TODO remove for lib version 1.0 */ - realtime.auth.authorize(null, { authUrl: 'http://invalid' }); - realtime.auth.authorize(null, { force: true }); - expect(realtime.auth.authOptions.authUrl).to.equal( - 'http://invalid', - 'Check authorize does *not* replace stored authOptions when the only option is "force" in 0.9, for compatibility with 0.8' - ); - closeAndFinish(done, realtime); } catch (err) { closeAndFinish(done, realtime, err); @@ -1007,7 +988,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var rest = helper.AblyRest(), authCallback = function (tokenParams, callback) { // Request a token (should happen twice) - rest.auth.requestToken(tokenParams, null, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, tokenDetails) { if (err) { closeAndFinish(done, realtime, err); return; @@ -1118,7 +1099,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime({ authCallback: authCallback }); realtime.connection.once('connected', function () { var channel = realtime.channels.get(jwtTestChannelName); - channel.publish('greeting', 'Hello World!', function (err) { + whenPromiseSettles(channel.publish('greeting', 'Hello World!'), function (err) { try { expect(err.code).to.equal(40160, 'Verify publish denied code'); expect(err.statusCode).to.equal(401, 'Verify publish denied status code'); @@ -1242,7 +1223,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('reauth_consistently_expired_token', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.requestToken({ ttl: 1 }, function (err, token) { + whenPromiseSettles(rest.auth.requestToken({ ttl: 1 }), function (err, token) { if (err) { done(err); return; @@ -1275,7 +1256,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('expired_token_no_autoremove_when_dont_have_servertime', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.requestToken(function (err, token) { + whenPromiseSettles(rest.auth.requestToken(), function (err, token) { if (err) { done(err); return; @@ -1303,7 +1284,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('expired_token_autoremove_when_have_servertime', function (done) { var realtime, rest = helper.AblyRest(); - rest.auth.requestToken(function (err, token) { + whenPromiseSettles(rest.auth.requestToken(), function (err, token) { if (err) { done(err); return; @@ -1317,7 +1298,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }; realtime = helper.AblyRealtime({ authCallback: authCallback, autoConnect: false }); /* Set the server time offset */ - realtime.time(function () { + whenPromiseSettles(realtime.time(), function () { realtime.connect(); realtime.connection.on('connected', function () { try { @@ -1337,37 +1318,37 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* Check that only the last authorize matters */ it('multiple_concurrent_authorize', function (done) { var realtime = helper.AblyRealtime({ - log: { level: 4 }, + logLevel: 4, useTokenAuth: true, defaultTokenParams: { capability: { wrong: ['*'] } }, }); realtime.connection.once('connected', function () { - realtime.auth.authorize({ capability: { stillWrong: ['*'] } }, function (err) { + whenPromiseSettles(realtime.auth.authorize({ capability: { stillWrong: ['*'] } }), function (err) { try { expect(!err, 'Check first authorize cb was called').to.be.ok; } catch (err) { done(err); } }); - realtime.auth.authorize({ capability: { alsoNope: ['*'] } }, function (err) { + whenPromiseSettles(realtime.auth.authorize({ capability: { alsoNope: ['*'] } }), function (err) { try { expect(!err, 'Check second authorize cb was called').to.be.ok; } catch (err) { done(err); } }); - realtime.auth.authorize({ capability: { wtfAreYouThinking: ['*'] } }, function (err) { + whenPromiseSettles(realtime.auth.authorize({ capability: { wtfAreYouThinking: ['*'] } }), function (err) { try { expect(!err, 'Check third authorize one cb was called').to.be.ok; } catch (err) { done(err); } }); - realtime.auth.authorize({ capability: { right: ['*'] } }, function (err) { + whenPromiseSettles(realtime.auth.authorize({ capability: { right: ['*'] } }), function (err) { if (err) { closeAndFinish(done, realtime, err); } - realtime.channels.get('right').attach(function (err) { + whenPromiseSettles(realtime.channels.get('right').attach(), function (err) { try { expect(!err, (err && displayError(err)) || 'Successfully attached').to.be.ok; closeAndFinish(done, realtime); @@ -1390,7 +1371,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async closeAndFinish(done, realtime, err); }); realtime.connection.once('connected', function () { - realtime.channels.get('right').attach(function (err) { + whenPromiseSettles(realtime.channels.get('right').attach(), function (err) { try { expect(!err, (err && displayError(err)) || 'Successfully attached').to.be.ok; closeAndFinish(done, realtime); diff --git a/test/realtime/channel.test.js b/test/realtime/channel.test.js index a079b64062..25bd313a0a 100644 --- a/test/realtime/channel.test.js +++ b/test/realtime/channel.test.js @@ -9,6 +9,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var monitorConnection = helper.monitorConnection; var createPM = Ably.Realtime.ProtocolMessage.fromDeserialized; var testOnAllTransports = helper.testOnAllTransports; + var whenPromiseSettles = helper.whenPromiseSettles; var randomString = helper.randomString; function checkCanSubscribe(channel, testChannel) { @@ -24,7 +25,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async callback(); }); - testChannel.publish(eventName, null, function (err) { + whenPromiseSettles(testChannel.publish(eventName, null), function (err) { if (received) return; if (err) callback(err); timeout = setTimeout(function () { @@ -48,7 +49,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async callback('checkCantSubscribe: unexpectedly received message'); }); - testChannel.publish(eventName, null, function (err) { + whenPromiseSettles(testChannel.publish(eventName, null), function (err) { if (received) return; if (err) callback(err); timeout = setTimeout(function () { @@ -61,13 +62,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async function checkCanPublish(channel) { return function (callback) { - channel.publish(null, null, callback); + whenPromiseSettles(channel.publish(null, null), callback); }; } function checkCantPublish(channel) { return function (callback) { - channel.publish(null, null, function (err) { + whenPromiseSettles(channel.publish(null, null), function (err) { if (err && err.code === 40160) { callback(); } else { @@ -80,7 +81,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async function checkCanEnterPresence(channel) { return function (callback) { var clientId = randomString(); - channel.presence.enterClient(clientId, null, function (err) { + whenPromiseSettles(channel.presence.enterClient(clientId, null), function (err) { channel.presence.leaveClient(clientId); callback(err); }); @@ -89,7 +90,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async function checkCantEnterPresence(channel) { return function (callback) { - channel.presence.enterClient(randomString(), null, function (err) { + whenPromiseSettles(channel.presence.enterClient(randomString(), null), function (err) { if (err && err.code === 40160) { callback(); } else { @@ -113,7 +114,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async callback(); }); - testChannel.presence.enterClient(clientId, null, function (err) { + whenPromiseSettles(testChannel.presence.enterClient(clientId, null), function (err) { if (received) return; if (err) callback(err); timeout = setTimeout(function () { @@ -139,7 +140,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async callback('checkCantPresenceSubscribe: unexpectedly received message'); }); - testChannel.presence.enterClient(clientId, null, function (err) { + whenPromiseSettles(testChannel.presence.enterClient(clientId, null), function (err) { if (received) return; if (err) callback(err); timeout = setTimeout(function () { @@ -208,7 +209,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.on('connected', function () { var channel0 = realtime.channels.get('channelattach0'); - channel0.attach(function (err) { + whenPromiseSettles(channel0.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } @@ -230,7 +231,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { var realtime = helper.AblyRealtime(realtimeOpts); var channel2 = realtime.channels.get('channelattach2'); - channel2.attach(function (err) { + whenPromiseSettles(channel2.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -255,11 +256,11 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.on('connected', function () { var channel0 = realtime.channels.get('channelattach3'); - channel0.attach(function (err) { + whenPromiseSettles(channel0.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } - channel0.detach(function (err) { + whenPromiseSettles(channel0.detach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } @@ -293,7 +294,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.once('connected', function () { var channel0 = realtime.channels.get(''); - channel0.attach(function (err) { + whenPromiseSettles(channel0.attach(), function (err) { if (err) { setTimeout(function () { try { @@ -325,7 +326,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.once('connected', function () { var channel = realtime.channels.get(':hell'); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { try { expect(channel.errorReason.code).to.equal(40010, 'Attach error was set as the channel errorReason'); @@ -362,7 +363,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.once('connected', function () { - realtime.channels.get('publish_no_attach').publish(function (err) { + whenPromiseSettles(realtime.channels.get('publish_no_attach').publish(), function (err) { if (err) { closeAndFinish(done, realtime, new Error('Unexpected attach failure: ' + helper.displayError(err))); return; @@ -385,7 +386,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.once('connected', function () { - realtime.channels.get(':hell').publish(function (err) { + whenPromiseSettles(realtime.channels.get(':hell').publish(), function (err) { if (err) { try { expect(err.code).to.equal(40010, 'correct error code'); @@ -414,10 +415,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.once('connected', function () { - realtime.channels.get(':hell').attach(function (err) { + whenPromiseSettles(realtime.channels.get(':hell').attach(), function (err) { if (err) { /* attempt second attach */ - realtime.channels.get(':hell').attach(function (err) { + whenPromiseSettles(realtime.channels.get(':hell').attach(), function (err) { if (err) { setTimeout(function () { try { @@ -452,7 +453,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel = realtime.channels.get('channelattachOnceOrIf'), firedImmediately = false; - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { channel.whenState('attached', function () { firedImmediately = true; }); @@ -509,7 +510,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async params: params, }; var channel = realtime.channels.get(testName, channelOptions); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -563,7 +564,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }; var channel = realtime.channels.get(testName); channel.setOptions(channelOptions); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -639,7 +640,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channel = realtime.channels.get(testName, { params: params, }); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -684,23 +685,6 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.series( [ - function (cb) { - var setOptionsReturned = false; - channel.setOptions( - { - params: params, - modes: modes, - }, - function () { - expect( - !setOptionsReturned, - 'setOptions failed to call back immediately, when no reattach is required' - ).to.be.ok; - cb(); - } - ); - setOptionsReturned = true; - }, function (cb) { channel.attach(cb); }, @@ -713,21 +697,16 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channelUpdated = true; }); - var setOptionsReturned = false; - channel.setOptions( - { + whenPromiseSettles( + channel.setOptions({ params: { modes: 'publish', }, - }, + }), function () { /* Wait a tick so we don' depend on whether the update event runs the * channelUpdated listener or the setOptions listener first */ Ably.Realtime.Platform.Config.nextTick(function () { - expect( - setOptionsReturned, - 'setOptions should return immediately and call back after the reattach' - ).to.be.ok; expect( channelUpdated, 'Check channel went to the server to update the channel params' @@ -736,7 +715,6 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); } ); - setOptionsReturned = true; }, function (cb) { var channelUpdated = false; @@ -744,34 +722,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channelUpdated = true; }); - var setOptionsReturned = false; - channel.setOptions( - { + whenPromiseSettles( + channel.setOptions({ modes: ['subscribe'], - }, + }), function () { Ably.Realtime.Platform.Config.nextTick(function () { - expect( - setOptionsReturned, - 'setOptions should return immediately and call back after the reattach' - ).to.be.ok; expect(channelUpdated, 'Check channel went to the server to update the channel mode').to.be.ok; cb(); }); } ); - setOptionsReturned = true; - }, - function (cb) { - var setOptionsReturned = false; - channel.setOptions({}, function () { - expect( - !setOptionsReturned, - 'setOptions failed to call back immediately, when no reattach is required' - ).to.be.ok; - cb(); - }); - setOptionsReturned = true; }, ], function (err) { @@ -802,7 +763,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async modes: ['publish', 'presence_subscribe'], }; var channel = realtime.channels.get(testName, channelOptions); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -852,7 +813,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async modes: modes, }; var channel = realtime.channels.get(testName, channelOptions); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -902,7 +863,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async params: { delta: 'vcdiff' }, }; var channel = realtime.channels.get(testName, channelOptions); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -951,7 +912,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.series( [ function (cb) { - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { cb(err); }); }, @@ -959,7 +920,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelOptions = { modes: 'subscribe', }; - channel.setOptions(channelOptions, function (err) { + whenPromiseSettles(channel.setOptions(channelOptions), function (err) { expect(err.code).to.equal(40000, 'Check channelOptions validation error code'); expect(err.statusCode).to.equal(400, 'Check channelOptions validation error statusCode'); expect(channel.modes).to.deep.equal( @@ -973,7 +934,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelOptions = { modes: [1, 'subscribe'], }; - channel.setOptions(channelOptions, function (err) { + whenPromiseSettles(channel.setOptions(channelOptions), function (err) { expect(err.code).to.equal(40000, 'Check channelOptions validation error code'); expect(err.statusCode).to.equal(400, 'Check channelOptions validation error statusCode'); expect(channel.modes).to.deep.equal( @@ -987,7 +948,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelOptions = { params: 'test', }; - channel.setOptions(channelOptions, function (err) { + whenPromiseSettles(channel.setOptions(channelOptions), function (err) { expect(err.code).to.equal(40000, 'Check channelOptions validation error code'); expect(err.statusCode).to.equal(400, 'Check channelOptions validation error statusCode'); expect(channel.params).to.deep.equal({}, 'Check channel options params'); @@ -999,7 +960,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelOptions = { params: { nonexistent: 'foo' }, }; - channel.setOptions(channelOptions, function () { + whenPromiseSettles(channel.setOptions(channelOptions), function () { expect(channel.params).to.deep.equal({}, 'Check channel params'); cb(); }); @@ -1008,7 +969,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelOptions = { modes: undefined, }; - channel.setOptions(channelOptions, function (err) { + whenPromiseSettles(channel.setOptions(channelOptions), function (err) { expect(err.code).to.equal(40000, 'Check channelOptions validation error code'); expect(err.statusCode).to.equal(400, 'Check channelOptions validation error statusCode'); expect(channel.params).to.deep.equal({}, 'Check channel options params result'); @@ -1023,7 +984,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelOptions = { modes: ['susribe'], }; - channel.setOptions(channelOptions, function (err) { + whenPromiseSettles(channel.setOptions(channelOptions), function (err) { expect(err.code).to.equal(40000, 'Check channelOptions validation error code'); expect(err.statusCode).to.equal(400, 'Check channelOptions validation error statusCode'); expect(channel.params).to.deep.equal({}, 'Check channel options params result'); @@ -1054,7 +1015,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime({ useBinaryProtocol: true }); realtime.connection.on('connected', function () { var channel6 = realtime.channels.get('channelsubscribe0'); - channel6.attach(function (err) { + whenPromiseSettles(channel6.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -1094,21 +1055,21 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channelByEvent.unsubscribe('event', listenerByEvent); channelByListener.unsubscribe(listenerNoEvent); channelAll.unsubscribe(); - channelByEvent.publish('event', 'data', function (err) { + whenPromiseSettles(channelByEvent.publish('event', 'data'), function (err) { try { expect(!err, 'Error publishing single event: ' + err).to.be.ok; } catch (err) { closeAndFinish(done, realtime, err); return; } - channelByListener.publish(null, 'data', function (err) { + whenPromiseSettles(channelByListener.publish(null, 'data'), function (err) { try { expect(!err, 'Error publishing any event: ' + err).to.be.ok; } catch (err) { closeAndFinish(done, realtime, err); return; } - channelAll.publish(null, 'data', function (err) { + whenPromiseSettles(channelAll.publish(null, 'data'), function (err) { try { expect(!err, 'Error publishing any event: ' + err).to.be.ok; expect(messagesReceived).to.equal(3, 'Only three messages should be received by the listeners'); @@ -1174,7 +1135,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { /* Sabotage the reattach attempt, then simulate a server-sent detach */ @@ -1237,7 +1198,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ); }); }; - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { try { expect(err.code).to.equal(50000, 'check error is propogated to the attach callback'); expect(channel.state).to.equal('suspended', 'check channel goes into suspended'); @@ -1258,7 +1219,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel = realtime.channels.get(channelName); realtime.connection.once('connected', function () { - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -1302,7 +1263,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { channel.once(function (stateChange) { @@ -1338,7 +1299,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel = realtime.channels.get('publish_no_queueing'); /* try a publish while not yet connected */ - channel.publish('foo', 'bar', function (err) { + whenPromiseSettles(channel.publish('foo', 'bar'), function (err) { try { expect(err, 'Check publish while disconnected/connecting is rejected').to.be.ok; closeAndFinish(done, realtime); @@ -1372,7 +1333,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { expect(err, 'Channel attach timed out as expected').to.be.ok; expect(err && err.code).to.equal(90007, 'Attach timeout err passed to attach callback'); expect(channel.state).to.equal('suspended', 'Check channel state goes to suspended'); @@ -1417,7 +1378,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { /* Have the connection go into the suspended state, and check that the @@ -1481,7 +1442,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { /* Sabotage the detach attempt, detach, then simulate a server-sent attached while @@ -1517,7 +1478,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channel = realtime.channels.get(channelName); channel.state = 'suspended'; - channel.detach(function () { + whenPromiseSettles(channel.detach(), function () { expect(channel.state).to.equal( 'detached', 'Check that detach on suspended channel results in detached channel' @@ -1534,7 +1495,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel.state = 'failed'; - channel.detach(function (err) { + whenPromiseSettles(channel.detach(), function (err) { if (!err) { done(new Error('expected detach to return error response')); return; @@ -1553,7 +1514,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var subscriber = function (message) { expect(message.data).to.equal('message'); channel.unsubscribe(subscriber); - channel.detach(function (err) { + whenPromiseSettles(channel.detach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; diff --git a/test/realtime/connection.test.js b/test/realtime/connection.test.js index ca16073eeb..16f13c65ac 100644 --- a/test/realtime/connection.test.js +++ b/test/realtime/connection.test.js @@ -6,6 +6,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var createPM = Ably.Realtime.ProtocolMessage.fromDeserialized; var displayError = helper.displayError; var monitorConnection = helper.monitorConnection; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/connection', function () { this.timeout(60 * 1000); @@ -42,7 +43,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { realtime = helper.AblyRealtime(); realtime.connection.on('connected', function () { - realtime.connection.ping(function (err, responseTime) { + whenPromiseSettles(realtime.connection.ping(), function (err, responseTime) { if (err) { closeAndFinish(done, realtime, err); return; @@ -65,7 +66,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('connectionAttributes', function (done) { var realtime; try { - realtime = helper.AblyRealtime({ log: { level: 4 } }); + realtime = helper.AblyRealtime({ logLevel: 4 }); realtime.connection.on('connected', function () { try { const recoveryContext = JSON.parse(realtime.connection.recoveryKey); @@ -77,7 +78,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } var channel = realtime.channels.get('connectionattributes'); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -95,7 +96,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.publish('name', 'data', cb); + whenPromiseSettles(channel.publish('name', 'data'), cb); }, ], function (err) { @@ -172,7 +173,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async realtime.connection.once('connected', function () { var transport = connectionManager.activeProtocol.transport; - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -188,7 +189,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async [ function (cb) { /* Sabotaged publish */ - channel.publish('first', null, function (err) { + whenPromiseSettles(channel.publish('first', null), function (err) { try { expect(!err, 'Check publish happened (eventually) without err').to.be.ok; } catch (err) { @@ -282,31 +283,5 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); monitorConnection(done, realtime); }); - - if (typeof Promise !== 'undefined') { - describe('connection_promise', function () { - it('ping', function (done) { - var client = helper.AblyRealtime({ promises: true }); - - client.connection - .once('connected') - .then(function () { - client.connection - .ping() - .then(function (responseTime) { - expect(typeof responseTime).to.equal('number', 'check that a responseTime returned'); - expect(responseTime > 0, 'check that responseTime was positive').to.be.ok; - closeAndFinish(done, client); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }); - }); - } }); }); diff --git a/test/realtime/crypto.test.js b/test/realtime/crypto.test.js index 042699be23..8952bcf71e 100644 --- a/test/realtime/crypto.test.js +++ b/test/realtime/crypto.test.js @@ -11,12 +11,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var msgpack = typeof window == 'object' ? Ably.msgpack : require('@ably/msgpack-js'); var testOnAllTransports = helper.testOnAllTransports; var closeAndFinish = helper.closeAndFinish; + var whenPromiseSettles = helper.whenPromiseSettles; function attachChannels(channels, callback) { async.map( channels, function (channel, cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, callback ); @@ -34,7 +35,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } if (BufferUtils.isBuffer(one.data) && BufferUtils.isBuffer(two.data)) { - expect(BufferUtils.bufferCompare(one.data, two.data) === 0, 'Buffer data contents mismatch.').to.be.ok; + expect(BufferUtils.areBuffersEqual(one.data, two.data), 'Buffer data contents mismatch.').to.equal(true); return; } @@ -56,7 +57,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async return; } - loadTestData(testResourcesPath + filename, function (err, testData) { + loadTestData(testResourcesPath + filename, async function (err, testData) { if (err) { done(new Error('Unable to get test assets; err = ' + displayError(err))); return; @@ -71,11 +72,11 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var item = testData.items[i]; /* read messages from test data and decode (ie remove any base64 encoding). */ - var createTestMessage = function () { - return Message.fromEncoded(item.encoded); + var createTestMessage = async function () { + return await Message.fromEncoded(item.encoded); }; - var encryptedMessage = Message.fromEncoded(item.encrypted); + var encryptedMessage = await Message.fromEncoded(item.encrypted); var runTest = function (testMessage) { /* reset channel cipher, to ensure it uses the given iv */ @@ -84,13 +85,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }; // Run the test with the message’s data as-is. - runTest(createTestMessage()); + runTest(await createTestMessage()); if (testPlaintextVariants) { - var testMessage = createTestMessage(); + var testMessage = await createTestMessage(); if (BufferUtils.isBuffer(testMessage.data) && !(testMessage.data instanceof ArrayBuffer)) { // Now, check that we can also handle an ArrayBuffer plaintext. - var testMessageWithArrayBufferData = createTestMessage(); + var testMessageWithArrayBufferData = await createTestMessage(); testMessageWithArrayBufferData.data = BufferUtils.toArrayBuffer(testMessageWithArrayBufferData.data); runTest(testMessageWithArrayBufferData); } @@ -118,14 +119,14 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* generateRandomKey with an explicit keyLength */ it('generateRandomKey0', function (done) { - Crypto.generateRandomKey(64, function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(64), function (err, key) { if (err) { done(err); return; } try { - /* .length for a nodejs buffer, .sigbytes for a browser CryptoJS WordArray */ - expect(key.length || key.sigBytes).to.equal(8, 'generated key is the correct length'); + /* .length for a nodejs buffer, .byteLength for a browser ArrayBuffer */ + expect(key.length || key.byteLength).to.equal(8, 'generated key is the correct length'); done(); } catch (err) { done(err); @@ -135,13 +136,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* generateRandomKey with no keyLength should generate 256-bit keys */ it('generateRandomKey1', function (done) { - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { done(err); return; } try { - expect(key.length || key.sigBytes).to.equal(32, 'generated key is the default length'); + expect(key.length || key.byteLength).to.equal(32, 'generated key is the default length'); done(); } catch (err) { done(err); @@ -149,8 +150,8 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }); - it('getDefaultParams_wordArray_key', function (done) { - Crypto.generateRandomKey(function (err, key) { + it('getDefaultParams_withResultOfGenerateRandomKey', function (done) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { done(err); } @@ -167,14 +168,14 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); it('getDefaultParams_ArrayBuffer_key', function (done) { - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { done(err); } var arrayBufferKey = Ably.Realtime.Platform.BufferUtils.toArrayBuffer(key); var params = Crypto.getDefaultParams({ key: arrayBufferKey }); try { - expect(BufferUtils.bufferCompare(params.key, key)).to.equal(0); + expect(BufferUtils.areBuffersEqual(params.key, key)).to.equal(true); done(); } catch (err) { done(err); @@ -183,7 +184,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); it('getDefaultParams_base64_key', function (done) { - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { done(err); return; @@ -191,7 +192,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var b64key = Ably.Realtime.Platform.BufferUtils.base64Encode(key); var params = Crypto.getDefaultParams({ key: b64key }); try { - expect(BufferUtils.bufferCompare(params.key, key)).to.equal(0); + expect(BufferUtils.areBuffersEqual(params.key, key)).to.equal(true); done(); } catch (err) { done(err); @@ -200,7 +201,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); it('getDefaultParams_check_keylength', function (done) { - Crypto.generateRandomKey(64, function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(64), function (err, key) { if (err) { done(err); return; @@ -215,7 +216,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); it('getDefaultParams_preserves_custom_algorithms', function (done) { - Crypto.generateRandomKey(64, function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(64), function (err, key) { if (err) { done(err); return; @@ -274,9 +275,9 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async 'decrypt_message_128', 2, false, - function (channelOpts, testMessage, encryptedMessage) { + async function (channelOpts, testMessage, encryptedMessage) { /* decrypt encrypted message; decode() also to handle data that is not string or buffer */ - Message.decode(encryptedMessage, channelOpts); + await Message.decode(encryptedMessage, channelOpts); /* compare */ testMessageEquality(done, testMessage, encryptedMessage); } @@ -290,9 +291,9 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async 'decrypt_message_256', 2, false, - function (channelOpts, testMessage, encryptedMessage) { + async function (channelOpts, testMessage, encryptedMessage) { /* decrypt encrypted message; decode() also to handle data that is not string or buffer */ - Message.decode(encryptedMessage, channelOpts); + await Message.decode(encryptedMessage, channelOpts); /* compare */ testMessageEquality(done, testMessage, encryptedMessage); } @@ -305,7 +306,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async return; } - loadTestData(testResourcesPath + 'crypto-data-256.json', function (err, testData) { + loadTestData(testResourcesPath + 'crypto-data-256.json', async function (err, testData) { if (err) { done(err); return; @@ -315,8 +316,8 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async for (var i = 0; i < testData.items.length; i++) { var item = testData.items[i]; - var testMessage = Message.fromEncoded(item.encoded); - var decryptedMessage = Message.fromEncoded(item.encrypted, { cipher: { key: key, iv: iv } }); + var testMessage = await Message.fromEncoded(item.encoded); + var decryptedMessage = await Message.fromEncoded(item.encrypted, { cipher: { key: key, iv: iv } }); testMessageEquality(done, testMessage, decryptedMessage); } done(); @@ -342,10 +343,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { /* Mainly testing that we're correctly encoding the direct output from - * CryptoJS (a wordArray) into the msgpack binary type */ - expect(BufferUtils.bufferCompare(msgpackFromEncoded, msgpackFromEncrypted)).to.equal( - 0, - 'verify msgpack encodings of newly-encrypted and preencrypted messages identical using bufferCompare' + * the platform's ICipher implementation into the msgpack binary type */ + expect(BufferUtils.areBuffersEqual(msgpackFromEncoded, msgpackFromEncrypted)).to.equal( + true, + 'verify msgpack encodings of newly-encrypted and preencrypted messages identical using areBuffersEqual' ); /* Can't compare msgpackFromEncoded with fixture data because can't @@ -376,10 +377,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { /* Mainly testing that we're correctly encoding the direct output from - * CryptoJS (a wordArray) into the msgpack binary type */ - expect(BufferUtils.bufferCompare(msgpackFromEncoded, msgpackFromEncrypted)).to.equal( - 0, - 'verify msgpack encodings of newly-encrypted and preencrypted messages identical using bufferCompare' + * the platform's ICipher implementation into the msgpack binary type */ + expect(BufferUtils.areBuffersEqual(msgpackFromEncoded, msgpackFromEncrypted)).to.equal( + true, + 'verify msgpack encodings of newly-encrypted and preencrypted messages identical using areBuffersEqual' ); /* Can't compare msgpackFromEncoded with fixture data because can't @@ -400,7 +401,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async return; } - Crypto.generateRandomKey(keyLength, function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(keyLength), function (err, key) { if (err) { closeAndFinish(done, realtime, err); return; @@ -412,7 +413,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel = realtime.channels.get('single_send', { cipher: { key: key } }), messageText = 'Test message for single_send - ' + JSON.stringify(realtimeOpts); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -463,7 +464,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel = realtime.channels.get(channelName), messageText = 'Test message (' + channelName + ')'; - Crypto.generateRandomKey(128, function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(128), function (err, key) { channel.setOptions({ cipher: { key: key } }); try { expect(channel.channelOptions.cipher.algorithm).to.equal('aes'); @@ -533,7 +534,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async txChannel = txRealtime.channels.get(channelName), rxChannel = rxRealtime.channels.get(channelName); - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { closeAndFinish(done, realtime, err); return; @@ -607,7 +608,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channelName = 'publish_immediately', messageText = 'Test message'; - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { closeAndFinish(done, [txRealtime, rxRealtime], err); return; @@ -653,8 +654,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel( [ - Crypto.generateRandomKey, - Crypto.generateRandomKey, + function (cb) { + whenPromiseSettles(Crypto.generateRandomKey(), cb); + }, + function (cb) { + whenPromiseSettles(Crypto.generateRandomKey(), cb); + }, function (cb) { attachChannels([txChannel, rxChannel], cb); }, @@ -718,7 +723,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async closeAndFinish(done, [txRealtime, rxRealtime], err); return; } - Crypto.generateRandomKey(function (err, rxKey) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, rxKey) { if (err) { closeAndFinish(done, [txRealtime, rxRealtime], err); return; @@ -761,7 +766,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async closeAndFinish(done, [txRealtime, rxRealtime], err); return; } - Crypto.generateRandomKey(function (err, txKey) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, txKey) { if (err) { closeAndFinish(done, [txRealtime, rxRealtime], err); return; @@ -806,7 +811,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async attachChannels([txChannel, rxChannel], cb); }; var setInitialOptions = function (cb) { - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { closeAndFinish(done, [txRealtime, rxRealtime], err); return; @@ -839,7 +844,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }; var createSecondKey = function (cb) { - Crypto.generateRandomKey(function (err, key) { + whenPromiseSettles(Crypto.generateRandomKey(), function (err, key) { if (err) { closeAndFinish(done, [txRealtime, rxRealtime], err); return; diff --git a/test/realtime/delta.test.js b/test/realtime/delta.test.js index 9b42c428ee..006133c26d 100644 --- a/test/realtime/delta.test.js +++ b/test/realtime/delta.test.js @@ -5,6 +5,7 @@ define(['shared_helper', 'vcdiff-decoder', 'async', 'chai'], function (helper, v var displayError = helper.displayError; var closeAndFinish = helper.closeAndFinish; var monitorConnection = helper.monitorConnection; + var whenPromiseSettles = helper.whenPromiseSettles; var testData = [ { foo: 'bar', count: 1, status: 'active' }, { foo: 'bar', count: 2, status: 'active' }, @@ -50,7 +51,7 @@ define(['shared_helper', 'vcdiff-decoder', 'async', 'chai'], function (helper, v }); var channel = realtime.channels.get(testName, { params: { delta: 'vcdiff' } }); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } @@ -99,9 +100,9 @@ define(['shared_helper', 'vcdiff-decoder', 'async', 'chai'], function (helper, v }); var channel = realtime.channels.get(testName); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { - closeAndFinish(doner, realtime, err); + closeAndFinish(done, realtime, err); } channel.subscribe(function (message) { try { @@ -139,7 +140,7 @@ define(['shared_helper', 'vcdiff-decoder', 'async', 'chai'], function (helper, v }); var channel = realtime.channels.get(testName, { params: { delta: 'vcdiff' } }); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } @@ -207,7 +208,7 @@ define(['shared_helper', 'vcdiff-decoder', 'async', 'chai'], function (helper, v }); var channel = realtime.channels.get(testName, { params: { delta: 'vcdiff' } }); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } @@ -248,7 +249,7 @@ define(['shared_helper', 'vcdiff-decoder', 'async', 'chai'], function (helper, v var realtime = helper.AblyRealtime(); var channel = realtime.channels.get('noPlugin', { params: { delta: 'vcdiff' } }); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); } diff --git a/test/realtime/encoding.test.js b/test/realtime/encoding.test.js index 7c50152acb..f7c9e49c10 100644 --- a/test/realtime/encoding.test.js +++ b/test/realtime/encoding.test.js @@ -7,6 +7,8 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var displayError = helper.displayError; var encodingFixturesPath = helper.testResourcesPath + 'messages-encoding.json'; var closeAndFinish = helper.closeAndFinish; + var Defaults = Ably.Rest.Platform.Defaults; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/encoding', function () { this.timeout(60 * 1000); @@ -40,10 +42,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel( [ function (attachCb) { - channel.attach(attachCb); + whenPromiseSettles(channel.attach(), attachCb); }, function (attachCb) { - binarychannel.attach(attachCb); + whenPromiseSettles(binarychannel.attach(), attachCb); }, ], function (err) { @@ -95,12 +97,15 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (parallelCb) { - realtime.request( - 'post', - channelPath, - null, - { name: name, data: encodingSpec.data, encoding: encodingSpec.encoding }, - null, + whenPromiseSettles( + realtime.request( + 'post', + channelPath, + Defaults.protocolVersion, + null, + { name: name, data: encodingSpec.data, encoding: encodingSpec.encoding }, + null + ), function (err) { parallelCb(err); } @@ -138,10 +143,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel( [ function (attachCb) { - channel.attach(attachCb); + whenPromiseSettles(channel.attach(), attachCb); }, function (attachCb) { - binarychannel.attach(attachCb); + whenPromiseSettles(binarychannel.attach(), attachCb); }, ], function (err) { @@ -163,10 +168,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel( [ function (parallelCb) { - channel.publish(name, data, parallelCb); + whenPromiseSettles(channel.publish(name, data), parallelCb); }, function (parallelCb) { - binarychannel.publish(name, data, parallelCb); + whenPromiseSettles(binarychannel.publish(name, data), parallelCb); }, ], function (err) { @@ -174,39 +179,42 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async eachOfCb(err); return; } - realtime.request('get', channelPath, null, null, null, function (err, resultPage) { - if (err) { - eachOfCb(err); - return; - } - try { - var msgs = helper.arrFilter(resultPage.items, function (m) { - return m.name === name; - }); - expect(msgs.length).to.equal( - 2, - 'Check expected number of results (one from json rt, one from binary rt)' - ); - expect(msgs[0].encoding == encodingSpec.encoding, 'Check encodings match').to.be.ok; - expect(msgs[1].encoding == encodingSpec.encoding, 'Check encodings match').to.be.ok; - if (msgs[0].encoding === 'json') { - expect(JSON.parse(encodingSpec.data)).to.deep.equal( - JSON.parse(msgs[0].data), - 'Check data matches' - ); - expect(JSON.parse(encodingSpec.data)).to.deep.equal( - JSON.parse(msgs[1].data), - 'Check data matches' + whenPromiseSettles( + realtime.request('get', channelPath, Defaults.protocolVersion, null, null, null), + function (err, resultPage) { + if (err) { + eachOfCb(err); + return; + } + try { + var msgs = helper.arrFilter(resultPage.items, function (m) { + return m.name === name; + }); + expect(msgs.length).to.equal( + 2, + 'Check expected number of results (one from json rt, one from binary rt)' ); - } else { - expect(encodingSpec.data).to.equal(msgs[0].data, 'Check data matches'); - expect(encodingSpec.data).to.equal(msgs[1].data, 'Check data matches'); + expect(msgs[0].encoding == encodingSpec.encoding, 'Check encodings match').to.be.ok; + expect(msgs[1].encoding == encodingSpec.encoding, 'Check encodings match').to.be.ok; + if (msgs[0].encoding === 'json') { + expect(JSON.parse(encodingSpec.data)).to.deep.equal( + JSON.parse(msgs[0].data), + 'Check data matches' + ); + expect(JSON.parse(encodingSpec.data)).to.deep.equal( + JSON.parse(msgs[1].data), + 'Check data matches' + ); + } else { + expect(encodingSpec.data).to.equal(msgs[0].data, 'Check data matches'); + expect(encodingSpec.data).to.equal(msgs[1].data, 'Check data matches'); + } + eachOfCb(); + } catch (err) { + eachOfCb(err); } - eachOfCb(); - } catch (err) { - eachOfCb(err); } - }); + ); } ); }, diff --git a/test/realtime/event_emitter.test.js b/test/realtime/event_emitter.test.js index eeb2d91851..1fac46d249 100644 --- a/test/realtime/event_emitter.test.js +++ b/test/realtime/event_emitter.test.js @@ -439,62 +439,60 @@ define(['shared_helper', 'chai'], function (helper, chai) { closeAndFinish(done, realtime); }); - if (typeof Promise !== 'undefined') { - describe('event_emitter_promise', function () { - it('whenState', function (done) { - var realtime = helper.AblyRealtime({ promises: true }); - var eventEmitter = realtime.connection; - - eventEmitter - .whenState('connected') - .then(function () { - closeAndFinish(done, realtime); - }) - ['catch'](function (err) { - closeAndFinish(done, realtime, err); - }); - }); - - it('once', function (done) { - var realtime = helper.AblyRealtime({ promises: true }); - var eventEmitter = realtime.connection; - - eventEmitter - .once('connected') - .then(function () { - closeAndFinish(done, realtime); - }) - ['catch'](function (err) { - closeAndFinish(done, realtime, err); - }); - }); - - it('anyEventsWithOnce', function (done) { - var realtime = helper.AblyRealtime({ autoConnect: false }), - eventEmitter = realtime.connection; - - const p = eventEmitter.once(); - eventEmitter.emit('b'); - p.then(function () { + describe('event_emitter_promise', function () { + it('whenState', function (done) { + var realtime = helper.AblyRealtime(); + var eventEmitter = realtime.connection; + + eventEmitter + .whenState('connected') + .then(function () { closeAndFinish(done, realtime); - }).catch(function (err) { + }) + ['catch'](function (err) { closeAndFinish(done, realtime, err); }); - }); + }); - it('arrayOfEventsWithOnce', function (done) { - var realtime = helper.AblyRealtime({ autoConnect: false }), - eventEmitter = realtime.connection; + it('once', function (done) { + var realtime = helper.AblyRealtime(); + var eventEmitter = realtime.connection; - const p = eventEmitter.once(['a', 'b', 'c']); - eventEmitter.emit('b'); - p.then(function () { + eventEmitter + .once('connected') + .then(function () { closeAndFinish(done, realtime); - }).catch(function (err) { + }) + ['catch'](function (err) { closeAndFinish(done, realtime, err); }); + }); + + it('anyEventsWithOnce', function (done) { + var realtime = helper.AblyRealtime({ autoConnect: false }), + eventEmitter = realtime.connection; + + const p = eventEmitter.once(); + eventEmitter.emit('b'); + p.then(function () { + closeAndFinish(done, realtime); + }).catch(function (err) { + closeAndFinish(done, realtime, err); + }); + }); + + it('arrayOfEventsWithOnce', function (done) { + var realtime = helper.AblyRealtime({ autoConnect: false }), + eventEmitter = realtime.connection; + + const p = eventEmitter.once(['a', 'b', 'c']); + eventEmitter.emit('b'); + p.then(function () { + closeAndFinish(done, realtime); + }).catch(function (err) { + closeAndFinish(done, realtime, err); }); }); - } + }); }); }); diff --git a/test/realtime/failure.test.js b/test/realtime/failure.test.js index d3906ca705..61256cdce3 100644 --- a/test/realtime/failure.test.js +++ b/test/realtime/failure.test.js @@ -8,6 +8,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var simulateDroppedConnection = helper.simulateDroppedConnection; var createPM = Ably.Realtime.ProtocolMessage.fromDeserialized; var availableTransports = helper.availableTransports; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/failure', function () { this.timeout(60 * 1000); @@ -239,7 +240,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var tests = [ function (callback) { - failChan.publish('event', 'data', function (err) { + whenPromiseSettles(failChan.publish('event', 'data'), function (err) { try { expect(err, 'publish failed').to.be.ok; expect(err.code).to.equal(channelFailedCode, 'publish failure code'); @@ -261,7 +262,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (callback) { - failChan.presence.enterClient('clientId', function (err) { + whenPromiseSettles(failChan.presence.enterClient('clientId'), function (err) { try { expect(err, 'presence enter failed').to.be.ok; expect(err.code).to.equal(channelFailedCode, 'presence enter failure code'); @@ -272,7 +273,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (callback) { - failChan.presence.leaveClient('clientId', function (err) { + whenPromiseSettles(failChan.presence.leaveClient('clientId'), function (err) { try { expect(err, 'presence leave failed').to.be.ok; expect(err.code).to.equal(channelFailedCode, 'presence leave failure code'); @@ -305,7 +306,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (callback) { - failChan.presence.get(function (err) { + whenPromiseSettles(failChan.presence.get(), function (err) { try { expect(err, 'presence get failed').to.be.ok; expect(err.code).to.equal(channelFailedCode, 'presence get failure code'); @@ -320,7 +321,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async try { realtime.connection.once('connected', function () { failChan = realtime.channels.get('::'); - failChan.attach(function (err) { + whenPromiseSettles(failChan.attach(), function (err) { try { expect(err, 'channel attach failed').to.be.ok; expect(failChan.state).to.equal('failed', 'channel in failed state'); @@ -341,17 +342,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async it('attach_timeout', function (done) { var realtime = helper.AblyRealtime({ realtimeRequestTimeout: 2000, channelRetryTimeout: 1000 }), channel = realtime.channels.get('failed_attach'), - originalOnMessage = channel.onMessage.bind(channel); + originalProcessMessage = channel.processMessage.bind(channel); - channel.onMessage = function (message) { + channel.processMessage = async function (message) { if (message.action === 11) { return; } - originalOnMessage(message); + await originalProcessMessage(message); }; realtime.connection.once('connected', function () { - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { try { expect(err.code).to.equal(90007, 'check channel error code'); expect(err.statusCode).to.equal(408, 'check timeout statusCode'); @@ -380,24 +381,24 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async transports: [transport], }), channel = realtime.channels.get('failed_attach'), - originalOnMessage = channel.onMessage.bind(channel), + originalProcessMessage = channel.processMessage.bind(channel), retryCount = 0; var performance = isBrowser ? window.performance : require('perf_hooks').performance; - channel.onMessage = function (message) { + channel.processMessage = async function (message) { // Ignore ATTACHED messages if (message.action === 11) { return; } - originalOnMessage(message); + await originalProcessMessage(message); }; var retryTimeouts = []; realtime.connection.on('connected', function () { realtime.options.timeouts.realtimeRequestTimeout = 1; - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { var lastSuspended = performance.now(); channel.on(function (stateChange) { @@ -453,7 +454,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { var transport = realtime.connection.connectionManager.activeProtocol.transport, @@ -465,7 +466,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async originalOnProtocolMessage.apply(this, arguments); } }; - channel.publish('foo', 'bar', function (err) { + whenPromiseSettles(channel.publish('foo', 'bar'), function (err) { try { expect(err, 'Publish failed as expected').to.be.ok; expect(realtime.connection.state).to.equal( diff --git a/test/realtime/history.test.js b/test/realtime/history.test.js index 1017749c00..a32ad2c72a 100644 --- a/test/realtime/history.test.js +++ b/test/realtime/history.test.js @@ -11,11 +11,12 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); var closeAndFinish = helper.closeAndFinish; var monitorConnection = helper.monitorConnection; + var whenPromiseSettles = helper.whenPromiseSettles; var parallelPublishMessages = function (done, channel, messages, callback) { var publishTasks = utils.arrMap(messages, function (event) { return function (publishCb) { - channel.publish(event.name, event.data, publishCb); + whenPromiseSettles(channel.publish(event.name, event.data), publishCb); }; }); @@ -56,7 +57,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { try { realtime.connection.whenState('connected', function () { var rtChannel = realtime.channels.get('persisted:history_until_attach'); - rtChannel.attach(function (err) { + whenPromiseSettles(rtChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -72,7 +73,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { var tests = [ function (callback) { - rtChannel.history(function (err, resultPage) { + whenPromiseSettles(rtChannel.history(), function (err, resultPage) { if (err) { callback(err); } @@ -89,7 +90,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); }, function (callback) { - rtChannel.history({ untilAttach: false }, function (err, resultPage) { + whenPromiseSettles(rtChannel.history({ untilAttach: false }), function (err, resultPage) { if (err) { callback(err); } @@ -106,7 +107,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); }, function (callback) { - rtChannel.history({ untilAttach: true }, function (err, resultPage) { + whenPromiseSettles(rtChannel.history({ untilAttach: true }), function (err, resultPage) { if (err) { callback(err); } diff --git a/test/realtime/init.test.js b/test/realtime/init.test.js index cc3557b1ce..f617628641 100644 --- a/test/realtime/init.test.js +++ b/test/realtime/init.test.js @@ -4,6 +4,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var expect = chai.expect; var closeAndFinish = helper.closeAndFinish; var monitorConnection = helper.monitorConnection; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/init', function () { this.timeout(60 * 1000); @@ -75,7 +76,7 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var rest = helper.AblyRest(); var testKeyOpts = { key: helper.getTestApp().keys[1].keyStr }; - rest.auth.requestToken(null, testKeyOpts, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(null, testKeyOpts), function (err, tokenDetails) { if (err) { done(err); return; @@ -155,7 +156,11 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var realtime; try { var keyStr = helper.getTestApp().keys[0].keyStr; - realtime = helper.AblyRealtime({ key: keyStr, useTokenAuth: true, defaultTokenParams: { clientId: 'test' } }); + realtime = helper.AblyRealtime({ + key: keyStr, + useTokenAuth: true, + defaultTokenParams: { clientId: 'test' }, + }); expect(realtime.auth.clientId).to.equal(undefined); realtime.connection.on('connected', function () { try { @@ -404,34 +409,5 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { closeAndFinish(done, realtime); }); }); - - if (typeof Promise === 'undefined') { - it('init_callbacks_promises', function (done) { - try { - var realtime, - keyStr = helper.getTestApp().keys[0].keyStr, - getOptions = function () { - return { key: keyStr, autoConnect: false }; - }; - - realtime = new Ably.Realtime(getOptions()); - expect(!realtime.options.promises, 'Check promises defaults to false').to.be.ok; - - realtime = new Ably.Realtime.Promise(getOptions()); - expect(realtime.options.promises, 'Check promises default to true with promise constructor').to.be.ok; - - if (!isBrowser && typeof require == 'function') { - realtime = new require('../../promises').Realtime(getOptions()); - expect(realtime.options.promises, 'Check promises default to true with promise require target').to.be.ok; - - realtime = new require('../../callbacks').Realtime(getOptions()); - expect(!realtime.options.promises, 'Check promises default to false with callback require target').to.be.ok; - } - done(); - } catch (err) { - done(err); - } - }); - } }); }); diff --git a/test/realtime/message.test.js b/test/realtime/message.test.js index 84e63d2135..bcc4aa9128 100644 --- a/test/realtime/message.test.js +++ b/test/realtime/message.test.js @@ -9,10 +9,11 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var createPM = Ably.Realtime.ProtocolMessage.fromDeserialized; var monitorConnection = helper.monitorConnection; var testOnAllTransports = helper.testOnAllTransports; + var whenPromiseSettles = helper.whenPromiseSettles; var publishIntervalHelper = function (currentMessageNum, channel, dataFn, onPublish) { return function () { - channel.publish('event0', dataFn(), function () { + whenPromiseSettles(channel.publish('event0', dataFn()), function () { onPublish(); }); }; @@ -45,7 +46,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async realtime.connection.on('connected', function () { var testMsg = 'Hello world'; var rtChannel = realtime.channels.get('publishonce'); - rtChannel.attach(function (err) { + whenPromiseSettles(rtChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -82,7 +83,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(realtimeOpts); realtime.connection.once('connected', function () { var channel = realtime.channels.get('publishfast_' + String(Math.random()).substr(2)); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -100,7 +101,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async function (cb) { var ackd = 0; var publish = function (i) { - channel.publish('event', i.toString(), function (err) { + whenPromiseSettles(channel.publish('event', i.toString()), function (err) { try { expect( !err, @@ -156,7 +157,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - rxChannel.attach(function (err) { + whenPromiseSettles(rxChannel.attach(), function (err) { cb(err); }); }, @@ -180,7 +181,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async function (parCb) { var ackd = 0; var publish = function (i) { - txChannel.publish('event', { num: i }, function (err) { + whenPromiseSettles(txChannel.publish('event', { num: i }), function (err) { try { expect( !err, @@ -259,7 +260,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }; // attach rtNoEchoChannel - rtNoEchoChannel.attach(function (err) { + whenPromiseSettles(rtNoEchoChannel.attach(), function (err) { try { expect(!err, 'Attached to rtNoEchoChannel with no error').to.be.ok; } catch (err) { @@ -275,7 +276,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); // attach rtEchoChannel - rtEchoChannel.attach(function (err) { + whenPromiseSettles(rtEchoChannel.attach(), function (err) { try { expect(!err, 'Attached to rtEchoChannel with no error').to.be.ok; } catch (err) { @@ -291,7 +292,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); // publish testMsg1 via rtNoEcho - rtNoEchoChannel.publish('event0', testMsg1, function () { + whenPromiseSettles(rtNoEchoChannel.publish('event0', testMsg1), function () { // publish testMsg2 via rtEcho rtEchoChannel.publish('event0', testMsg2); }); @@ -328,7 +329,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* connect and attach */ realtime.connection.on('connected', function () { var rtChannel = realtime.channels.get('publishVariations'); - rtChannel.attach(function (err) { + whenPromiseSettles(rtChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -434,28 +435,31 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* connect and attach */ realtime.connection.on('connected', function () { var rtChannel = realtime.channels.get('publishDisallowed'); - rtChannel.attach(function (err) { + whenPromiseSettles(rtChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; } - /* publish events */ - var restChannel = rest.channels.get('publishDisallowed'); - for (var i = 0; i < testArguments.length; i++) { - try { - restChannel.publish.apply(restChannel, testArguments[i]); - closeAndFinish(done, realtime, new Error('Exception was not raised')); - } catch (err) { + (async function () { + /* publish events */ + var restChannel = rest.channels.get('publishDisallowed'); + for (var i = 0; i < testArguments.length; i++) { try { - expect(err.code).to.equal(40013, 'Invalid data type exception raised'); + await restChannel.publish.apply(restChannel, testArguments[i]); + closeAndFinish(done, realtime, new Error('Exception was not raised')); } catch (err) { - closeAndFinish(done, realtime, err); - return; + try { + expect(err.code).to.equal(40013, 'Invalid data type exception raised'); + } catch (err) { + closeAndFinish(done, realtime, err); + return; + } } } - } - closeAndFinish(done, realtime); + })().then(() => { + closeAndFinish(done, realtime); + }); }); }); monitorConnection(done, realtime); @@ -485,7 +489,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* connect and attach */ realtime.connection.on('connected', function () { var rtChannel = realtime.channels.get('publishEncodings'); - rtChannel.attach(function (err) { + whenPromiseSettles(rtChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -532,7 +536,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async testArguments, function iterator(item, callback) { try { - restChannel.publish(item, function (err) { + whenPromiseSettles(restChannel.publish(item), function (err) { try { expect(!err, 'Successfully published').to.be.ok; } catch (err) { @@ -682,7 +686,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channel = realtime.channels.get('explicit_client_id_0'); /* subscribe to event */ - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { try { expect(!err, err && helper.displayError(err)).to.be.ok; @@ -706,7 +710,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.publish({ name: 'event0', clientId: clientId }, function (err) { + whenPromiseSettles(channel.publish({ name: 'event0', clientId: clientId }), function (err) { cb(err); }); }, @@ -726,7 +730,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async invalidClientId = 'invalid', rest = helper.AblyRest(); - rest.auth.requestToken({ clientId: clientId }, function (err, token) { + whenPromiseSettles(rest.auth.requestToken({ clientId: clientId }), function (err, token) { if (err) { done(err); return; @@ -743,7 +747,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel = realtime.channels.get('explicit_client_id_1'); // Publish before authentication to ensure the client library does not reject the message as the clientId is not known - channel.publish({ name: 'event0', clientId: invalidClientId }, function (err) { + whenPromiseSettles(channel.publish({ name: 'event0', clientId: invalidClientId }), function (err) { try { expect(err, 'Message was not published').to.be.ok; } catch (err) { @@ -790,7 +794,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { cb(err); }); }, @@ -816,9 +820,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (innercb) { - channel.publish([{ name: 'a' }, { name: 'b' }, { name: 'c' }, { name: 'd' }], function (err) { - innercb(err); - }); + whenPromiseSettles( + channel.publish([{ name: 'a' }, { name: 'b' }, { name: 'c' }, { name: 'd' }]), + function (err) { + innercb(err); + } + ); }, ], outercb @@ -836,8 +843,8 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async const channel = realtime.channels.get('subscribe_with_filter_object'); function send(cb) { - channel.publish( - [ + whenPromiseSettles( + channel.publish([ { name: 'correct', extras: { @@ -868,7 +875,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }, }, }, - ], + ]), cb ); } @@ -899,7 +906,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - return channel.attach(cb); + return whenPromiseSettles(channel.attach(), cb); }, function (cb) { return async.parallel([subscribe, send], cb); @@ -916,8 +923,8 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async const channel = realtime.channels.get('unsubscribe_with_filter_object'); function send(cb) { - channel.publish( - [ + whenPromiseSettles( + channel.publish([ { name: 'incorrect', extras: { @@ -927,7 +934,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }, }, }, - ], + ]), cb ); } @@ -958,7 +965,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - return channel.attach(cb); + return whenPromiseSettles(channel.attach(), cb); }, unsubscribe, send, @@ -981,7 +988,9 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async cb(); }); }, - channel.attach.bind(channel), + function (cb) { + whenPromiseSettles(channel.attach(), cb); + }, function (outercb) { async.parallel( [ @@ -998,7 +1007,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (innercb) { - channel.publish([{ name: 'a', extras: extras }], innercb); + whenPromiseSettles(channel.publish([{ name: 'a', extras: extras }]), innercb); }, ], outercb @@ -1019,16 +1028,19 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async realtime.connection.once('connected', function () { connectionManager.once('connectiondetails', function (details) { - channel.publish('foo', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', function (err) { - try { - expect(err, 'Check publish refused').to.be.ok; - expect(err.code).to.equal(40009); - } catch (err) { - closeAndFinish(done, realtime, err); - return; + whenPromiseSettles( + channel.publish('foo', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), + function (err) { + try { + expect(err, 'Check publish refused').to.be.ok; + expect(err.code).to.equal(40009); + } catch (err) { + closeAndFinish(done, realtime, err); + return; + } + closeAndFinish(done, realtime); } - closeAndFinish(done, realtime); - }); + ); }); var connectionDetails = connectionManager.connectionDetails; connectionDetails.maxMessageSize = 64; @@ -1109,7 +1121,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var realtime = helper.AblyRealtime(), channel = realtime.channels.get('idempotentRealtimePublishing'); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -1139,51 +1151,6 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }); - if (typeof Promise !== 'undefined') { - it('publishpromise', function (done) { - var realtime = helper.AblyRealtime({ promises: true }); - var channel = realtime.channels.get('publishpromise'); - - var publishPromise = realtime.connection - .once('connected') - .then(function (connectionStateChange) { - expect(connectionStateChange.current).to.equal( - 'connected', - 'Check promise is resolved with a connectionStateChange' - ); - return channel.attach(); - }) - .then(function () { - return channel.publish('name', 'data'); - }) - ['catch'](function (err) { - closeAndFinish(done, realtime, err); - }); - - var subscribePromise; - var messagePromise = new Promise(function (msgResolve) { - subscribePromise = channel.subscribe('name', function (msg) { - msgResolve(); - }); - }); - - var channelFailedPromise = realtime.channels - .get(':invalid') - .attach() - ['catch'](function (err) { - expect(err.code).to.equal(40010, 'Check err passed through correctly'); - }); - - Promise.all([publishPromise, subscribePromise, messagePromise, channelFailedPromise]) - .then(function () { - closeAndFinish(done, realtime); - }) - ['catch'](function (err) { - closeAndFinish(done, realtime, err); - }); - }); - } - it('subscribes to filtered channel', function (done) { var testData = [ { @@ -1249,7 +1216,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var filteredMessages = []; var unFilteredMessages = []; /* subscribe to event */ - rtFilteredChannel.attach(function (err) { + whenPromiseSettles(rtFilteredChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -1264,7 +1231,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } }); - rtUnfilteredChannel.attach(function (err) { + whenPromiseSettles(rtUnfilteredChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; diff --git a/test/realtime/presence.test.js b/test/realtime/presence.test.js index 948e1acded..6c2f11dcae 100644 --- a/test/realtime/presence.test.js +++ b/test/realtime/presence.test.js @@ -7,6 +7,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var closeAndFinish = helper.closeAndFinish; var monitorConnection = helper.monitorConnection; var PresenceMessage = Ably.Realtime.PresenceMessage; + var whenPromiseSettles = helper.whenPromiseSettles; function extractClientIds(presenceSet) { return utils @@ -32,7 +33,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async realtime = helper.AblyRealtime(); realtime.connection.on('connected', function () { channel = realtime.channels.get(channelName); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { callback(err, realtime, channel); }); }); @@ -102,7 +103,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async // Create authTokens associated with specific clientIds try { rest = helper.AblyRest(); - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId }), function (err, tokenDetails) { if (err) { done(err); return; @@ -115,7 +116,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async return; } - rest.auth.requestToken({ clientId: testClientId2 }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId2 }), function (err, tokenDetails) { if (err) { done(err); return; @@ -147,12 +148,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter('Test client data (enter0)', function (err) { + whenPromiseSettles(clientChannel.presence.enter('Test client data (enter0)'), function (err) { cb(err, clientRealtime); }); }); @@ -173,7 +174,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.presence.enter('Test client data (enterWithoutAttach)', function (err) { + whenPromiseSettles(clientChannel.presence.enter('Test client data (enterWithoutAttach)'), function (err) { cb(err, clientRealtime); }); }); @@ -191,7 +192,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var enterWithoutConnect = function (cb) { var clientRealtime = helper.AblyRealtime({ clientId: testClientId, tokenDetails: authToken }); var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.presence.enter('Test client data (enterWithoutConnect)', function (err) { + whenPromiseSettles(clientChannel.presence.enter('Test client data (enterWithoutConnect)'), function (err) { cb(err, clientRealtime); }); monitorConnection(done, clientRealtime); @@ -231,19 +232,19 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { closeAndFinish(done, [listenerRealtime, clientRealtime], err); return; } - clientChannel.detach(function (err) { + whenPromiseSettles(clientChannel.detach(), function (err) { if (err) { closeAndFinish(done, [listenerRealtime, clientRealtime], err); return; } }); }); - clientChannel.presence.enter('Test client data (enter3)', function (err) { + whenPromiseSettles(clientChannel.presence.enter('Test client data (enter3)'), function (err) { // Note: either an error (pending messages failed to send due to detach) // or a success (pending messages were pushed out before the detach) // is an acceptable result. Throwing an uncaught exception (the behaviour @@ -275,12 +276,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter(function (err) { + whenPromiseSettles(clientChannel.presence.enter(), function (err) { cb(err, clientRealtime); }); }); @@ -301,7 +302,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; @@ -326,7 +327,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; @@ -384,7 +385,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.series( [ function (cb) { - clientChannel.attach(cb); + whenPromiseSettles(clientChannel.attach(), cb); }, // Test entering with extras function (cb) { @@ -461,17 +462,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); // NB remove besttransport in 1.1 spec, see attachdetach0 var clientChannel = clientRealtime.channels.get(channelName); clientRealtime.connection.once('connected', function () { - clientChannel.presence.enter('first', function (err) { + whenPromiseSettles(clientChannel.presence.enter('first'), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.detach(function (err) { + whenPromiseSettles(clientChannel.detach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter('second', function (err) { + whenPromiseSettles(clientChannel.presence.enter('second'), function (err) { cb(err, clientRealtime); }); }); @@ -492,7 +493,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime = helper.AblyRealtime({ clientId: testClientId, tokenDetails: authToken }); var clientChannel = clientRealtime.channels.get(''); clientRealtime.connection.once('connected', function () { - clientChannel.presence.enter('clientId', function (err) { + whenPromiseSettles(clientChannel.presence.enter('clientId'), function (err) { if (err) { try { expect(err.code).to.equal(40010, 'Correct error code'); @@ -522,18 +523,18 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter('Test client data (leave0)', function (err) { + whenPromiseSettles(clientChannel.presence.enter('Test client data (leave0)'), function (err) { if (err) { cb(err, clientRealtime); return; } }); - clientChannel.presence.leave(function (err) { + whenPromiseSettles(clientChannel.presence.leave(), function (err) { cb(err, clientRealtime); }); }); @@ -570,17 +571,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientRealtime = helper.AblyRealtime({ clientId: testClientId, tokenDetails: authToken }); clientRealtime.connection.on('connected', function () { var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter('Original data', function (err) { + whenPromiseSettles(clientChannel.presence.enter('Original data'), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.update(newData, function (err) { + whenPromiseSettles(clientChannel.presence.update(newData), function (err) { cb(err, clientRealtime); }); }); @@ -601,7 +602,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var eventListener = function (channel, callback) { var presenceHandler = function () { /* Should be ENTER, but may be PRESENT in a race */ - channel.presence.get(function (err, presenceMembers) { + whenPromiseSettles(channel.presence.get(), function (err, presenceMembers) { if (err) { callback(err); return; @@ -624,12 +625,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter(testData, function (err) { + whenPromiseSettles(clientChannel.presence.enter(testData), function (err) { cb(err, clientRealtime); }); }); @@ -678,7 +679,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.presence.enter(testData, function (err) { + whenPromiseSettles(clientChannel.presence.enter(testData), function (err) { if (err) { closeAndFinish(done, clientRealtime, err); return; @@ -687,7 +688,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime2.connection.on('connected', function () { var clientChannel2 = clientRealtime2.channels.get(channelName); /* GET without attaching */ - clientChannel2.presence.get(function (err, presenceMembers) { + whenPromiseSettles(clientChannel2.presence.get(), function (err, presenceMembers) { if (err) { closeAndFinish(done, [clientRealtime, clientRealtime2], err); return; @@ -718,7 +719,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var presenceHandler = function () { // Ignore the first (enter) event if (this.event == 'leave') { - channel.presence.get(function (err, presenceMembers) { + whenPromiseSettles(channel.presence.get(), function (err, presenceMembers) { if (err) { callback(err); return; @@ -741,17 +742,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.enter('testClientData', function (err) { + whenPromiseSettles(clientChannel.presence.enter('testClientData'), function (err) { if (err) { cb(err, clientRealtime); return; } - clientChannel.presence.leave(function (err) { + whenPromiseSettles(clientChannel.presence.leave(), function (err) { cb(err, clientRealtime); }); }); @@ -771,7 +772,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelName = 'history'; var testClientData = 'Test client data (history0)'; var queryPresenceHistory = function (channel) { - channel.presence.history(function (err, resultPage) { + whenPromiseSettles(channel.presence.history(), function (err, resultPage) { if (err) { closeAndFinish(done, clientRealtime, err); return; @@ -798,22 +799,22 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { + whenPromiseSettles(clientChannel.attach(), function (err) { if (err) { closeAndFinish(done, clientRealtime, err); return; } - clientChannel.presence.enter(testClientData, function (err) { + whenPromiseSettles(clientChannel.presence.enter(testClientData), function (err) { if (err) { closeAndFinish(done, clientRealtime, err); return; } - clientChannel.presence.leave(function (err) { + whenPromiseSettles(clientChannel.presence.leave(), function (err) { if (err) { closeAndFinish(done, clientRealtime, err); return; } - clientChannel.detach(function (err) { + whenPromiseSettles(clientChannel.detach(), function (err) { if (err) { closeAndFinish(done, clientRealtime, err); return; @@ -847,19 +848,19 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime1.connection.on('connected', function () { /* get channel, attach, and enter */ var clientChannel1 = clientRealtime1.channels.get(channelName); - clientChannel1.attach(function (err) { + whenPromiseSettles(clientChannel1.attach(), function (err) { if (err) { closeAndFinish(done, clientRealtime1, err); return; } - clientChannel1.presence.enter('Test client data (attach0)', function (err) { + whenPromiseSettles(clientChannel1.presence.enter('Test client data (attach0)'), function (err) { if (err) { closeAndFinish(done, clientRealtime1, err); return; } }); clientChannel1.presence.subscribe('enter', function () { - clientChannel1.presence.get(function (err, presenceMembers1) { + whenPromiseSettles(clientChannel1.presence.get(), function (err, presenceMembers1) { if (err) { closeAndFinish(done, clientRealtime1, err); return; @@ -876,14 +877,14 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime2.connection.on('connected', function () { /* get channel, attach */ var clientChannel2 = clientRealtime2.channels.get(channelName); - clientChannel2.attach(function (err) { + whenPromiseSettles(clientChannel2.attach(), function (err) { if (err) { closeAndFinish(done, [clientRealtime1, clientRealtime2], err); return; } clientChannel2.presence.subscribe('present', function () { /* get the channel members and verify testclient is there */ - clientChannel2.presence.get(function (err, presenceMembers2) { + whenPromiseSettles(clientChannel2.presence.get(), function (err, presenceMembers2) { if (err) { closeAndFinish(done, [clientRealtime1, clientRealtime2], err); return; @@ -931,12 +932,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime1.connection.on('connected', function () { /* get channel, attach, and enter */ clientChannel1 = clientRealtime1.channels.get(channelName); - clientChannel1.attach(function (err) { + whenPromiseSettles(clientChannel1.attach(), function (err) { if (err) { cb1(err); return; } - clientChannel1.presence.enter(data, function (err) { + whenPromiseSettles(clientChannel1.presence.enter(data), function (err) { if (err) { cb1(err); return; @@ -953,13 +954,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime2.connection.on('connected', function () { /* get channel, attach */ clientChannel2 = clientRealtime2.channels.get(channelName); - clientChannel2.attach(function (err) { + whenPromiseSettles(clientChannel2.attach(), function (err) { if (err) { cb2(err); return; } var enterPresence = function (onEnterCB) { - clientChannel2.presence.enter(data, function (err) { + whenPromiseSettles(clientChannel2.presence.enter(data), function (err) { if (err) { cb2(err); return; @@ -1003,7 +1004,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async [ /* First test: no filters */ function (cb) { - clientChannel2.presence.get(function (err, members) { + whenPromiseSettles(clientChannel2.presence.get(), function (err, members) { if (err) { return cb(err); } @@ -1022,7 +1023,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }, /* Second test: filter by clientId */ function (cb) { - clientChannel2.presence.get({ clientId: testClientId }, function (err, members) { + whenPromiseSettles(clientChannel2.presence.get({ clientId: testClientId }), function (err, members) { if (err) { return cb(err); } @@ -1038,25 +1039,28 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }, /* Third test: filter by connectionId */ function (cb) { - clientChannel2.presence.get({ connectionId: clientRealtime1.connection.id }, function (err, members) { - if (err) { - return cb(err); - } - try { - expect(members.length).to.equal( - 1, - 'Verify only one member present when filtered by connectionId' - ); - expect(members[0].connectionId).to.equal( - clientRealtime1.connection.id, - 'Verify connectionId filter works' - ); - } catch (err) { - cb(err); - return; + whenPromiseSettles( + clientChannel2.presence.get({ connectionId: clientRealtime1.connection.id }), + function (err, members) { + if (err) { + return cb(err); + } + try { + expect(members.length).to.equal( + 1, + 'Verify only one member present when filtered by connectionId' + ); + expect(members[0].connectionId).to.equal( + clientRealtime1.connection.id, + 'Verify connectionId filter works' + ); + } catch (err) { + cb(err); + return; + } + cb(); } - cb(); - }); + ); }, ], function (err) { @@ -1094,7 +1098,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientChannel = clientRealtime.channels.get(channelName); clientRealtime.connection.once('connected', function () { /* get channel and enter (should automatically attach) */ - clientChannel.presence.enter('first', function (err) { + whenPromiseSettles(clientChannel.presence.enter('first'), function (err) { if (err) { cb(err, clientRealtime); return; @@ -1103,7 +1107,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async clientRealtime.connection.whenState('closed', function () { clientRealtime.connection.once('connected', function () { //Should automatically reattach - clientChannel.presence.enter('second', function (err) { + whenPromiseSettles(clientChannel.presence.enter('second'), function (err) { cb(err, clientRealtime); }); }); @@ -1128,7 +1132,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var clientChannel = clientRealtime.channels.get(channelName); clientRealtime.connection.on('connected', function () { clientRealtime.close(); - clientChannel.presence.enterClient('clientId', function (err) { + whenPromiseSettles(clientChannel.presence.enterClient('clientId'), function (err) { try { expect(err.code).to.equal(80017, 'presence enter failed with correct code'); expect(err.statusCode).to.equal(400, 'presence enter failed with correct statusCode'); @@ -1166,17 +1170,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async originalSendPresence.apply(channel, arguments); }; - presence.enter(null, function (err) { + whenPromiseSettles(presence.enter(null), function (err) { if (err) { closeAndFinish(done, client, err); return; } - presence.update(null, function (err) { + whenPromiseSettles(presence.update(null), function (err) { if (err) { closeAndFinish(done, client, err); return; } - presence.leave(null, function (err) { + whenPromiseSettles(presence.leave(null), function (err) { if (err) { closeAndFinish(done, client, err); return; @@ -1187,39 +1191,6 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }); - /* - * Check that old deprecated on/off methods still work - */ - it('presenceOn', function (done) { - var channelName = 'enterOn'; - var testData = 'some data'; - var eventListener = function (channel, callback) { - var presenceHandler = function () { - callback(); - }; - channel.presence.on(presenceHandler); - }; - var enterOn = function (cb) { - var clientRealtime = helper.AblyRealtime({ clientId: testClientId, tokenDetails: authToken }); - clientRealtime.connection.on('connected', function () { - /* get channel, attach, and enter */ - var clientChannel = clientRealtime.channels.get(channelName); - clientChannel.attach(function (err) { - if (err) { - cb(err, clientRealtime); - return; - } - clientChannel.presence.enter(testData, function (err) { - cb(err, clientRealtime); - }); - }); - }); - monitorConnection(done, clientRealtime); - }; - - runTestWithEventListener(done, channelName, eventListener, enterOn); - }); - /* * Check that encodable presence messages are encoded correctly */ @@ -1290,7 +1261,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelName = 'enter_inherited_clientid'; var authCallback = function (tokenParams, callback) { - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId }), function (err, tokenDetails) { if (err) { done(err); return; @@ -1309,7 +1280,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async cb(err); return; } - channel.presence.enter('test data', function (err) { + whenPromiseSettles(channel.presence.enter('test data'), function (err) { cb(err, realtime); }); }); @@ -1328,7 +1299,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var channelName = 'enter_before_know_clientid'; var enterInheritedClientId = function (cb) { - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken({ clientId: testClientId }), function (err, tokenDetails) { if (err) { done(err); return; @@ -1341,7 +1312,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async closeAndFinish(done, realtime, err); return; } - channel.presence.enter('test data', function (err) { + whenPromiseSettles(channel.presence.enter('test data'), function (err) { try { expect(realtime.auth.clientId).to.equal(testClientId, 'clientId has been set by the time we entered'); } catch (err) { @@ -1389,10 +1360,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel( [ function (enterCb) { - realtimeChannel.presence.enterClient('one', enterCb); + whenPromiseSettles(realtimeChannel.presence.enterClient('one'), enterCb); }, function (enterCb) { - realtimeChannel.presence.enterClient('two', enterCb); + whenPromiseSettles(realtimeChannel.presence.enterClient('two'), enterCb); }, ], cb @@ -1400,7 +1371,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } function checkPresence(first, second, cb) { - observerChannel.presence.get(function (err, presenceMembers) { + whenPromiseSettles(observerChannel.presence.get(), function (err, presenceMembers) { var clientIds = utils .arrMap(presenceMembers, function (msg) { return msg.clientId; @@ -1422,10 +1393,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel( [ function (innerCb) { - realtimeChannel.presence.leaveClient('two', innerCb); + whenPromiseSettles(realtimeChannel.presence.leaveClient('two'), innerCb); }, function (innerCb) { - realtimeChannel.presence.enterClient('three', innerCb); + whenPromiseSettles(realtimeChannel.presence.enterClient('three'), innerCb); }, ], cb @@ -1452,17 +1423,17 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async [ waitForBothConnect, function (cb) { - realtimeChannel.attach(cb); + whenPromiseSettles(realtimeChannel.attach(), cb); }, enterOneAndTwo, function (cb) { - observerChannel.attach(cb); + whenPromiseSettles(observerChannel.attach(), cb); }, function (cb) { checkPresence('one', 'two', cb); }, function (cb) { - observerChannel.detach(cb); + whenPromiseSettles(observerChannel.detach(), cb); }, swapTwoForThree, attachAndListen, @@ -1503,13 +1474,13 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async [ waitForBothConnect, function (cb) { - entererChannel.presence.enter(cb); + whenPromiseSettles(entererChannel.presence.enter(), cb); }, function (cb) { - detacherChannel.attach(cb); + whenPromiseSettles(detacherChannel.attach(), cb); }, function (cb) { - detacherChannel.detach(cb); + whenPromiseSettles(detacherChannel.detach(), cb); }, function (cb) { try { @@ -1545,7 +1516,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { if (!channel.presence.syncComplete) { @@ -1614,7 +1585,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.presence.get(function (err, results) { + whenPromiseSettles(channel.presence.get(), function (err, results) { if (err) { cb(err); return; @@ -1653,7 +1624,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* Request a token without the capabilities to be in the presence set */ var tokenParams = { clientId: 'me', capability: {} }; tokenParams.capability[channelName] = ['publish', 'subscribe']; - rest.auth.requestToken(tokenParams, function (err, tokenDetails) { + whenPromiseSettles(rest.auth.requestToken(tokenParams), function (err, tokenDetails) { token = tokenDetails; cb(err); }); @@ -1666,7 +1637,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { if (!channel.presence.syncComplete) { @@ -1676,7 +1647,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } }, function (cb) { - channel.presence.get(function (err, members) { + whenPromiseSettles(channel.presence.get(), function (err, members) { try { expect(members.length).to.equal(0, 'Check no-one in presence set'); } catch (err) { @@ -1718,7 +1689,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.presence.get(function (err, members) { + whenPromiseSettles(channel.presence.get(), function (err, members) { try { expect(members.length).to.equal(0, 'Check no-one in presence set'); } catch (err) { @@ -1769,7 +1740,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.presence.get(function (err, results) { + whenPromiseSettles(channel.presence.get(), function (err, results) { try { expect(results.length).to.equal(10, 'Check all ten clients are there'); } catch (err) { @@ -1808,10 +1779,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - continuousChannel.attach(cb); + whenPromiseSettles(continuousChannel.attach(), cb); }, function (cb) { - continuousChannel.presence.enter(cb); + whenPromiseSettles(continuousChannel.presence.enter(), cb); }, function (cb) { realtime.connection.whenState('connected', function () { @@ -1819,10 +1790,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { - channel.presence.get({ waitForSync: true }, function (err, members) { + whenPromiseSettles(channel.presence.get({ waitForSync: true }), function (err, members) { try { expect(members && members.length).to.equal(1, 'Check one member present'); } catch (err) { @@ -1834,19 +1805,28 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }, function (cb) { /* Inject an additional member locally */ - channel.onMessage({ - action: 14, - id: 'messageid:0', - connectionId: 'connid', - timestamp: utils.now(), - presence: [ - { - clientId: goneClientId, - action: 'enter', - }, - ], - }); - channel.presence.get(function (err, members) { + channel + .processMessage({ + action: 14, + id: 'messageid:0', + connectionId: 'connid', + timestamp: utils.now(), + presence: [ + { + clientId: goneClientId, + action: 'enter', + }, + ], + }) + .then(function () { + cb(null); + }) + .catch(function (err) { + cb(err); + }); + }, + function (cb) { + whenPromiseSettles(channel.presence.get(), function (err, members) { try { expect(members && members.length).to.equal(2, 'Check two members present'); } catch (err) { @@ -1871,7 +1851,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async channel.sync(); }, function (cb) { - channel.presence.get({ waitForSync: true }, function (err, members) { + whenPromiseSettles(channel.presence.get({ waitForSync: true }), function (err, members) { try { expect(members && members.length).to.equal(1, 'Check back to one member present'); expect(members && members[0] && members[0].clientId).to.equal( @@ -1910,23 +1890,32 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { /* Inject a member locally */ - channel.onMessage({ - action: 14, - id: 'messageid:0', - connectionId: 'connid', - timestamp: utils.now(), - presence: [ - { - clientId: fakeClientId, - action: 'enter', - }, - ], - }); - channel.presence.get(function (err, members) { + channel + .processMessage({ + action: 14, + id: 'messageid:0', + connectionId: 'connid', + timestamp: utils.now(), + presence: [ + { + clientId: fakeClientId, + action: 'enter', + }, + ], + }) + .then(function () { + cb(); + }) + .catch(function () { + cb(err); + }); + }, + function (cb) { + whenPromiseSettles(channel.presence.get(), function (err, members) { try { expect(members && members.length).to.equal(1, 'Check one member present'); } catch (err) { @@ -1948,7 +1937,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async cb(); }); /* Inject an ATTACHED with RESUMED and HAS_PRESENCE both false */ - channel.onMessage( + channel.processMessage( createPM({ action: 11, channelSerial: channel.properties.attachSerial, @@ -1957,7 +1946,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ); }, function (cb) { - channel.presence.get(function (err, members) { + whenPromiseSettles(channel.presence.get(), function (err, members) { try { expect(members && members.length).to.equal(0, 'Check no members present'); } catch (err) { @@ -1979,9 +1968,9 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async * and only members that changed between ATTACHED states should result in * presence events */ it('suspended_preserves_presence', function (done) { - var mainRealtime = helper.AblyRealtime({ clientId: 'main', log: { level: 4 } }), - continuousRealtime = helper.AblyRealtime({ clientId: 'continuous', log: { level: 4 } }), - leavesRealtime = helper.AblyRealtime({ clientId: 'leaves', log: { level: 4 } }), + var mainRealtime = helper.AblyRealtime({ clientId: 'main', logLevel: 4 }), + continuousRealtime = helper.AblyRealtime({ clientId: 'continuous', logLevel: 4 }), + leavesRealtime = helper.AblyRealtime({ clientId: 'leaves', logLevel: 4 }), channelName = 'suspended_preserves_presence', mainChannel = mainRealtime.channels.get(channelName); @@ -1998,10 +1987,10 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - channel.attach(cb); + whenPromiseSettles(channel.attach(), cb); }, function (cb) { - channel.presence.enter(cb); + whenPromiseSettles(channel.presence.enter(), cb); }, ], outerCb @@ -2030,7 +2019,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.parallel([waitFor('leaves'), enter(leavesRealtime)], cb); }, function (cb) { - mainChannel.presence.get(function (err, members) { + whenPromiseSettles(mainChannel.presence.get(), function (err, members) { try { expect(members.length).to.equal(3, 'Check all three expected members here'); } catch (err) { @@ -2044,7 +2033,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async helper.becomeSuspended(mainRealtime, cb); }, function (cb) { - mainChannel.presence.get(function (err) { + whenPromiseSettles(mainChannel.presence.get(), function (err) { /* Check RTP11d: get() returns an error by default */ try { expect(err, 'Check error returned by get() while suspended').to.be.ok; @@ -2057,7 +2046,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }, function (cb) { - mainChannel.presence.get({ waitForSync: false }, function (err, members) { + whenPromiseSettles(mainChannel.presence.get({ waitForSync: false }), function (err, members) { /* Check RTP11d: get() works while suspended if waitForSync: false */ try { expect(!err, 'Check no error returned by get() while suspended if waitForSync: false').to.be.ok; @@ -2094,7 +2083,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async setTimeout(cb, 1000); }, function (cb) { - mainChannel.presence.get(function (err, members) { + whenPromiseSettles(mainChannel.presence.get(), function (err, members) { try { expect(members && members.length).to.equal(3, 'Check three expected members here'); } catch (err) { @@ -2123,7 +2112,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async presence = channel.presence, numUpdates = 0; - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, client, err); } @@ -2134,7 +2123,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async async.timesSeries( 15, function (i, cb) { - presence.update(i.toString(), cb); + whenPromiseSettles(presence.update(i.toString()), cb); }, function (err) { if (err) { @@ -2155,170 +2144,5 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ); }); }); - - if (typeof Promise !== 'undefined') { - describe('presence_promise', function () { - var options = { clientId: testClientId, promises: true }; - - it('enter_get', function (done) { - var client = helper.AblyRealtime(options); - var channel = client.channels.get('presence_promise_get'); - var testData = 'test_presence_data'; - - channel.presence - .subscribe(function () { - channel.presence - .get() - .then(function (members) { - expect(members.length).to.equal(1, 'Expect test client to be the only member present'); - expect(members[0].clientId).to.equal(testClientId, 'Expected test clientId to be correct'); - expect(members[0].data).to.equal(testData, 'Expected data to be correct'); - closeAndFinish(done, client); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }) - .then(function () { - channel.presence.enter(testData)['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }); - - it('update', function (done) { - var client = helper.AblyRealtime(options); - var channel = client.channels.get('presence_promise_update'); - var testData1 = 'test_presence_data1'; - var testData2 = 'test_presence_data2'; - var idx = 0; - - channel.presence - .subscribe(function () { - if (idx === 0) { - idx++; - channel.presence - .get() - .then(function (members) { - expect(members.length).to.equal(1, 'Expect test client to be the only member present'); - expect(members[0].clientId).to.equal(testClientId, 'Expected test clientId to be correct'); - expect(members[0].data).to.equal(testData1, 'Expected data to be correct'); - channel.presence.update(testData2)['catch'](function (err) { - // If idx == 2 this means the update was succesful but the connection was closed before it was ACKed - if (idx !== 2) { - closeAndFinish(done, client, err); - } - }); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - } else { - idx++; - channel.presence - .get() - .then(function (members) { - expect(members.length).to.equal(1, 'Expect test client to be the only member present'); - expect(members[0].clientId).to.equal(testClientId, 'Expected test clientId to be correct'); - expect(members[0].data).to.equal(testData2, 'Expected data to be correct'); - closeAndFinish(done, client); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - } - }) - .then(function () { - channel.presence.enter(testData1)['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }); - - it('enterClient_leaveClient', function (done) { - var client = helper.AblyRealtime(options); - var channel = client.channels.get('presence_promise_leaveClient'); - var idx = 0; - - channel.presence - .subscribe(function () { - if (idx === 0) { - idx++; - channel.presence - .get() - .then(function (members) { - expect(members.length).to.equal(1, 'Expect test client to be the only member present'); - expect(members[0].clientId).to.equal(testClientId, 'Expected test clientId to be correct'); - channel.presence.leaveClient(testClientId)['catch'](function (err) { - // If idx == 2 this means the leave was succesful but the connection was closed before it was ACKed - if (idx !== 2) { - closeAndFinish(done, client, err); - } - }); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - } else { - idx++; - channel.presence - .get() - .then(function (members) { - expect(members.length).to.equal(0, 'Expect test client to no longer be present'); - closeAndFinish(done, client); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - } - }) - .then(function () { - channel.presence - .enterClient(testClientId) - .then(function () {}) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }); - - it('history', function (done) { - var client = helper.AblyRealtime(options); - var channel = client.channels.get('presence_promise_history'); - channel.presence - .history() - .then(function (page) { - // Tests for promisified PaginatedResource exist elsewhere in the repo so are omitted here - closeAndFinish(done, client); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }); - - it('subscribe', function (done) { - var client = helper.AblyRealtime(options); - var channel = client.channels.get('presence_promise_subscribe'); - channel.presence - .subscribe(function () {}) - .then(function () { - expect(channel.state).to.equal('attached'); - closeAndFinish(done, client); - }) - ['catch'](function (err) { - closeAndFinish(done, client, err); - }); - }); - }); - } }); }); diff --git a/test/realtime/reauth.test.js b/test/realtime/reauth.test.js index de5f1ab36d..137d35a9b2 100644 --- a/test/realtime/reauth.test.js +++ b/test/realtime/reauth.test.js @@ -6,6 +6,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { var rest; var mixin = helper.Utils.mixin; var displayError = helper.displayError; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/reauth', function () { this.timeout(60 * 1000); @@ -25,7 +26,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { function getToken(tokenParams) { return function (state, callback) { - rest.auth.requestToken(tokenParams, null, function (err, token) { + whenPromiseSettles(rest.auth.requestToken(tokenParams, null), function (err, token) { callback(err, mixin(state, { token: token })); }); }; @@ -72,7 +73,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { async.parallel( [ function (cb) { - state.realtime.auth.authorize(null, { token: state.token }, cb); + whenPromiseSettles(state.realtime.auth.authorize(null, { token: state.token }), cb); }, function (cb) { state.realtime.connection.on('update', function (stateChange) { @@ -90,7 +91,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { function attach(channelName) { return function (state, callback) { var channel = state.realtime.channels.get(channelName); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { callback(err, state); }); }; @@ -146,7 +147,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { function checkCantAttach(channelName) { return function (state, callback) { var channel = state.realtime.channels.get(channelName); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err && err.code === 40160) { callback(null, state); } else { @@ -159,7 +160,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { function checkCanPublish(channelName) { return function (state, callback) { var channel = state.realtime.channels.get(channelName); - channel.publish(null, null, function (err) { + whenPromiseSettles(channel.publish(null, null), function (err) { callback(err, state); }); }; @@ -168,7 +169,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { function checkCantPublish(channelName) { return function (state, callback) { var channel = state.realtime.channels.get(channelName); - channel.publish(null, null, function (err) { + whenPromiseSettles(channel.publish(null, null), function (err) { if (err && err.code === 40160) { callback(null, state); } else { diff --git a/test/realtime/resume.test.js b/test/realtime/resume.test.js index 31b1dab3c6..26104d9aa2 100644 --- a/test/realtime/resume.test.js +++ b/test/realtime/resume.test.js @@ -6,6 +6,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { var simulateDroppedConnection = helper.simulateDroppedConnection; var testOnAllTransports = helper.testOnAllTransports; var bestTransport = helper.bestTransport; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/resume', function () { this.timeout(120 * 1000); @@ -31,7 +32,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { receivingChannel.unsubscribe(event); callback(); }); - sendingChannel.publish(event, message, function (err) { + whenPromiseSettles(sendingChannel.publish(event, message), function (err) { if (err) callback(err); }); } @@ -51,7 +52,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { var rxCount = 0; function phase0(callback) { - rxChannel.attach(callback); + whenPromiseSettles(rxChannel.attach(), callback); } function phase1(callback) { @@ -162,7 +163,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { var rxCount = 0; function phase0(callback) { - rxChannel.attach(callback); + whenPromiseSettles(rxChannel.attach(), callback); } function phase1(callback) { @@ -188,7 +189,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { var txCount = 0; function ph2TxOnce() { - txChannel.publish('sentWhileDisconnected', 'phase 2, message ' + txCount, function (err) { + whenPromiseSettles(txChannel.publish('sentWhileDisconnected', 'phase 2, message ' + txCount), function (err) { if (err) callback(err); }); if (++txCount == count) { @@ -291,7 +292,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }, function (cb) { suspendedChannel.state = 'suspended'; - attachedChannel.attach(cb); + whenPromiseSettles(attachedChannel.attach(), cb); }, function (cb) { /* Sabotage the resume */ @@ -353,7 +354,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); }, function (cb) { - realtime.auth.requestToken({ ttl: 1 }, null, function (err, token) { + whenPromiseSettles(realtime.auth.requestToken({ ttl: 1 }, null), function (err, token) { badtoken = token; cb(err); }); @@ -643,7 +644,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { const rxChannels = channelNames.map((name) => rxRealtime.channels.get(name)); function attachChannels(callback) { - async.each(rxChannels, (channel, cb) => channel.attach(cb), callback); + async.each(rxChannels, (channel, cb) => whenPromiseSettles(channel.attach(), cb), callback); } function publishSubscribeWhileConnectedOnce(callback) { @@ -673,7 +674,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { channelNames, (name, cb) => { const tx = txRest.channels.get(name); - tx.publish('sentWhileDisconnected', null, cb); + whenPromiseSettles(tx.publish('sentWhileDisconnected', null), cb); }, callback ); diff --git a/test/realtime/sync.test.js b/test/realtime/sync.test.js index 5469e2fe42..3c306d9bcc 100644 --- a/test/realtime/sync.test.js +++ b/test/realtime/sync.test.js @@ -7,6 +7,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var closeAndFinish = helper.closeAndFinish; var createPM = Ably.Realtime.ProtocolMessage.fromDeserialized; var monitorConnection = helper.monitorConnection; + var whenPromiseSettles = helper.whenPromiseSettles; describe('realtime/sync', function () { this.timeout(60 * 1000); @@ -42,12 +43,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async * sync in progress, then do one sync, then a second with a slightly * different presence set */ - it('sync_existing_set', function (done) { + it('sync_existing_set', async function () { var realtime = helper.AblyRealtime({ autoConnect: false }), channelName = 'syncexistingset', channel = realtime.channels.get(channelName); - channel.onMessage( + await channel.processMessage( createPM({ action: 11, channel: channelName, @@ -55,101 +56,119 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }) ); - async.series( - [ - function (cb) { - channel.onMessage({ - action: 16, - channel: channelName, - presence: [ - { - action: 'present', - clientId: 'one', - connectionId: 'one_connid', - id: 'one_connid:0:0', - timestamp: 1e12, - }, - { - action: 'present', - clientId: 'two', - connectionId: 'two_connid', - id: 'two_connid:0:0', - timestamp: 1e12, - }, - ], - }); - cb(); - }, - function (cb) { - channel.presence.get(function (err, results) { - try { - expect(results.length).to.equal(2, 'Check correct number of results'); - expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; - expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check correct members'); - } catch (err) { + await new Promise(function (resolve, reject) { + var done = function (err) { + err ? reject(err) : resolve(); + }; + + async.series( + [ + function (cb) { + channel + .processMessage({ + action: 16, + channel: channelName, + presence: [ + { + action: 'present', + clientId: 'one', + connectionId: 'one_connid', + id: 'one_connid:0:0', + timestamp: 1e12, + }, + { + action: 'present', + clientId: 'two', + connectionId: 'two_connid', + id: 'two_connid:0:0', + timestamp: 1e12, + }, + ], + }) + .then(function () { + cb(); + }) + .catch(function (err) { + cb(err); + }); + }, + function (cb) { + whenPromiseSettles(channel.presence.get(), function (err, results) { + try { + expect(results.length).to.equal(2, 'Check correct number of results'); + expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; + expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check correct members'); + } catch (err) { + cb(err); + return; + } cb(err); - return; - } - cb(err); - }); - }, - function (cb) { - /* Trigger another sync. Two has gone without so much as a `leave` message! */ - channel.onMessage({ - action: 16, - channel: channelName, - presence: [ - { - action: 'present', - clientId: 'one', - connectionId: 'one_connid', - id: 'one_connid:0:0', - timestamp: 1e12, - }, - { - action: 'present', - clientId: 'three', - connectionId: 'three_connid', - id: 'three_connid:0:0', - timestamp: 1e12, - }, - ], - }); - cb(); - }, - function (cb) { - channel.presence.get(function (err, results) { - try { - expect(results.length).to.equal(2, 'Check correct number of results'); - expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; - expect(extractClientIds(results)).to.deep.equal( - ['one', 'three'], - 'check two has gone and three is there' - ); - } catch (err) { + }); + }, + function (cb) { + /* Trigger another sync. Two has gone without so much as a `leave` message! */ + channel + .processMessage({ + action: 16, + channel: channelName, + presence: [ + { + action: 'present', + clientId: 'one', + connectionId: 'one_connid', + id: 'one_connid:0:0', + timestamp: 1e12, + }, + { + action: 'present', + clientId: 'three', + connectionId: 'three_connid', + id: 'three_connid:0:0', + timestamp: 1e12, + }, + ], + }) + .then(function () { + cb(); + }) + .catch(function (err) { + cb(err); + }); + }, + function (cb) { + whenPromiseSettles(channel.presence.get(), function (err, results) { + try { + expect(results.length).to.equal(2, 'Check correct number of results'); + expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; + expect(extractClientIds(results)).to.deep.equal( + ['one', 'three'], + 'check two has gone and three is there' + ); + } catch (err) { + cb(err); + return; + } cb(err); - return; - } - cb(err); - }); - }, - ], - function (err) { - closeAndFinish(done, realtime, err); - } - ); + }); + }, + ], + function (err) { + closeAndFinish(done, realtime, err); + } + ); + }); }); /* * Sync with an existing presence set and a presence member added in the * middle of the sync should should discard the former, but not the latter * */ - it('sync_member_arrives_in_middle', function (done) { + it('sync_member_arrives_in_middle', async function () { var realtime = helper.AblyRealtime({ autoConnect: false }), channelName = 'sync_member_arrives_in_middle', channel = realtime.channels.get(channelName); - channel.onMessage( + await channel.processMessage( createPM({ action: 11, channel: channelName, @@ -158,7 +177,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ); /* First sync */ - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, presence: [ @@ -173,7 +192,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); /* A second sync, this time in multiple parts, with a presence message in the middle */ - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, channelSerial: 'serial:cursor', @@ -188,7 +207,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, presence: [ @@ -202,7 +221,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, channelSerial: 'serial:', @@ -217,32 +236,41 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.presence.get(function (err, results) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } - try { - expect(results.length).to.equal(3, 'Check correct number of results'); - expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; - expect(extractClientIds(results)).to.deep.equal(['four', 'three', 'two'], 'check expected presence members'); - } catch (err) { - closeAndFinish(done, realtime, err); - return; - } - closeAndFinish(done, realtime); + await new Promise(function (resolve, reject) { + var done = function (err) { + err ? reject(err) : resolve(); + }; + + whenPromiseSettles(channel.presence.get(), function (err, results) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } + try { + expect(results.length).to.equal(3, 'Check correct number of results'); + expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; + expect(extractClientIds(results)).to.deep.equal( + ['four', 'three', 'two'], + 'check expected presence members' + ); + } catch (err) { + closeAndFinish(done, realtime, err); + return; + } + closeAndFinish(done, realtime); + }); }); }); /* * Presence message that was in the sync arrives again as a normal message, after it's come in the sync */ - it('sync_member_arrives_normally_after_came_in_sync', function (done) { + it('sync_member_arrives_normally_after_came_in_sync', async function () { var realtime = helper.AblyRealtime({ autoConnect: false }), channelName = 'sync_member_arrives_normally_after_came_in_sync', channel = realtime.channels.get(channelName); - channel.onMessage( + await channel.processMessage( createPM({ action: 11, channel: channelName, @@ -250,7 +278,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }) ); - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, channelSerial: 'serial:cursor', @@ -265,7 +293,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, presence: [ @@ -279,7 +307,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, channelSerial: 'serial:', @@ -294,32 +322,38 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.presence.get(function (err, results) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } - try { - expect(results.length).to.equal(2, 'Check correct number of results'); - expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; - expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check expected presence members'); - } catch (err) { - closeAndFinish(done, realtime, err); - return; - } - closeAndFinish(done, realtime); + await new Promise(function (resolve, reject) { + var done = function (err) { + err ? reject(err) : resolve(); + }; + + whenPromiseSettles(channel.presence.get(), function (err, results) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } + try { + expect(results.length).to.equal(2, 'Check correct number of results'); + expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; + expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check expected presence members'); + } catch (err) { + closeAndFinish(done, realtime, err); + return; + } + closeAndFinish(done, realtime); + }); }); }); /* * Presence message that will be in the sync arrives as a normal message, before it comes in the sync */ - it('sync_member_arrives_normally_before_comes_in_sync', function (done) { + it('sync_member_arrives_normally_before_comes_in_sync', async function () { var realtime = helper.AblyRealtime({ autoConnect: false }), channelName = 'sync_member_arrives_normally_before_comes_in_sync', channel = realtime.channels.get(channelName); - channel.onMessage( + await channel.processMessage( createPM({ action: 11, channel: channelName, @@ -327,7 +361,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }) ); - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, channelSerial: 'serial:cursor', @@ -342,7 +376,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, presence: [ @@ -356,7 +390,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.onMessage({ + await channel.processMessage({ action: 16, channel: channelName, channelSerial: 'serial:', @@ -371,20 +405,26 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.presence.get(function (err, results) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } - try { - expect(results.length).to.equal(2, 'Check correct number of results'); - expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; - expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check expected presence members'); - } catch (err) { - closeAndFinish(done, realtime, err); - return; - } - closeAndFinish(done, realtime); + await new Promise(function (resolve, reject) { + var done = function (err) { + err ? reject(err) : resolve(); + }; + + whenPromiseSettles(channel.presence.get(), function (err, results) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } + try { + expect(results.length).to.equal(2, 'Check correct number of results'); + expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; + expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check expected presence members'); + } catch (err) { + closeAndFinish(done, realtime, err); + return; + } + closeAndFinish(done, realtime); + }); }); }); @@ -392,12 +432,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async * Get several presence messages with various combinations of msgserial, * index, and synthesized leaves, check that the end result is correct */ - it('presence_ordering', function (done) { + it('presence_ordering', async function () { var realtime = helper.AblyRealtime({ autoConnect: false }), channelName = 'sync_ordering', channel = realtime.channels.get(channelName); - channel.onMessage( + await channel.processMessage( createPM({ action: 11, channel: channelName, @@ -405,7 +445,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ); /* One enters */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, id: 'one_connid:1', @@ -420,7 +460,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); /* An earlier leave from one (should be ignored) */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, connectionId: 'one_connid', @@ -435,7 +475,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); /* One adds some data in a newer msgSerial */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, connectionId: 'one_connid', @@ -451,7 +491,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); /* Two enters */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, connectionId: 'two_connid', @@ -466,7 +506,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); /* Two updates twice in the same message */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, connectionId: 'two_connid', @@ -487,7 +527,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); /* Three enters */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, connectionId: 'three_connid', @@ -503,7 +543,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* Synthesized leave for three (with earlier msgSerial, incompatible id, * and later timestamp) */ - channel.onMessage({ + await channel.processMessage({ action: 14, channel: channelName, connectionId: 'synthesized', @@ -518,110 +558,112 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ], }); - channel.presence.get(function (err, results) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } - try { - expect(results.length).to.equal(2, 'Check correct number of results'); - expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; - expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check expected presence members'); - expect(extractMember(results, 'one').data).to.equal('onedata', 'check correct data on one'); - expect(extractMember(results, 'two').data).to.equal('twodata', 'check correct data on two'); - } catch (err) { - closeAndFinish(done, realtime, err); - return; - } - closeAndFinish(done, realtime); + await new Promise(function (resolve, reject) { + var done = function (err) { + err ? reject(err) : resolve(); + }; + whenPromiseSettles(channel.presence.get(), function (err, results) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } + try { + expect(results.length).to.equal(2, 'Check correct number of results'); + expect(channel.presence.syncComplete, 'Check in sync').to.be.ok; + expect(extractClientIds(results)).to.deep.equal(['one', 'two'], 'check expected presence members'); + expect(extractMember(results, 'one').data).to.equal('onedata', 'check correct data on one'); + expect(extractMember(results, 'two').data).to.equal('twodata', 'check correct data on two'); + } catch (err) { + closeAndFinish(done, realtime, err); + return; + } + closeAndFinish(done, realtime); + }); }); }); - /* JSONP can't cope with entering 110 people in one go. */ - if (helper.bestTransport !== 'jsonp') { - /* - * Do a 110-member sync, so split into two sync messages. Inject a normal - * presence enter between the syncs. Check everything was entered correctly - */ - it('presence_sync_interruptus', function (done) { - var channelName = 'presence_sync_interruptus'; - var interrupterClientId = 'dark_horse'; - var enterer = helper.AblyRealtime(); - var syncer = helper.AblyRealtime(); - var entererChannel = enterer.channels.get(channelName); - var syncerChannel = syncer.channels.get(channelName); - - function waitForBothConnect(cb) { - async.parallel( - [ - function (connectCb) { - enterer.connection.on('connected', connectCb); - }, - function (connectCb) { - syncer.connection.on('connected', connectCb); - }, - ], - function () { - cb(); - } - ); - } - - async.series( + /* + * Do a 110-member sync, so split into two sync messages. Inject a normal + * presence enter between the syncs. Check everything was entered correctly + */ + it('presence_sync_interruptus', function (done) { + var channelName = 'presence_sync_interruptus'; + var interrupterClientId = 'dark_horse'; + var enterer = helper.AblyRealtime(); + var syncer = helper.AblyRealtime(); + var entererChannel = enterer.channels.get(channelName); + var syncerChannel = syncer.channels.get(channelName); + + function waitForBothConnect(cb) { + async.parallel( [ - waitForBothConnect, - function (cb) { - entererChannel.attach(cb); - }, - function (cb) { - async.times( - 110, - function (i, presCb) { - entererChannel.presence.enterClient(i.toString(), null, presCb); - }, - cb - ); - }, - function (cb) { - var originalOnMessage = syncerChannel.onMessage; - syncerChannel.onMessage = function (message) { - originalOnMessage.apply(this, arguments); - /* Inject an additional presence message after the first sync */ - if (message.action === 16) { - syncerChannel.onMessage = originalOnMessage; - syncerChannel.onMessage({ - action: 14, - id: 'messageid:0', - connectionId: 'connid', - timestamp: 2000000000000, - presence: [ - { - clientId: interrupterClientId, - action: 'enter', - }, - ], - }); - } - }; - syncerChannel.attach(cb); + function (connectCb) { + enterer.connection.on('connected', connectCb); }, - function (cb) { - syncerChannel.presence.get(function (err, presenceSet) { - try { - expect(presenceSet && presenceSet.length).to.equal(111, 'Check everyone’s in presence set'); - } catch (err) { - cb(err); - return; - } - cb(err); - }); + function (connectCb) { + syncer.connection.on('connected', connectCb); }, ], - function (err) { - closeAndFinish(done, [enterer, syncer], err); + function () { + cb(); } ); - }); - } + } + + async.series( + [ + waitForBothConnect, + function (cb) { + whenPromiseSettles(entererChannel.attach(), cb); + }, + function (cb) { + async.times( + 110, + function (i, presCb) { + whenPromiseSettles(entererChannel.presence.enterClient(i.toString(), null), presCb); + }, + cb + ); + }, + function (cb) { + var originalProcessMessage = syncerChannel.processMessage; + syncerChannel.processMessage = async function (message) { + await originalProcessMessage.apply(this, arguments); + /* Inject an additional presence message after the first sync */ + if (message.action === 16) { + syncerChannel.processMessage = originalProcessMessage; + await syncerChannel.processMessage({ + action: 14, + id: 'messageid:0', + connectionId: 'connid', + timestamp: 2000000000000, + presence: [ + { + clientId: interrupterClientId, + action: 'enter', + }, + ], + }); + } + }; + whenPromiseSettles(syncerChannel.attach(), cb); + }, + function (cb) { + whenPromiseSettles(syncerChannel.presence.get(), function (err, presenceSet) { + try { + expect(presenceSet && presenceSet.length).to.equal(111, 'Check everyone’s in presence set'); + } catch (err) { + cb(err); + return; + } + cb(err); + }); + }, + ], + function (err) { + closeAndFinish(done, [enterer, syncer], err); + } + ); + }); }); }); diff --git a/test/realtime/upgrade.test.js b/test/realtime/upgrade.test.js index 08c785e4b5..3ae14f839c 100644 --- a/test/realtime/upgrade.test.js +++ b/test/realtime/upgrade.test.js @@ -18,6 +18,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai var closeAndFinish = helper.closeAndFinish; var monitorConnection = helper.monitorConnection; var bestTransport = helper.bestTransport; + var whenPromiseSettles = helper.whenPromiseSettles; if (bestTransport === 'web_socket') { describe('realtime/upgrade', function () { @@ -48,7 +49,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai //console.log('publishpreupgrade: connected'); var testMsg = 'Hello world'; var rtChannel = realtime.channels.get('publishpreupgrade'); - rtChannel.attach(function (err) { + whenPromiseSettles(rtChannel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -67,7 +68,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai /* publish event */ var restChannel = rest.channels.get('publishpreupgrade'); - restChannel.publish('event0', testMsg, function (err) { + whenPromiseSettles(restChannel.publish('event0', testMsg), function (err) { if (err) { closeAndFinish(done, realtime, err); } @@ -113,7 +114,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai if (transport.toString().match(/wss?\:/)) { if (rtChannel.state == 'attached') { //console.log('*** publishpostupgrade0: publishing (channel attached on transport active) ...'); - restChannel.publish('event0', testMsg, function (err) { + whenPromiseSettles(restChannel.publish('event0', testMsg), function (err) { //console.log('publishpostupgrade0: publish returned err = ' + displayError(err)); if (err) { closeAndFinish(done, realtime, err); @@ -122,7 +123,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai } else { rtChannel.on('attached', function () { //console.log('*** publishpostupgrade0: publishing (channel attached after wait) ...'); - restChannel.publish('event0', testMsg, function (err) { + whenPromiseSettles(restChannel.publish('event0', testMsg), function (err) { //console.log('publishpostupgrade0: publish returned err = ' + displayError(err)); if (err) { closeAndFinish(done, realtime, err); @@ -512,7 +513,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai /* Check events not still paused */ var channel = realtime.channels.get('unrecoverableUpgrade'); - channel.attach(function (err) { + whenPromiseSettles(channel.attach(), function (err) { if (err) { closeAndFinish(done, realtime, err); return; @@ -557,7 +558,7 @@ define(['shared_helper', 'async', 'chai', 'ably'], function (helper, async, chai }); }, function (cb) { - channel.publish('event', null, function (err) { + whenPromiseSettles(channel.publish('event', null), function (err) { try { expect(!err, 'Successfully published message').to.be.ok; } catch (err) { diff --git a/test/rest/api.test.js b/test/rest/api.test.js index dd3610c982..fcc19aa3df 100644 --- a/test/rest/api.test.js +++ b/test/rest/api.test.js @@ -6,9 +6,6 @@ define(['ably', 'chai'], function (Ably, chai) { describe('rest/api', function () { it('Client constructors', function () { expect(typeof Ably.Rest).to.equal('function'); - expect(typeof Ably.Rest.Promise).to.equal('function'); - expect(typeof Ably.Rest.Callbacks).to.equal('function'); - expect(Ably.Rest.Callbacks).to.equal(Ably.Rest); }); it('Crypto', function () { diff --git a/test/rest/auth.test.js b/test/rest/auth.test.js index 87273b55bc..c1aed009bd 100644 --- a/test/rest/auth.test.js +++ b/test/rest/auth.test.js @@ -10,437 +10,243 @@ define(['chai', 'shared_helper', 'async', 'globals'], function (chai, helper, as describe('rest/auth', function () { this.timeout(60 * 1000); - var getServerTime = function (callback) { - rest.time(function (err, time) { - if (err) { - callback(err); - } - callback(null, time); - }); - }; - before(function (done) { helper.setupApp(function () { rest = helper.AblyRest({ queryTime: true }); - getServerTime(function (err, time) { - if (err) { + rest + .time() + .then(function (time) { + currentTime = time; + expect(true, 'Obtained time').to.be.ok; + done(); + }) + .catch(function (err) { done(err); - return; - } - currentTime = time; - expect(true, 'Obtained time').to.be.ok; - done(); - }); + }); }); }); - it('Base token generation case', function (done) { - rest.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(tokenDetails.expires).to.equal(60 * 60 * 1000 + tokenDetails.issued, 'Verify default expiry period'); - expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + it('Base token generation case', async function () { + var tokenDetails = await rest.auth.requestToken(); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(tokenDetails.expires).to.equal(60 * 60 * 1000 + tokenDetails.issued, 'Verify default expiry period'); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); }); - it('Base token generation with options', function (done) { - rest.auth.requestToken(null, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + it('Base token generation with options', async function () { + var tokenDetails = await rest.auth.requestToken(null); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); }); - it('Generate token and init library with it', function (done) { - rest.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - helper.AblyRest({ token: tokenDetails.token }); - done(); - } catch (err) { - done(err); - } - }); + it('Generate token and init library with it', async function () { + var tokenDetails = await rest.auth.requestToken(); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + helper.AblyRest({ token: tokenDetails.token }); }); - it('Token generation with explicit timestamp', function (done) { - getServerTime(function (err, serverTime) { - if (err) { - done(err); - return; - } - - rest.auth.requestToken({ timestamp: serverTime }, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token).to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); - }); + it('Token generation with explicit timestamp', async function () { + var serverTime = await rest.time(); + var tokenDetails = await rest.auth.requestToken({ timestamp: serverTime }); + expect(tokenDetails.token).to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); }); - it('Token generation with invalid timestamp', function (done) { + it('Token generation with invalid timestamp', async function () { var badTime = utils.now() - 30 * 60 * 1000; - rest.auth.requestToken({ timestamp: badTime }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(401, 'Verify token request rejected with bad timestamp'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Invalid timestamp, expected rejection')); - }); + try { + var tokenDetails = await rest.auth.requestToken({ timestamp: badTime }); + } catch (err) { + expect(err.statusCode).to.equal(401, 'Verify token request rejected with bad timestamp'); + return; + } + throw new Error('Invalid timestamp, expected rejection'); }); - it('Token generation with system timestamp', function (done) { - rest.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + it('Token generation with system timestamp', async function () { + var tokenDetails = await rest.auth.requestToken(); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); }); - it('Token generation with duplicate nonce', function (done) { - getServerTime(function (err, serverTime) { - if (err) { - done(err); - return; - } - rest.auth.requestToken({ timestamp: serverTime, nonce: '1234567890123456' }, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - rest.auth.requestToken({ timestamp: serverTime, nonce: '1234567890123456' }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(401, 'Verify request rejected with duplicated nonce'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Invalid nonce, expected rejection')); - }); - }); - }); + it('Token generation with duplicate nonce', async function () { + var serverTime = await rest.time(); + await rest.auth.requestToken({ timestamp: serverTime, nonce: '1234567890123456' }); + try { + await rest.auth.requestToken({ timestamp: serverTime, nonce: '1234567890123456' }); + } catch (err) { + expect(err.statusCode).to.equal(401, 'Verify request rejected with duplicated nonce'); + return; + } + throw new Error('Invalid nonce, expected rejection'); }); - it('Token generation with clientId', function (done) { + it('Token generation with clientId', async function () { var testClientId = 'test client id'; - rest.auth.requestToken({ clientId: testClientId }, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(tokenDetails.clientId).to.equal(testClientId, 'Verify client id'); - expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ clientId: testClientId }); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(tokenDetails.clientId).to.equal(testClientId, 'Verify client id'); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal({ '*': ['*'] }, 'Verify token capability'); }); - it('Token generation with empty string clientId should error', function (done) { - rest.auth.requestToken({ clientId: '' }, function (err, tokenDetails) { - if (err) { - expect(err.code).to.equal(40012); - done(); - return; - } - done(new Error('Expected token generation to error with empty string clientId')); - }); + it('Token generation with empty string clientId should error', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ clientId: '' }); + } catch (err) { + expect(err.code).to.equal(40012); + return; + } + throw new Error('Expected token generation to error with empty string clientId'); }); - it('Token generation with capability that subsets key capability', function (done) { + it('Token generation with capability that subsets key capability', async function () { var testCapability = { onlythischannel: ['subscribe'] }; - rest.auth.requestToken({ capability: testCapability }, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); }); - it('Token generation with specified key', function (done) { + it('Token generation with specified key', async function () { var testKeyOpts = { key: helper.getTestApp().keys[1].keyStr }; var testCapability = JSON.parse(helper.getTestApp().keys[1].capability); - rest.auth.requestToken(null, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(tokenDetails.keyName).to.equal(helper.getTestApp().keys[1].keyName, 'Verify token key'); - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken(null, testKeyOpts); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(tokenDetails.keyName).to.equal(helper.getTestApp().keys[1].keyName, 'Verify token key'); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); }); - it('Token generation with explicit auth', function (done) { - rest.auth.getAuthHeaders(function (err, authHeaders) { - if (err) { - done(err); - return; - } - rest.auth.authOptions.requestHeaders = authHeaders; - rest.auth.requestToken(function (err, tokenDetails) { - delete rest.auth.authOptions.requestHeaders; + it('Token generation with explicit auth', async function () { + var authHeaders = await new Promise((resolve, reject) => { + rest.auth.getAuthHeaders(function (err, authHeaders) { if (err) { - done(err); + reject(err); return; } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(tokenDetails.keyName).to.equal(helper.getTestApp().keys[0].keyName, 'Verify token key'); - done(); - } catch (err) { - done(err); - } + resolve(authHeaders); }); }); + rest.auth.authOptions.requestHeaders = authHeaders; + var tokenDetails = await rest.auth.requestToken(); + delete rest.auth.authOptions.requestHeaders; + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(tokenDetails.keyName).to.equal(helper.getTestApp().keys[0].keyName, 'Verify token key'); }); - it('Token generation with explicit auth, different key', function (done) { - rest.auth.getAuthHeaders(function (err, authHeaders) { - var testKeyOpts = { key: helper.getTestApp().keys[1].keyStr }; - var testCapability = JSON.parse(helper.getTestApp().keys[1].capability); - rest.auth.requestToken(null, testKeyOpts, function (err, tokenDetails) { + it('Token generation with explicit auth, different key', async function () { + var authHeaders = await new Promise((resolve, reject) => { + rest.auth.getAuthHeaders(function (err, authHeaders) { if (err) { - done(err); + reject(err); return; } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; - expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; - expect(tokenDetails.keyName).to.equal(helper.getTestApp().keys[1].keyName, 'Verify token key'); - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); - done(); - } catch (e) { - done(e); - } + resolve(authHeaders); }); }); + var testKeyOpts = { key: helper.getTestApp().keys[1].keyStr }; + var testCapability = JSON.parse(helper.getTestApp().keys[1].capability); + var tokenDetails = await rest.auth.requestToken(null, testKeyOpts); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.issued && tokenDetails.issued >= currentTime, 'Verify token issued').to.be.ok; + expect(tokenDetails.expires && tokenDetails.expires > tokenDetails.issued, 'Verify token expires').to.be.ok; + expect(tokenDetails.keyName).to.equal(helper.getTestApp().keys[1].keyName, 'Verify token key'); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); }); - it('Token generation with invalid mac', function (done) { - rest.auth.requestToken({ mac: '12345' }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(401, 'Verify request rejected with bad mac'); - done(); - } catch (e) { - done(e); - } - return; - } - done(new Error('Invalid mac, expected rejection')); - }); + it('Token generation with invalid mac', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ mac: '12345' }); + } catch (err) { + expect(err.statusCode).to.equal(401, 'Verify request rejected with bad mac'); + return; + } + throw new Error('Invalid mac, expected rejection'); }); - it('Token generation with defaultTokenParams set and no tokenParams passed in', function (done) { + it('Token generation with defaultTokenParams set and no tokenParams passed in', async function () { var rest1 = helper.AblyRest({ defaultTokenParams: { ttl: 123, clientId: 'foo' } }); - rest1.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.token, 'Verify token value').to.be.ok; - expect(tokenDetails.clientId).to.equal('foo', 'Verify client id from defaultTokenParams used'); - expect(tokenDetails.expires - tokenDetails.issued).to.equal(123, 'Verify ttl from defaultTokenParams used'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest1.auth.requestToken(); + expect(tokenDetails.token, 'Verify token value').to.be.ok; + expect(tokenDetails.clientId).to.equal('foo', 'Verify client id from defaultTokenParams used'); + expect(tokenDetails.expires - tokenDetails.issued).to.equal(123, 'Verify ttl from defaultTokenParams used'); }); - it('Token generation: if tokenParams passed in, defaultTokenParams should be ignored altogether, not merged', function (done) { + it('Token generation: if tokenParams passed in, defaultTokenParams should be ignored altogether, not merged', async function () { var rest1 = helper.AblyRest({ defaultTokenParams: { ttl: 123, clientId: 'foo' } }); - rest1.auth.requestToken({ clientId: 'bar' }, null, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.clientId).to.equal( - 'bar', - 'Verify clientId passed in is used, not the one from defaultTokenParams' - ); - expect(tokenDetails.expires - tokenDetails.issued).to.equal( - 60 * 60 * 1000, - 'Verify ttl from defaultTokenParams ignored completely, even though not overridden' - ); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest1.auth.requestToken({ clientId: 'bar' }, null); + expect(tokenDetails.clientId).to.equal( + 'bar', + 'Verify clientId passed in is used, not the one from defaultTokenParams' + ); + expect(tokenDetails.expires - tokenDetails.issued).to.equal( + 60 * 60 * 1000, + 'Verify ttl from defaultTokenParams ignored completely, even though not overridden' + ); }); /* * authorize with different args */ - it('Authorize with different args', function (done) { - async.parallel( - [ - function (cb) { - rest.auth.authorize(null, null, function (err, tokenDetails) { - expect(tokenDetails.token, 'Check token obtained').to.be.ok; - cb(err); - }); - }, - function (cb) { - rest.auth.authorize(null, function (err, tokenDetails) { - expect(tokenDetails.token, 'Check token obtained').to.be.ok; - cb(err); - }); - }, - function (cb) { - rest.auth.authorize(function (err, tokenDetails) { - expect(tokenDetails.token, 'Check token obtained').to.be.ok; - cb(err); - }); - }, - ], - function (err) { - if (err) { - done(err); - } - done(); - } - ); - }); + it('Authorize with different args', async function () { + var results = await Promise.all([ + rest.auth.authorize(), + rest.auth.authorize(null), + rest.auth.authorize(null, null), + ]); - it('Specify non-default ttl', function (done) { - rest.auth.requestToken({ ttl: 100 * 1000 }, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(tokenDetails.expires).to.equal(100 * 1000 + tokenDetails.issued, 'Verify non-default expiry period'); - done(); - } catch (err) { - done(err); - } + results.forEach((tokenDetails) => { + expect(tokenDetails.token, 'Check token obtained').to.be.ok; }); }); - it('Should error with excessive ttl', function (done) { - rest.auth.requestToken({ ttl: 365 * 24 * 60 * 60 * 1000 }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(400, 'Verify request rejected with excessive expiry'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Excessive expiry, expected rejection')); - }); + it('Specify non-default ttl', async function () { + var tokenDetails = await rest.auth.requestToken({ ttl: 100 * 1000 }); + expect(tokenDetails.expires).to.equal(100 * 1000 + tokenDetails.issued, 'Verify non-default expiry period'); }); - it('Should error with negative ttl', function (done) { - rest.auth.requestToken({ ttl: -1 }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(400, 'Verify request rejected with negative expiry'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Negative expiry, expected rejection')); - }); + it('Should error with excessive ttl', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ ttl: 365 * 24 * 60 * 60 * 1000 }); + } catch (err) { + expect(err.statusCode).to.equal(400, 'Verify request rejected with excessive expiry'); + return; + } + throw new Error('Excessive expiry, expected rejection'); }); - it('Should error with invalid ttl', function (done) { - rest.auth.requestToken({ ttl: 'notanumber' }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(400, 'Verify request rejected with invalid expiry'); - done(); - } catch (e) { - done(e); - } - return; - } - done(new Error('Invalid expiry, expected rejection')); - }); + it('Should error with negative ttl', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ ttl: -1 }); + } catch (err) { + expect(err.statusCode).to.equal(400, 'Verify request rejected with negative expiry'); + return; + } + throw new Error('Negative expiry, expected rejection'); + }); + + it('Should error with invalid ttl', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ ttl: 'notanumber' }); + } catch (err) { + expect(err.statusCode).to.equal(400, 'Verify request rejected with invalid expiry'); + return; + } + throw new Error('Invalid expiry, expected rejection'); }); /* @@ -448,91 +254,28 @@ define(['chai', 'shared_helper', 'async', 'globals'], function (chai, helper, as * and the token request includes all the fields it should include, but * doesn't include ttl or capability by default */ - it('createTokenRequest without authOptions', function (done) { - rest.auth.createTokenRequest(null, null, function (err, tokenRequest) { - if (err) { - done(err); - return; - } - try { - expect('mac' in tokenRequest, 'check tokenRequest contains a mac').to.be.ok; - expect('nonce' in tokenRequest, 'check tokenRequest contains a nonce').to.be.ok; - expect('timestamp' in tokenRequest, 'check tokenRequest contains a timestamp').to.be.ok; - expect(!('ttl' in tokenRequest), 'check tokenRequest does not contains a ttl by default').to.be.ok; - expect( - !('capability' in tokenRequest), - 'check tokenRequest does not contains capabilities by default' - ).to.be.ok; - expect(tokenRequest.keyName).to.equal(helper.getTestApp().keys[0].keyName); - done(); - } catch (err) { - done(err); - } - }); + it('createTokenRequest without authOptions', async function () { + var tokenRequest = await rest.auth.createTokenRequest(null, null); + expect('mac' in tokenRequest, 'check tokenRequest contains a mac').to.be.ok; + expect('nonce' in tokenRequest, 'check tokenRequest contains a nonce').to.be.ok; + expect('timestamp' in tokenRequest, 'check tokenRequest contains a timestamp').to.be.ok; + expect(!('ttl' in tokenRequest), 'check tokenRequest does not contains a ttl by default').to.be.ok; + expect(!('capability' in tokenRequest), 'check tokenRequest does not contains capabilities by default').to.be.ok; + expect(tokenRequest.keyName).to.equal(helper.getTestApp().keys[0].keyName); }); - it('createTokenRequest without authOptions, callback as 2nd param', function (done) { - rest.auth.createTokenRequest(null, function (err, tokenRequest) { - if (err) { - done(err); - return; - } - try { - expect(tokenRequest.keyName).to.equal(helper.getTestApp().keys[0].keyName); - done(); - } catch (err) { - done(err); - } - }); - }); - - it('createTokenRequest without authOptions or tokenParams, callback as 1st param', function (done) { - rest.auth.createTokenRequest(function (err, tokenRequest) { - if (err) { - done(err); - return; - } - try { - expect(tokenRequest.keyName).to.equal(helper.getTestApp().keys[0].keyName); - done(); - } catch (err) { - done(err); - } - }); + it('createTokenRequest uses the key it was initialized with if authOptions does not have a "key" key', async function () { + var tokenRequest = await rest.auth.createTokenRequest(); + expect(tokenRequest.keyName).to.equal(helper.getTestApp().keys[0].keyName); }); - it('createTokenRequest uses the key it was initialized with if authOptions does not have a "key" key', function (done) { - rest.auth.createTokenRequest(function (err, tokenRequest) { - if (err) { - done(err); - return; - } - try { - expect(tokenRequest.keyName).to.equal(helper.getTestApp().keys[0].keyName); - done(); - } catch (err) { - done(err); - } - }); - }); - - it('createTokenRequest should serialise capability object as JSON', function (done) { + it('createTokenRequest should serialise capability object as JSON', async function () { var capability = { '*': ['*'] }; - rest.auth.createTokenRequest({ capability: capability }, null, function (err, tokenRequest) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenRequest.capability)).to.deep.equal( - capability, - 'Verify createTokenRequest has JSON-stringified capability' - ); - done(); - } catch (err) { - done(err); - } - }); + var tokenRequest = await rest.auth.createTokenRequest({ capability: capability }, null); + expect(JSON.parse(tokenRequest.capability)).to.deep.equal( + capability, + 'Verify createTokenRequest has JSON-stringified capability' + ); }); /** @@ -541,27 +284,16 @@ define(['chai', 'shared_helper', 'async', 'globals'], function (chai, helper, as * @param {object} params The authParams to be tested */ function testJWTAuthParams(description, params) { - it(description, function (done) { + it(description, async function () { var currentKey = helper.getTestApp().keys[0]; var keys = { keyName: currentKey.keyName, keySecret: currentKey.keySecret }; var authParams = utils.mixin(keys, params); var authUrl = echoServer + '/createJWT' + utils.toQueryString(authParams); var restJWTRequester = helper.AblyRest({ authUrl: authUrl }); - restJWTRequester.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } - var restClient = helper.AblyRest({ token: tokenDetails.token }); - restClient.stats(function (err, stats) { - if (err) { - done(err); - return; - } - done(); - }); - }); + var tokenDetails = await restJWTRequester.auth.requestToken(); + var restClient = helper.AblyRest({ token: tokenDetails.token }); + await restClient.stats(); }); } @@ -580,147 +312,85 @@ define(['chai', 'shared_helper', 'async', 'globals'], function (chai, helper, as }); } - it('JWT request with invalid key', function (done) { + it('JWT request with invalid key', async function () { var keys = { keyName: 'invalid.invalid', keySecret: 'invalidinvalid' }; var authUrl = echoServer + '/createJWT' + utils.toQueryString(keys); var restJWTRequester = helper.AblyRest({ authUrl: authUrl }); - restJWTRequester.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } - var restClient = helper.AblyRest({ token: tokenDetails.token }); - restClient.stats(function (err, stats) { - try { - expect(err.code).to.equal(40400, 'Verify token is invalid because app id does not exist'); - expect(err.statusCode).to.equal(404, 'Verify token is invalid because app id does not exist'); - done(); - return; - } catch (err) { - done(err); - } - }); - }); + var tokenDetails = await restJWTRequester.auth.requestToken(); + var restClient = helper.AblyRest({ token: tokenDetails.token }); + try { + var stats = await restClient.stats(); + } catch (err) { + expect(err.code).to.equal(40400, 'Verify token is invalid because app id does not exist'); + expect(err.statusCode).to.equal(404, 'Verify token is invalid because app id does not exist'); + return; + } + throw new Error('Expected restClient.stats() to throw token error'); }); /* * RSA8g */ - it('Rest JWT with authCallback', function (done) { + it('Rest JWT with authCallback', async function () { var currentKey = helper.getTestApp().keys[0]; var keys = { keyName: currentKey.keyName, keySecret: currentKey.keySecret }; var authUrl = echoServer + '/createJWT' + utils.toQueryString(keys); var restJWTRequester = helper.AblyRest({ authUrl: authUrl }); var authCallback = function (tokenParams, callback) { - restJWTRequester.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } + restJWTRequester.auth.requestToken().then(function (tokenDetails) { callback(null, tokenDetails.token); }); }; var restClient = helper.AblyRest({ authCallback: authCallback }); - restClient.stats(function (err, stats) { - if (err) { - done(err); - return; - } - try { - expect(err).to.equal(null, 'Verify that the error is null'); - done(); - } catch (err) { - done(err); - } - }); + var stats = await restClient.stats(); }); /* * RSA8g */ - it('Rest JWT with authCallback and invalid keys', function (done) { + it('Rest JWT with authCallback and invalid keys', async function () { var keys = { keyName: 'invalid.invalid', keySecret: 'invalidinvalid' }; var authUrl = echoServer + '/createJWT' + utils.toQueryString(keys); var restJWTRequester = helper.AblyRest({ authUrl: authUrl }); var authCallback = function (tokenParams, callback) { - restJWTRequester.auth.requestToken(function (err, tokenDetails) { - if (err) { - done(err); - return; - } + restJWTRequester.auth.requestToken().then(function (tokenDetails) { callback(null, tokenDetails.token); }); }; var restClient = helper.AblyRest({ authCallback: authCallback }); - restClient.stats(function (err, stats) { - try { - expect(err.code).to.equal(40400, 'Verify code is 40400'); - expect(err.statusCode).to.equal(404, 'Verify token is invalid because app id does not exist'); - done(); - } catch (err) { - done(err); - } - }); + try { + await restClient.stats(); + } catch (err) { + expect(err.code).to.equal(40400, 'Verify code is 40400'); + expect(err.statusCode).to.equal(404, 'Verify token is invalid because app id does not exist'); + return; + } + throw new Error('Expected restClient.stats() to throw token error'); }); - it('authCallback is only invoked once on concurrent auth', function (done) { + it('authCallback is only invoked once on concurrent auth', async function () { var authCallbackInvocations = 0; function authCallback(tokenParams, callback) { authCallbackInvocations++; - rest.auth.createTokenRequest(tokenParams, callback); + rest.auth.createTokenRequest(tokenParams).then(function (tokenRequest) { + callback(null, tokenRequest); + }); } /* Example client-side using the token */ var restClient = helper.AblyRest({ authCallback: authCallback }); var channel = restClient.channels.get('auth_concurrent'); - async.parallel([channel.history.bind(channel), channel.history.bind(channel)], function (err) { - try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(authCallbackInvocations).to.equal( - 1, - 'Check authCallback only invoked once -- was: ' + authCallbackInvocations - ); - done(); - } catch (err) { - done(err); - } - }); + await Promise.all([channel.history(), channel.history()]); + expect(authCallbackInvocations).to.equal( + 1, + 'Check authCallback only invoked once -- was: ' + authCallbackInvocations + ); }); - - if (typeof Promise !== 'undefined') { - it('Promise based auth', function (done) { - var rest = helper.AblyRest({ promises: true }); - - var promise1 = rest.auth.requestToken(); - var promise2 = rest.auth.requestToken({ ttl: 200 }); - var promise3 = rest.auth.requestToken({ ttl: 200 }, { key: helper.getTestApp().keys[1].keyStr }); - var promise4 = rest.auth.createTokenRequest(); - var promise5 = rest.auth.createTokenRequest({ ttl: 200 }); - var promise6 = rest.auth.requestToken({ ttl: 200 }, { key: 'bad' })['catch'](function (err) { - expect(true, 'Token attempt with bad key was rejected').to.be.ok; - }); - - Promise.all([promise1, promise2, promise3, promise4, promise5, promise6]) - .then(function (results) { - try { - for (var i = 0; i < 5; i++) { - expect(results[i].token || results[i].nonce).to.be.ok; - } - done(); - } catch (err) { - done(err); - } - }) - ['catch'](function (err) { - done(err); - }); - }); - } }); }); diff --git a/test/rest/batch.test.js b/test/rest/batch.test.js index b4f747311f..9c250c54f4 100644 --- a/test/rest/batch.test.js +++ b/test/rest/batch.test.js @@ -1,8 +1,6 @@ 'use strict'; -// NOTE: All of the Promise-related tests in this file are intentionally a copy of the callback versions. This will allow us to simply remove the callback versions when merging this functionality into the integration/v2 branch (https://github.com/ably/ably-js/issues/1411). - -define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async, chai) { +define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var expect = chai.expect; var closeAndFinish = helper.closeAndFinish; var randomString = helper.randomString; @@ -20,12 +18,12 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); describe('when invoked with an array of specs', function () { - it('performs a batch publish and returns an array of results', function (done) { + it('performs a batch publish and returns an array of results', async function () { const testApp = helper.getTestApp(); const rest = helper.AblyRest({ + promises: true, key: testApp.keys[2].keyStr /* we use this key so that some publishes fail due to capabilities */, }); - const verificationRest = helper.AblyRest(); const specs = [ { @@ -44,303 +42,98 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }, ]; - async.series( - [ - // First, we perform the batch publish request... - function (cb) { - rest.batchPublish(specs, function (err, batchResults) { - if (err) { - cb(err); - return; - } - - try { - expect(batchResults).to.have.lengthOf(specs.length); - - expect(batchResults[0].successCount).to.equal(1); - expect(batchResults[0].failureCount).to.equal(1); - - // Check the results of first BatchPublishSpec - - expect(batchResults[0].results).to.have.lengthOf(2); - - expect(batchResults[0].results[0].channel).to.equal('channel0'); - expect(batchResults[0].results[0].messageId).to.include(':0'); - expect('error' in batchResults[0].results[0]).to.be.false; - - expect(batchResults[0].results[1].channel).to.equal('channel3'); - expect('messageId' in batchResults[0].results[1]).to.be.false; - expect(batchResults[0].results[1].error.statusCode).to.equal(401); - - // Check the results of second BatchPublishSpec - - expect(batchResults[1].results).to.have.lengthOf(2); - - expect(batchResults[1].results[0].channel).to.equal('channel4'); - expect(batchResults[1].results[0].messageId).to.include(':0'); - expect('error' in batchResults[1].results[0]).to.be.false; - - expect(batchResults[1].results[1].channel).to.equal('channel5'); - expect('messageId' in batchResults[1].results[1]).to.be.false; - expect(batchResults[1].results[1].error.statusCode).to.equal(401); - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, - function (cb) { - // ...and now we use channel history to check that the expected messages have been published. - async.parallel( - [ - function (cb) { - const channel0 = verificationRest.channels.get('channel0'); - channel0.history({ limit: 2 }, function (err, result) { - if (err) { - cb(err); - return; - } - - const data = new Set([result.items[0].data, result.items[1].data]); - - try { - expect(data).to.deep.equal(new Set(['message1', 'message2'])); - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, - function (cb) { - const channel4 = verificationRest.channels.get('channel4'); - channel4.history({ limit: 2 }, function (err, result) { - if (err) { - cb(err); - return; - } - - const data = new Set([result.items[0].data, result.items[1].data]); - try { - expect(data).to.deep.equal(new Set(['message3', 'message4'])); - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, - ], - cb - ); - }, - ], - done - ); - }); - }); + // First, we perform the batch publish request... + const batchResults = await rest.batchPublish(specs); - describe('when invoked with a single spec', function () { - it('performs a batch publish and returns a single result', function (done) { - const testApp = helper.getTestApp(); - const rest = helper.AblyRest({ - key: testApp.keys[2].keyStr /* we use this key so that some publishes fail due to capabilities */, - }); - const verificationRest = helper.AblyRest(); + expect(batchResults).to.have.lengthOf(specs.length); - const spec = { - channels: [ - 'channel0' /* key allows publishing to this channel */, - 'channel3' /* key does not allow publishing to this channel */, - ], - messages: [{ data: 'message1' }, { data: 'message2' }], - }; + expect(batchResults[0].successCount).to.equal(1); + expect(batchResults[0].failureCount).to.equal(1); - async.series( - [ - // First, we perform the batch publish request... - function (cb) { - rest.batchPublish(spec, function (err, batchResult) { - if (err) { - cb(err); - return; - } - - try { - expect(batchResult.successCount).to.equal(1); - expect(batchResult.failureCount).to.equal(1); - - expect(batchResult.results).to.have.lengthOf(2); - - expect(batchResult.results[0].channel).to.equal('channel0'); - expect(batchResult.results[0].messageId).to.include(':0'); - expect('error' in batchResult.results[0]).to.be.false; - - expect(batchResult.results[1].channel).to.equal('channel3'); - expect('messageId' in batchResult.results[1]).to.be.false; - expect(batchResult.results[1].error.statusCode).to.equal(401); - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, - function (cb) { - // ...and now we use channel history to check that the expected messages have been published. - const channel0 = verificationRest.channels.get('channel0'); - channel0.history({ limit: 2 }, function (err, result) { - if (err) { - cb(err); - return; - } - - const data = new Set([result.items[0].data, result.items[1].data]); - try { - expect(data).to.deep.equal(new Set(['message1', 'message2'])); - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, - ], - done - ); - }); - }); + // Check the results of first BatchPublishSpec - if (typeof Promise !== 'undefined') { - describe('using promises', function () { - describe('when invoked with an array of specs', function () { - it('performs a batch publish and returns an array of results', async function () { - const testApp = helper.getTestApp(); - const rest = helper.AblyRest({ - promises: true, - key: testApp.keys[2].keyStr /* we use this key so that some publishes fail due to capabilities */, - }); + expect(batchResults[0].results).to.have.lengthOf(2); - const specs = [ - { - channels: [ - 'channel0' /* key allows publishing to this channel */, - 'channel3' /* key does not allow publishing to this channel */, - ], - messages: [{ data: 'message1' }, { data: 'message2' }], - }, - { - channels: [ - 'channel4' /* key allows publishing to this channel */, - 'channel5' /* key does not allow publishing to this channel */, - ], - messages: [{ data: 'message3' }, { data: 'message4' }], - }, - ]; + expect(batchResults[0].results[0].channel).to.equal('channel0'); + expect(batchResults[0].results[0].messageId).to.include(':0'); + expect('error' in batchResults[0].results[0]).to.be.false; - // First, we perform the batch publish request... - const batchResults = await rest.batchPublish(specs); + expect(batchResults[0].results[1].channel).to.equal('channel3'); + expect('messageId' in batchResults[0].results[1]).to.be.false; + expect(batchResults[0].results[1].error.statusCode).to.equal(401); - expect(batchResults).to.have.lengthOf(specs.length); + // Check the results of second BatchPublishSpec - expect(batchResults[0].successCount).to.equal(1); - expect(batchResults[0].failureCount).to.equal(1); + expect(batchResults[1].results).to.have.lengthOf(2); - // Check the results of first BatchPublishSpec + expect(batchResults[1].results[0].channel).to.equal('channel4'); + expect(batchResults[1].results[0].messageId).to.include(':0'); + expect('error' in batchResults[1].results[0]).to.be.false; - expect(batchResults[0].results).to.have.lengthOf(2); + expect(batchResults[1].results[1].channel).to.equal('channel5'); + expect('messageId' in batchResults[1].results[1]).to.be.false; + expect(batchResults[1].results[1].error.statusCode).to.equal(401); - expect(batchResults[0].results[0].channel).to.equal('channel0'); - expect(batchResults[0].results[0].messageId).to.include(':0'); - expect('error' in batchResults[0].results[0]).to.be.false; + // ...and now we use channel history to check that the expected messages have been published. + const verificationRest = helper.AblyRest({ promises: true }); - expect(batchResults[0].results[1].channel).to.equal('channel3'); - expect('messageId' in batchResults[0].results[1]).to.be.false; - expect(batchResults[0].results[1].error.statusCode).to.equal(401); + const channel0 = verificationRest.channels.get('channel0'); + const channel0HistoryPromise = channel0.history({ limit: 2 }); - // Check the results of second BatchPublishSpec + const channel4 = verificationRest.channels.get('channel4'); + const channel4HistoryPromise = channel4.history({ limit: 2 }); - expect(batchResults[1].results).to.have.lengthOf(2); + const [channel0History, channel4History] = await Promise.all([channel0HistoryPromise, channel4HistoryPromise]); - expect(batchResults[1].results[0].channel).to.equal('channel4'); - expect(batchResults[1].results[0].messageId).to.include(':0'); - expect('error' in batchResults[1].results[0]).to.be.false; + const channel0HistoryData = new Set([channel0History.items[0].data, channel0History.items[1].data]); + expect(channel0HistoryData).to.deep.equal(new Set(['message1', 'message2'])); - expect(batchResults[1].results[1].channel).to.equal('channel5'); - expect('messageId' in batchResults[1].results[1]).to.be.false; - expect(batchResults[1].results[1].error.statusCode).to.equal(401); + const channel4HistoryData = new Set([channel4History.items[0].data, channel4History.items[1].data]); + expect(channel4HistoryData).to.deep.equal(new Set(['message3', 'message4'])); + }); + }); - // ...and now we use channel history to check that the expected messages have been published. - const verificationRest = helper.AblyRest({ promises: true }); + describe('when invoked with a single spec', function () { + it('performs a batch publish and returns a single result', async function () { + const testApp = helper.getTestApp(); + const rest = helper.AblyRest({ + promises: true, + key: testApp.keys[2].keyStr /* we use this key so that some publishes fail due to capabilities */, + }); - const channel0 = verificationRest.channels.get('channel0'); - const channel0HistoryPromise = channel0.history({ limit: 2 }); + const spec = { + channels: [ + 'channel0' /* key allows publishing to this channel */, + 'channel3' /* key does not allow publishing to this channel */, + ], + messages: [{ data: 'message1' }, { data: 'message2' }], + }; - const channel4 = verificationRest.channels.get('channel4'); - const channel4HistoryPromise = channel4.history({ limit: 2 }); + // First, we perform the batch publish request... + const batchResult = await rest.batchPublish(spec); - const [channel0History, channel4History] = await Promise.all([ - channel0HistoryPromise, - channel4HistoryPromise, - ]); + expect(batchResult.successCount).to.equal(1); + expect(batchResult.failureCount).to.equal(1); - const channel0HistoryData = new Set([channel0History.items[0].data, channel0History.items[1].data]); - expect(channel0HistoryData).to.deep.equal(new Set(['message1', 'message2'])); + expect(batchResult.results).to.have.lengthOf(2); - const channel4HistoryData = new Set([channel4History.items[0].data, channel4History.items[1].data]); - expect(channel4HistoryData).to.deep.equal(new Set(['message3', 'message4'])); - }); - }); + expect(batchResult.results[0].channel).to.equal('channel0'); + expect(batchResult.results[0].messageId).to.include(':0'); + expect('error' in batchResult.results[0]).to.be.false; - describe('when invoked with a single spec', function () { - it('performs a batch publish and returns a single result', async function () { - const testApp = helper.getTestApp(); - const rest = helper.AblyRest({ - promises: true, - key: testApp.keys[2].keyStr /* we use this key so that some publishes fail due to capabilities */, - }); - - const spec = { - channels: [ - 'channel0' /* key allows publishing to this channel */, - 'channel3' /* key does not allow publishing to this channel */, - ], - messages: [{ data: 'message1' }, { data: 'message2' }], - }; - - // First, we perform the batch publish request... - const batchResult = await rest.batchPublish(spec); - - expect(batchResult.successCount).to.equal(1); - expect(batchResult.failureCount).to.equal(1); - - expect(batchResult.results).to.have.lengthOf(2); - - expect(batchResult.results[0].channel).to.equal('channel0'); - expect(batchResult.results[0].messageId).to.include(':0'); - expect('error' in batchResult.results[0]).to.be.false; - - expect(batchResult.results[1].channel).to.equal('channel3'); - expect('messageId' in batchResult.results[1]).to.be.false; - expect(batchResult.results[1].error.statusCode).to.equal(401); - - // ...and now we use channel history to check that the expected messages have been published. - const verificationRest = helper.AblyRest({ promises: true }); - const channel0 = verificationRest.channels.get('channel0'); - const channel0History = await channel0.history({ limit: 2 }); - - const channel0HistoryData = new Set([channel0History.items[0].data, channel0History.items[1].data]); - expect(channel0HistoryData).to.deep.equal(new Set(['message1', 'message2'])); - }); - }); + expect(batchResult.results[1].channel).to.equal('channel3'); + expect('messageId' in batchResult.results[1]).to.be.false; + expect(batchResult.results[1].error.statusCode).to.equal(401); + + // ...and now we use channel history to check that the expected messages have been published. + const verificationRest = helper.AblyRest({ promises: true }); + const channel0 = verificationRest.channels.get('channel0'); + const channel0History = await channel0.history({ limit: 2 }); + + const channel0HistoryData = new Set([channel0History.items[0].data, channel0History.items[1].data]); + expect(channel0HistoryData).to.deep.equal(new Set(['message1', 'message2'])); }); - } + }); }); describe('rest/batchPresence', function () { @@ -355,122 +148,53 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }); - it('performs a batch presence fetch and returns a result', function (done) { + it('performs a batch presence fetch and returns a result', async function () { const testApp = helper.getTestApp(); const rest = helper.AblyRest({ + promises: true, key: testApp.keys[2].keyStr /* we use this key so that some presence fetches fail due to capabilities */, }); - const presenceEnterRealtime = helper.AblyRealtime( - { - clientId: 'batchPresenceTest', - } /* note that the key used here has no capability limitations, so that we can use this instance to enter presence below */ - ); + const presenceEnterRealtime = helper.AblyRealtime({ + promises: true, + clientId: + 'batchPresenceTest' /* note that the key used here has no capability limitations, so that we can use this instance to enter presence below */, + }); const channelNames = [ 'channel0' /* key does not allow presence on this channel */, 'channel4' /* key allows presence on this channel */, ]; - async.series( - [ - // First, we enter presence on two channels... - function (cb) { - presenceEnterRealtime.channels.get('channel0').presence.enter(cb); - }, - function (cb) { - presenceEnterRealtime.channels.get('channel4').presence.enter(cb); - }, - // ...and now we perform the batch presence request. - function (cb) { - rest.batchPresence(channelNames, function (err, batchResult) { - if (err) { - cb(err); - } - - try { - expect(batchResult.successCount).to.equal(1); - expect(batchResult.failureCount).to.equal(1); - - // Check that the channel0 presence fetch request fails (due to key’s capabilities, as mentioned above) - - expect(batchResult.results[0].channel).to.equal('channel0'); - expect('presence' in batchResult.results[0]).to.be.false; - expect(batchResult.results[0].error.statusCode).to.equal(401); - - // Check that the channel4 presence fetch request reflects the presence enter performed above - - expect(batchResult.results[1].channel).to.equal('channel4'); - expect(batchResult.results[1].presence).to.have.lengthOf(1); - expect(batchResult.results[1].presence[0].clientId).to.equal('batchPresenceTest'); - expect('error' in batchResult.results[1]).to.be.false; - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, - function (cb) { - closeAndFinish(cb, presenceEnterRealtime); - }, - ], - done - ); - }); - - if (typeof Promise !== 'undefined') { - describe('using promises', function () { - it('performs a batch presence fetch and returns a result', async function () { - const testApp = helper.getTestApp(); - const rest = helper.AblyRest({ - promises: true, - key: testApp.keys[2].keyStr /* we use this key so that some presence fetches fail due to capabilities */, - }); - - const presenceEnterRealtime = helper.AblyRealtime({ - promises: true, - clientId: - 'batchPresenceTest' /* note that the key used here has no capability limitations, so that we can use this instance to enter presence below */, - }); - - const channelNames = [ - 'channel0' /* key does not allow presence on this channel */, - 'channel4' /* key allows presence on this channel */, - ]; + // First, we enter presence on two channels... + await presenceEnterRealtime.channels.get('channel0').presence.enter(); + await presenceEnterRealtime.channels.get('channel4').presence.enter(); - // First, we enter presence on two channels... - await presenceEnterRealtime.channels.get('channel0').presence.enter(); - await presenceEnterRealtime.channels.get('channel4').presence.enter(); + // ...and now we perform the batch presence request. + const batchResult = await rest.batchPresence(channelNames); - // ...and now we perform the batch presence request. - const batchResult = await rest.batchPresence(channelNames); + expect(batchResult.successCount).to.equal(1); + expect(batchResult.failureCount).to.equal(1); - expect(batchResult.successCount).to.equal(1); - expect(batchResult.failureCount).to.equal(1); + // Check that the channel0 presence fetch request fails (due to key’s capabilities, as mentioned above) - // Check that the channel0 presence fetch request fails (due to key’s capabilities, as mentioned above) + expect(batchResult.results[0].channel).to.equal('channel0'); + expect('presence' in batchResult.results[0]).to.be.false; + expect(batchResult.results[0].error.statusCode).to.equal(401); - expect(batchResult.results[0].channel).to.equal('channel0'); - expect('presence' in batchResult.results[0]).to.be.false; - expect(batchResult.results[0].error.statusCode).to.equal(401); + // Check that the channel4 presence fetch request reflects the presence enter performed above - // Check that the channel4 presence fetch request reflects the presence enter performed above + expect(batchResult.results[1].channel).to.equal('channel4'); + expect(batchResult.results[1].presence).to.have.lengthOf(1); + expect(batchResult.results[1].presence[0].clientId).to.equal('batchPresenceTest'); + expect('error' in batchResult.results[1]).to.be.false; - expect(batchResult.results[1].channel).to.equal('channel4'); - expect(batchResult.results[1].presence).to.have.lengthOf(1); - expect(batchResult.results[1].presence[0].clientId).to.equal('batchPresenceTest'); - expect('error' in batchResult.results[1]).to.be.false; - - await new Promise((resolve, reject) => { - closeAndFinish((err) => { - err ? reject(err) : resolve(); - }, presenceEnterRealtime); - }); - }); + await new Promise((resolve, reject) => { + closeAndFinish((err) => { + err ? reject(err) : resolve(); + }, presenceEnterRealtime); }); - } + }); }); describe('rest/revokeTokens', function () { @@ -485,250 +209,115 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }); - it('revokes tokens matching the given specifiers', function (done) { + it('revokes tokens matching the given specifiers', async function () { const testApp = helper.getTestApp(); const rest = helper.AblyRest({ + promises: true, key: testApp.keys[4].keyStr /* this key has revocableTokens enabled */, }); const clientId1 = `clientId1-${randomString()}`; const clientId2 = `clientId2-${randomString()}`; - let clientId1TokenDetails; - let clientId2TokenDetails; - - let clientId1Realtime; - let clientId2Realtime; - - // These (result, callback) pairings are a dance to simulate a Promise (specificially the fact that the order of the { resolve, then } operations doesn’t matter); see the promise-based version of this test - let clientId1RealtimeDisconnectedStateChange; - let onClientId1RealtimeDisconnected; - let clientId2RealtimeDisconnectedStateChange; - let onClientId2RealtimeDisconnected; - - async.series( - [ - function (cb) { - // First, we fetch tokens for a couple of different clientIds... - async.parallel( - [ - function (cb) { - rest.auth.requestToken({ clientId: clientId1 }, function (err, tokenDetails) { - if (err) { - cb(err); - return; - } - - clientId1TokenDetails = tokenDetails; - cb(); - }); - }, - function (cb) { - rest.auth.requestToken({ clientId: clientId2 }, function (err, tokenDetails) { - if (err) { - cb(err); - return; - } - - clientId2TokenDetails = tokenDetails; - cb(); - }); - }, - ], - cb - ); - }, - function (cb) { - // ...then, we set up Realtime instances that use these tokens and wait for them to become CONNECTED... - async.parallel( - [ - function (cb) { - clientId1Realtime = helper.AblyRealtime({ token: clientId1TokenDetails }); - clientId1Realtime.connection.once('connected', function () { - cb(); - }); - }, - function (cb) { - clientId2Realtime = helper.AblyRealtime({ token: clientId2TokenDetails }); - clientId2Realtime.connection.once('connected', function () { - cb(); - }); - }, - ], - cb - ); - }, - function (cb) { - // ...then, we set up listeners that will record the state change when these Realtime instances become DISCONNECTED (we need to set up these listeners here, before performing the revocation request, else we might miss the DISCONNECTED state changes that the token revocation provokes, and end up only seeing the subsequent RSA4a2-induced FAILED state change, which due to https://github.com/ably/ably-js/issues/1409 does not expose the 40141 "token revoked" error code)... - // - // Note: - // - // We use Realtime instances for verifying the side effects of a token revocation, as opposed to, say, trying to perform a REST request, because the nature of the Ably service is that token verification may take a small delay to become active, and so there's no guarantee that a REST request peformed immediately after a revocation request would fail. See discussion at https://ably-real-time.slack.com/archives/C030C5YLY/p1690322740850269?thread_ts=1690315022.372729&cid=C030C5YLY. - - clientId1Realtime.connection.once('disconnected', function (stateChange) { - clientId1RealtimeDisconnectedStateChange = stateChange; - if (onClientId1RealtimeDisconnected) { - onClientId1RealtimeDisconnected(); - } - }); - - clientId2Realtime.connection.once('disconnected', function (stateChange) { - clientId2RealtimeDisconnectedStateChange = stateChange; - if (onClientId2RealtimeDisconnected) { - onClientId2RealtimeDisconnected(); - } - }); - - cb(); - }, - function (cb) { - // ...then, we revoke all tokens for these clientIds... - - const specifiers = [ - { type: 'clientId', value: clientId1 }, - { type: 'clientId', value: clientId2 }, - { type: 'invalidType', value: 'abc' }, // we include an invalid specifier type to provoke a non-zero failureCount - ]; - - rest.auth.revokeTokens(specifiers, function (err, result) { - if (err) { - cb(err); - return; - } - - try { - // ...and check the response from the revocation request... - expect(result.successCount).to.equal(2); - expect(result.failureCount).to.equal(1); - expect(result.results).to.have.lengthOf(3); - - expect(result.results[0].target).to.equal(`clientId:${clientId1}`); - expect(typeof result.results[0].issuedBefore).to.equal('number'); - expect(typeof result.results[0].appliesAt).to.equal('number'); - expect('error' in result.results[0]).to.be.false; - - expect(result.results[1].target).to.equal(`clientId:${clientId2}`); - expect(typeof result.results[1].issuedBefore).to.equal('number'); - expect(typeof result.results[1].appliesAt).to.equal('number'); - expect('error' in result.results[1]).to.be.false; - - expect(result.results[2].target).to.equal('invalidType:abc'); - expect(result.results[2].error.statusCode).to.equal(400); - } catch (err) { - cb(err); - return; - } - - cb(); - }); - }, + // First, we fetch tokens for a couple of different clientIds... + const [clientId1TokenDetails, clientId2TokenDetails] = await Promise.all([ + rest.auth.requestToken({ clientId: clientId1 }), + rest.auth.requestToken({ clientId: clientId2 }), + ]); - // ...and then, we check that the Realtime instances transition to the DISCONNECTED state due to a "token revoked" (40141) error. - function (cb) { - async.parallel( - [ - function (cb) { - onClientId1RealtimeDisconnected = function () { - try { - expect(clientId1RealtimeDisconnectedStateChange.reason.code).to.equal(40141 /* token revoked */); - } catch (err) { - cb(err); - return; - } - cb(); - }; - if (clientId1RealtimeDisconnectedStateChange) { - onClientId1RealtimeDisconnected(); - } - }, - function (cb) { - onClientId2RealtimeDisconnected = function () { - try { - expect(clientId2RealtimeDisconnectedStateChange.reason.code).to.equal(40141 /* token revoked */); - } catch (err) { - cb(err); - return; - } - cb(); - }; - if (clientId2RealtimeDisconnectedStateChange) { - onClientId2RealtimeDisconnected(); - } - }, - ], - cb - ); - }, - function (cb) { - async.parallel( - [ - function (cb) { - closeAndFinish(cb, clientId1Realtime); - }, - function (cb) { - closeAndFinish(cb, clientId2Realtime); - }, - ], - cb - ); - }, - ], - done + // ...then, we set up Realtime instances that use these tokens and wait for them to become CONNECTED... + const clientId1Realtime = helper.AblyRealtime({ + promises: true, + token: clientId1TokenDetails, + }); + const clientId2Realtime = helper.AblyRealtime({ + promises: true, + token: clientId2TokenDetails, + }); + + await Promise.all([ + clientId1Realtime.connection.once('connected'), + clientId2Realtime.connection.once('connected'), + ]); + + // ...then, we set up listeners that will record the state change when these Realtime instances become DISCONNECTED (we need to set up these listeners here, before performing the revocation request, else we might miss the DISCONNECTED state changes that the token revocation provokes, and end up only seeing the subsequent RSA4a2-induced FAILED state change, which due to https://github.com/ably/ably-js/issues/1409 does not expose the 40141 "token revoked" error code)... + // + // Note: + // + // We use Realtime instances for verifying the side effects of a token revocation, as opposed to, say, trying to perform a REST request, because the nature of the Ably service is that token revocation may take a small delay to become active, and so there's no guarantee that a REST request peformed immediately after a revocation request would fail. See discussion at https://ably-real-time.slack.com/archives/C030C5YLY/p1690322740850269?thread_ts=1690315022.372729&cid=C030C5YLY. + const clientId1RealtimeDisconnectedStateChangePromise = clientId1Realtime.connection.once('disconnected'); + const clientId2RealtimeDisconnectedStateChangePromise = clientId2Realtime.connection.once('disconnected'); + + // ...then, we revoke all tokens for these clientIds... + + const specifiers = [ + { type: 'clientId', value: clientId1 }, + { type: 'clientId', value: clientId2 }, + { type: 'invalidType', value: 'abc' }, // we include an invalid specifier type to provoke a non-zero failureCount + ]; + + const result = await rest.auth.revokeTokens(specifiers); + + // ...and check the response from the revocation request... + expect(result.successCount).to.equal(2); + expect(result.failureCount).to.equal(1); + expect(result.results).to.have.lengthOf(3); + + expect(result.results[0].target).to.equal(`clientId:${clientId1}`); + expect(typeof result.results[0].issuedBefore).to.equal('number'); + expect(typeof result.results[0].appliesAt).to.equal('number'); + expect('error' in result.results[0]).to.be.false; + + expect(result.results[1].target).to.equal(`clientId:${clientId2}`); + expect(typeof result.results[1].issuedBefore).to.equal('number'); + expect(typeof result.results[1].appliesAt).to.equal('number'); + expect('error' in result.results[1]).to.be.false; + + expect(result.results[2].target).to.equal('invalidType:abc'); + expect(result.results[2].error.statusCode).to.equal(400); + + // ...and then, we check that the Realtime instances transition to the DISCONNECTED state due to a "token revoked" (40141) error. + const [clientId1RealtimeDisconnectedStateChange, clientId2RealtimeDisconnectedStateChange] = await Promise.all([ + clientId1RealtimeDisconnectedStateChangePromise, + clientId2RealtimeDisconnectedStateChangePromise, + ]); + + expect(clientId1RealtimeDisconnectedStateChange.reason.code).to.equal(40141 /* token revoked */); + expect(clientId2RealtimeDisconnectedStateChange.reason.code).to.equal(40141 /* token revoked */); + + await Promise.all( + [clientId1Realtime, clientId2Realtime].map((realtime) => { + new Promise((resolve, reject) => { + closeAndFinish((err) => { + err ? reject(err) : resolve(); + }, realtime); + }); + }) ); }); - it('accepts optional issuedBefore and allowReauthMargin parameters', function (done) { + it('accepts optional issuedBefore and allowReauthMargin parameters', async function () { const testApp = helper.getTestApp(); const rest = helper.AblyRest({ + promises: true, key: testApp.keys[4].keyStr /* this key has revocableTokens enabled */, }); const clientId = `clientId-${randomString()}`; - let serverTimeAtStartOfTest; - - async.series( - [ - function (cb) { - rest.time(function (err, time) { - if (err) { - cb(err); - return; - } - serverTimeAtStartOfTest = time; - cb(); - }); - }, - function (cb) { - const issuedBefore = serverTimeAtStartOfTest - 20 * 60 * 1000; // i.e. ~20 minutes ago (arbitrarily chosen) - - rest.auth.revokeTokens( - [{ type: 'clientId', value: clientId }], - { issuedBefore, allowReauthMargin: true }, - function (err, result) { - if (err) { - cb(err); - return; - } - - try { - expect(result.results[0].issuedBefore).to.equal(issuedBefore); - - // Verify the expected side effect of allowReauthMargin, which is to delay the revocation by 30 seconds - const serverTimeThirtySecondsAfterStartOfTest = serverTimeAtStartOfTest + 30 * 1000; - expect(result.results[0].appliesAt).to.be.greaterThan(serverTimeThirtySecondsAfterStartOfTest); - } catch (err) { - cb(err); - return; - } - - cb(); - } - ); - }, - ], - done - ); + const serverTimeAtStartOfTest = await rest.time(); + const issuedBefore = serverTimeAtStartOfTest - 20 * 60 * 1000; // i.e. ~20 minutes ago (arbitrarily chosen) + + const result = await rest.auth.revokeTokens([{ type: 'clientId', value: clientId }], { + issuedBefore, + allowReauthMargin: true, + }); + + expect(result.results[0].issuedBefore).to.equal(issuedBefore); + + // Verify the expected side effect of allowReauthMargin, which is to delay the revocation by 30 seconds + const serverTimeThirtySecondsAfterStartOfTest = serverTimeAtStartOfTest + 30 * 1000; + expect(result.results[0].appliesAt).to.be.greaterThan(serverTimeThirtySecondsAfterStartOfTest); }); it('throws an error when using token auth', function () { @@ -747,121 +336,5 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async expect(verifiedError).to.be.true; }); - - if (typeof Promise !== 'undefined') { - describe('using promises', function () { - it('revokes tokens matching the given specifiers', async function () { - const testApp = helper.getTestApp(); - const rest = helper.AblyRest({ - promises: true, - key: testApp.keys[4].keyStr /* this key has revocableTokens enabled */, - }); - - const clientId1 = `clientId1-${randomString()}`; - const clientId2 = `clientId2-${randomString()}`; - - // First, we fetch tokens for a couple of different clientIds... - const [clientId1TokenDetails, clientId2TokenDetails] = await Promise.all([ - rest.auth.requestToken({ clientId: clientId1 }), - rest.auth.requestToken({ clientId: clientId2 }), - ]); - - // ...then, we set up Realtime instances that use these tokens and wait for them to become CONNECTED... - const clientId1Realtime = helper.AblyRealtime({ - promises: true, - token: clientId1TokenDetails, - }); - const clientId2Realtime = helper.AblyRealtime({ - promises: true, - token: clientId2TokenDetails, - }); - - await Promise.all([ - clientId1Realtime.connection.once('connected'), - clientId2Realtime.connection.once('connected'), - ]); - - // ...then, we set up listeners that will record the state change when these Realtime instances become DISCONNECTED (we need to set up these listeners here, before performing the revocation request, else we might miss the DISCONNECTED state changes that the token revocation provokes, and end up only seeing the subsequent RSA4a2-induced FAILED state change, which due to https://github.com/ably/ably-js/issues/1409 does not expose the 40141 "token revoked" error code)... - // - // Note: - // - // We use Realtime instances for verifying the side effects of a token revocation, as opposed to, say, trying to perform a REST request, because the nature of the Ably service is that token revocation may take a small delay to become active, and so there's no guarantee that a REST request peformed immediately after a revocation request would fail. See discussion at https://ably-real-time.slack.com/archives/C030C5YLY/p1690322740850269?thread_ts=1690315022.372729&cid=C030C5YLY. - const clientId1RealtimeDisconnectedStateChangePromise = clientId1Realtime.connection.once('disconnected'); - const clientId2RealtimeDisconnectedStateChangePromise = clientId2Realtime.connection.once('disconnected'); - - // ...then, we revoke all tokens for these clientIds... - - const specifiers = [ - { type: 'clientId', value: clientId1 }, - { type: 'clientId', value: clientId2 }, - { type: 'invalidType', value: 'abc' }, // we include an invalid specifier type to provoke a non-zero failureCount - ]; - - const result = await rest.auth.revokeTokens(specifiers); - - // ...and check the response from the revocation request... - expect(result.successCount).to.equal(2); - expect(result.failureCount).to.equal(1); - expect(result.results).to.have.lengthOf(3); - - expect(result.results[0].target).to.equal(`clientId:${clientId1}`); - expect(typeof result.results[0].issuedBefore).to.equal('number'); - expect(typeof result.results[0].appliesAt).to.equal('number'); - expect('error' in result.results[0]).to.be.false; - - expect(result.results[1].target).to.equal(`clientId:${clientId2}`); - expect(typeof result.results[1].issuedBefore).to.equal('number'); - expect(typeof result.results[1].appliesAt).to.equal('number'); - expect('error' in result.results[1]).to.be.false; - - expect(result.results[2].target).to.equal('invalidType:abc'); - expect(result.results[2].error.statusCode).to.equal(400); - - // ...and then, we check that the Realtime instances transition to the DISCONNECTED state due to a "token revoked" (40141) error. - const [clientId1RealtimeDisconnectedStateChange, clientId2RealtimeDisconnectedStateChange] = - await Promise.all([ - clientId1RealtimeDisconnectedStateChangePromise, - clientId2RealtimeDisconnectedStateChangePromise, - ]); - - expect(clientId1RealtimeDisconnectedStateChange.reason.code).to.equal(40141 /* token revoked */); - expect(clientId2RealtimeDisconnectedStateChange.reason.code).to.equal(40141 /* token revoked */); - - await Promise.all( - [clientId1Realtime, clientId2Realtime].map((realtime) => { - new Promise((resolve, reject) => { - closeAndFinish((err) => { - err ? reject(err) : resolve(); - }, realtime); - }); - }) - ); - }); - - it('accepts optional issuedBefore and allowReauthMargin parameters', async function () { - const testApp = helper.getTestApp(); - const rest = helper.AblyRest({ - promises: true, - key: testApp.keys[4].keyStr /* this key has revocableTokens enabled */, - }); - - const clientId = `clientId-${randomString()}`; - - const serverTimeAtStartOfTest = await rest.time(); - const issuedBefore = serverTimeAtStartOfTest - 20 * 60 * 1000; // i.e. ~20 minutes ago (arbitrarily chosen) - - const result = await rest.auth.revokeTokens([{ type: 'clientId', value: clientId }], { - issuedBefore, - allowReauthMargin: true, - }); - - expect(result.results[0].issuedBefore).to.equal(issuedBefore); - - // Verify the expected side effect of allowReauthMargin, which is to delay the revocation by 30 seconds - const serverTimeThirtySecondsAfterStartOfTest = serverTimeAtStartOfTest + 30 * 1000; - expect(result.results[0].appliesAt).to.be.greaterThan(serverTimeThirtySecondsAfterStartOfTest); - }); - }); - } }); }); diff --git a/test/rest/bufferutils.test.js b/test/rest/bufferutils.test.js index 86b56da784..f7673deee5 100644 --- a/test/rest/bufferutils.test.js +++ b/test/rest/bufferutils.test.js @@ -6,9 +6,6 @@ define(['ably', 'chai'], function (Ably, chai) { var testString = 'test'; var testBase64 = 'dGVzdA=='; var testHex = '74657374'; - function isWordArray(ob) { - return ob !== null && ob !== undefined && ob.sigBytes !== undefined; - } describe('rest/bufferutils', function () { it('Basic encoding and decoding', function () { @@ -22,16 +19,16 @@ define(['ably', 'chai'], function (Ably, chai) { /* compare */ expect( - BufferUtils.bufferCompare(BufferUtils.utf8Encode(testString), BufferUtils.utf8Encode(testString)) - ).to.equal(0); + BufferUtils.areBuffersEqual(BufferUtils.utf8Encode(testString), BufferUtils.utf8Encode(testString)) + ).to.equal(true); expect( - BufferUtils.bufferCompare(BufferUtils.utf8Encode(testString), BufferUtils.utf8Encode('other')) - ).to.not.equal(0); + BufferUtils.areBuffersEqual(BufferUtils.utf8Encode(testString), BufferUtils.utf8Encode('other')) + ).to.not.equal(true); }); /* In node it's idiomatic for most methods dealing with binary data to * return Buffers. In the browser it's more idiomatic to return - * ArrayBuffers (or in browser too old to support ArrayBuffer, wordarrays). */ + * ArrayBuffers */ it('BufferUtils return correct types', function () { if (typeof Buffer !== 'undefined') { /* node */ @@ -40,23 +37,13 @@ define(['ably', 'chai'], function (Ably, chai) { expect(BufferUtils.base64Decode(testBase64).constructor).to.equal(Buffer); expect(BufferUtils.toBuffer(BufferUtils.utf8Encode(testString)).constructor).to.equal(Buffer); expect(BufferUtils.toArrayBuffer(BufferUtils.utf8Encode(testString)).constructor).to.equal(ArrayBuffer); - } else if (typeof ArrayBuffer !== 'undefined') { + } else { /* modern browsers */ - if (typeof TextDecoder !== 'undefined') { - expect(BufferUtils.utf8Encode(testString).constructor).to.equal(ArrayBuffer); - } else { - expect(isWordArray(BufferUtils.utf8Encode(testString))).to.be.ok; - } + expect(BufferUtils.utf8Encode(testString).constructor).to.equal(ArrayBuffer); expect(BufferUtils.hexDecode(testHex).constructor).to.equal(ArrayBuffer); expect(BufferUtils.base64Decode(testBase64).constructor).to.equal(ArrayBuffer); expect(BufferUtils.toBuffer(BufferUtils.utf8Encode(testString)).constructor).to.equal(Uint8Array); expect(BufferUtils.toArrayBuffer(BufferUtils.utf8Encode(testString)).constructor).to.equal(ArrayBuffer); - } else { - /* legacy browsers */ - expect(isWordArray(BufferUtils.utf8Encode(testString))).to.be.ok; - expect(isWordArray(BufferUtils.hexDecode(testHex))).to.be.ok; - expect(isWordArray(BufferUtils.base64Decode(testBase64))).to.be.ok; - expect(isWordArray(BufferUtils.toWordArray(BufferUtils.utf8Encode(testString)))).to.be.ok; } }); }); diff --git a/test/rest/capability.test.js b/test/rest/capability.test.js index 60e4172e73..6684cce8b4 100644 --- a/test/rest/capability.test.js +++ b/test/rest/capability.test.js @@ -19,266 +19,148 @@ define(['shared_helper', 'chai'], function (helper, chai) { this.timeout(60 * 1000); before(function (done) { - helper.setupApp(function (err) { - if (err) { - done(err); - return; - } - - rest = helper.AblyRest(); + helper.setupApp(function () { + rest = helper.AblyRest({ queryTime: true }); testApp = helper.getTestApp(); - rest.time(function (err, time) { - if (err) { + rest + .time() + .then(function (time) { + currentTime = time; + expect(true, 'Obtained time').to.be.ok; + done(); + }) + .catch(function (err) { done(err); - return; - } - currentTime = time; - done(); - }); + }); }); }); - it('Blanket intersection with specified key', function (done) { + it('Blanket intersection with specified key', async function () { var testKeyOpts = { key: testApp.keys[1].keyStr }; var testCapability = JSON.parse(testApp.keys[1].capability); - rest.auth.requestToken(null, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); - done(); - } catch (e) { - done(e); - } - }); + var tokenDetails = await rest.auth.requestToken(null, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); }); - it('Equal intersection with specified key', function (done) { + it('Equal intersection with specified key', async function () { var testKeyOpts = { key: testApp.keys[1].keyStr }; var testCapability = JSON.parse(testApp.keys[1].capability); - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(testCapability, 'Verify token capability'); }); - it('Empty ops intersection', function (done) { + it('Empty ops intersection', async function () { var testKeyOpts = { key: testApp.keys[1].keyStr }; var testCapability = { 'canpublish:test': ['subscribe'] }; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(401, 'Verify request rejected with insufficient capability'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Invalid capability, expected rejection')); - }); + try { + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + } catch (err) { + expect(err.statusCode).to.equal(401, 'Verify request rejected with insufficient capability'); + return; + } + expect.fail('Invalid capability, expected rejection'); }); - it('Empty paths intersection', function (done) { + it('Empty paths intersection', async function () { var testKeyOpts = { key: testApp.keys[2].keyStr }; var testCapability = { channelx: ['publish'] }; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(401, 'Verify request rejected with insufficient capability'); - done(); - } catch (err) { - done(err); - } - return; - } - done('Invalid capability, expected rejection'); - }); + try { + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + } catch (err) { + expect(err.statusCode).to.equal(401, 'Verify request rejected with insufficient capability'); + return; + } + expect.fail('Invalid capability, expected rejection'); }); - it('Ops intersection non-empty', function (done) { + it('Ops intersection non-empty', async function () { var testKeyOpts = { key: testApp.keys[2].keyStr }; var testCapability = { channel2: ['presence', 'subscribe'] }; var expectedIntersection = { channel2: ['subscribe'] }; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); - it('Paths intersection non-empty', function (done) { + it('Paths intersection non-empty', async function () { var testKeyOpts = { key: testApp.keys[2].keyStr }; var testCapability = { channel2: ['presence', 'subscribe'], channelx: ['presence', 'subscribe'], }; var expectedIntersection = { channel2: ['subscribe'] }; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); - it('Wildcard token with publish and subscribe key', function (done) { + it('Wildcard token with publish and subscribe key', async function () { var testKeyOpts = { key: testApp.keys[2].keyStr }; var testCapability = { channel2: ['*'] }; var expectedIntersection = { channel2: ['publish', 'subscribe'] }; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); - it('Publish and subscribe token with wildcard key', function (done) { + it('Publish and subscribe token with wildcard key', async function () { var testKeyOpts = { key: testApp.keys[2].keyStr }; var testCapability = { channel6: ['publish', 'subscribe'] }; var expectedIntersection = { channel6: ['publish', 'subscribe'] }; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); - it('Resources wildcard matching 1', function (done) { + it('Resources wildcard matching 1', async function () { var testKeyOpts = { key: testApp.keys[3].keyStr }; var testCapability = { cansubscribe: ['subscribe'] }; var expectedIntersection = testCapability; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); - it('Resources wildcard matching 2', function (done) { + it('Resources wildcard matching 2', async function () { var testKeyOpts = { key: testApp.keys[1].keyStr }; var testCapability = { 'canpublish:check': ['publish'] }; var expectedIntersection = testCapability; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); - it('Resources wildcard matching 3', function (done) { + it('Resources wildcard matching 3', async function () { var testKeyOpts = { key: testApp.keys[3].keyStr }; var testCapability = { 'cansubscribe:*': ['subscribe'] }; var expectedIntersection = testCapability; - rest.auth.requestToken({ capability: testCapability }, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } - try { - expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); - done(); - } catch (err) { - done(err); - } - }); + var tokenDetails = await rest.auth.requestToken({ capability: testCapability }, testKeyOpts); + expect(JSON.parse(tokenDetails.capability)).to.deep.equal(expectedIntersection, 'Verify token capability'); }); /* Invalid capabilities */ - it('Invalid capabilities 1', function (done) { - rest.auth.requestToken({ capability: invalid0 }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(400, 'Verify request rejected with bad capability'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Invalid capability, expected rejection')); - }); + it('Invalid capabilities 1', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ capability: invalid0 }); + } catch (err) { + expect(err.statusCode).to.equal(400, 'Verify request rejected with bad capability'); + return; + } + expect.fail('Invalid capability, expected rejection'); }); - it('Invalid capabilities 2', function (done) { - rest.auth.requestToken({ capability: invalid1 }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(400, 'Verify request rejected with bad capability'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Invalid capability, expected rejection')); - }); + it('Invalid capabilities 2', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ capability: invalid1 }); + } catch (err) { + expect(err.statusCode).to.equal(400, 'Verify request rejected with bad capability'); + return; + } + expect.fail('Invalid capability, expected rejection'); }); - it('Invalid capabilities 3', function (done) { - rest.auth.requestToken({ capability: invalid2 }, function (err, tokenDetails) { - if (err) { - try { - expect(err.statusCode).to.equal(400, 'Verify request rejected with bad capability'); - done(); - } catch (err) { - done(err); - } - return; - } - done(new Error('Invalid capability, expected rejection')); - }); + it('Invalid capabilities 3', async function () { + try { + var tokenDetails = await rest.auth.requestToken({ capability: invalid2 }); + } catch (err) { + expect(err.statusCode).to.equal(400, 'Verify request rejected with bad capability'); + return; + } + expect.fail('Invalid capability, expected rejection'); }); }); }); diff --git a/test/rest/defaults.test.js b/test/rest/defaults.test.js index 1abbcbba67..40be2e7213 100644 --- a/test/rest/defaults.test.js +++ b/test/rest/defaults.test.js @@ -61,27 +61,6 @@ define(['ably', 'chai'], function (Ably, chai) { expect(Defaults.getPort(normalisedOptions)).to.equal(443); }); - /* will emit a deprecation warning */ - it('Init with given environment and default fallbacks', function () { - var normalisedOptions = Defaults.normaliseOptions({ environment: 'sandbox', fallbackHostsUseDefault: true }); - - expect(normalisedOptions.restHost).to.equal('sandbox-rest.ably.io'); - expect(normalisedOptions.realtimeHost).to.equal('sandbox-realtime.ably.io'); - expect(normalisedOptions.port).to.equal(80); - expect(normalisedOptions.tlsPort).to.equal(443); - expect(normalisedOptions.fallbackHosts.sort()).to.deep.equal(Defaults.FALLBACK_HOSTS.sort()); - expect(normalisedOptions.tls).to.equal(true); - - expect(Defaults.getHosts(normalisedOptions).length).to.deep.equal(4); - expect(Defaults.getHosts(normalisedOptions)[0]).to.deep.equal(normalisedOptions.restHost); - expect(Defaults.getHost(normalisedOptions, 'sandbox-rest.ably.io', false)).to.deep.equal('sandbox-rest.ably.io'); - expect(Defaults.getHost(normalisedOptions, 'sandbox-rest.ably.io', true)).to.deep.equal( - 'sandbox-realtime.ably.io' - ); - - expect(Defaults.getPort(normalisedOptions)).to.equal(443); - }); - it('Init with local environment and non-default ports', function () { var normalisedOptions = Defaults.normaliseOptions({ environment: 'local', port: 8080, tlsPort: 8081 }); @@ -134,52 +113,6 @@ define(['ably', 'chai'], function (Ably, chai) { expect(Defaults.getPort(normalisedOptions)).to.equal(443); }); - /* init with given restHost and realtimeHost, using the default fallback hosts */ - it('Init with given restHost and realtimeHost, using the default fallback hosts', function () { - var normalisedOptions = Defaults.normaliseOptions({ - restHost: 'test.org', - realtimeHost: 'ws.test.org', - fallbackHostsUseDefault: true, - }); - - expect(normalisedOptions.restHost).to.equal('test.org'); - expect(normalisedOptions.realtimeHost).to.equal('ws.test.org'); - expect(normalisedOptions.fallbackHosts.sort()).to.deep.equal(Defaults.FALLBACK_HOSTS.sort()); - }); - - it('Throws an error when initiated with fallbackHosts and fallbackHostsUseDefault', function () { - expect(function () { - Defaults.normaliseOptions({ fallbackHosts: ['a.example.com', 'b.example.com'], fallbackHostsUseDefault: true }); - }, "Check fallbackHosts and fallbackHostsUseDefault can't both be set").to.throw(); - }); - - it('Throws an error with initiated with fallbackHostsUseDefault and port or tlsPort set', function () { - expect(function () { - Defaults.normaliseOptions({ fallbackHostsUseDefault: true, port: 8080 }); - }, "Check fallbackHostsUseDefault and port can't both be set").to.throw; - expect(function () { - Defaults.normaliseOptions({ fallbackHostsUseDefault: true, tlsPort: 8081 }); - }, "Check fallbackHostsUseDefault and tlsPort can't both be set").to.throw; - }); - - /* will emit a warning */ - it('Init with deprecated host and wsHost options', function () { - var normalisedOptions = Defaults.normaliseOptions({ host: 'test.org', wsHost: 'ws.test.org' }); - - expect(normalisedOptions.restHost).to.equal('test.org'); - expect(normalisedOptions.realtimeHost).to.equal('ws.test.org'); - expect(normalisedOptions.port).to.equal(80); - expect(normalisedOptions.tlsPort).to.equal(443); - expect(normalisedOptions.fallbackHosts).to.equal(undefined); - expect(normalisedOptions.tls).to.equal(true); - - expect(Defaults.getHosts(normalisedOptions)).to.deep.equal([normalisedOptions.restHost]); - expect(Defaults.getHost(normalisedOptions, 'test.org', false)).to.deep.equal('test.org'); - expect(Defaults.getHost(normalisedOptions, 'test.org', true)).to.deep.equal('ws.test.org'); - - expect(Defaults.getPort(normalisedOptions)).to.equal(443); - }); - it('Init with no endpoint-related options and given default environment', function () { Defaults.ENVIRONMENT = 'sandbox'; var normalisedOptions = Defaults.normaliseOptions({}); diff --git a/test/rest/fallbacks.test.js b/test/rest/fallbacks.test.js index 90800227b3..209b519291 100644 --- a/test/rest/fallbacks.test.js +++ b/test/rest/fallbacks.test.js @@ -20,69 +20,37 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); /* RSC15f */ - it('Store working fallback', function (done) { + it('Store working fallback', async function () { var rest = helper.AblyRest({ restHost: helper.unroutableHost, fallbackHosts: [goodHost], httpRequestTimeout: 3000, - log: { level: 4 }, + logLevel: 4, }); var validUntil; - async.series( - [ - function (cb) { - rest.time(function (err, serverTime) { - if (err) { - return cb(err); - } - expect(serverTime, 'Check serverTime returned').to.be.ok; - var currentFallback = rest._currentFallback; - expect(currentFallback, 'Check current fallback stored').to.be.ok; - expect(currentFallback && currentFallback.host).to.equal(goodHost, 'Check good host set'); - validUntil = currentFallback.validUntil; - cb(); - }); - }, - /* now try again, check that this time it uses the remembered good endpoint straight away */ - function (cb) { - rest.time(function (err, serverTime) { - if (err) { - return cb(err); - } - expect(serverTime, 'Check serverTime returned').to.be.ok; - var currentFallback = rest._currentFallback; - expect(currentFallback.validUntil).to.equal( - validUntil, - 'Check validUntil is the same (implying currentFallback has not been re-set)' - ); - cb(); - }); - }, - /* set the validUntil to the past and check that the stored fallback is forgotten */ - function (cb) { - var now = utils.now(); - rest._currentFallback.validUntil = now - 1000; - rest.time(function (err, serverTime) { - if (err) { - return cb(err); - } - expect(serverTime, 'Check serverTime returned').to.be.ok; - var currentFallback = rest._currentFallback; - expect(currentFallback, 'Check current fallback re-stored').to.be.ok; - expect(currentFallback && currentFallback.host).to.equal(goodHost, 'Check good host set again'); - expect(currentFallback.validUntil > now, 'Check validUntil has been re-set').to.be.ok; - cb(); - }); - }, - ], - function (err) { - if (err) { - done(err); - return; - } - done(); - } + var serverTime = await rest.time(); + expect(serverTime, 'Check serverTime returned').to.be.ok; + var currentFallback = rest._currentFallback; + expect(currentFallback, 'Check current fallback stored').to.be.ok; + expect(currentFallback && currentFallback.host).to.equal(goodHost, 'Check good host set'); + validUntil = currentFallback.validUntil; + /* now try again, check that this time it uses the remembered good endpoint straight away */ + var serverTime = await rest.time(); + expect(serverTime, 'Check serverTime returned').to.be.ok; + var currentFallback = rest._currentFallback; + expect(currentFallback.validUntil).to.equal( + validUntil, + 'Check validUntil is the same (implying currentFallback has not been re-set)' ); + /* set the validUntil to the past and check that the stored fallback is forgotten */ + var now = utils.now(); + rest._currentFallback.validUntil = now - 1000; + var serverTime = await rest.time(); + expect(serverTime, 'Check serverTime returned').to.be.ok; + var currentFallback = rest._currentFallback; + expect(currentFallback, 'Check current fallback re-stored').to.be.ok; + expect(currentFallback && currentFallback.host).to.equal(goodHost, 'Check good host set again'); + expect(currentFallback.validUntil > now, 'Check validUntil has been re-set').to.be.ok; }); }); }); diff --git a/test/rest/history.test.js b/test/rest/history.test.js index f686c0db71..34b7778445 100644 --- a/test/rest/history.test.js +++ b/test/rest/history.test.js @@ -15,6 +15,7 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { { name: 'event5', data: { one: 1, two: 2, three: 3 } }, { name: 'event6', data: { foo: 'bar' } }, ]; + var reversedMessages = testMessages.map((_, i) => testMessages[testMessages.length - 1 - i]); describe('rest/history', function () { this.timeout(60 * 1000); @@ -26,458 +27,214 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); }); - restTestOnJsonMsgpack('history_simple', function (done, rest, channelName) { + restTestOnJsonMsgpack('history_simple', async function (rest, channelName) { var testchannel = rest.channels.get('persisted:' + channelName); /* first, send a number of events to this channel */ - - var publishTasks = utils.arrMap(testMessages, function (event) { - return function (publishCb) { - testchannel.publish(event.name, event.data, publishCb); - }; - }); - - publishTasks.push(function (waitCb) { - setTimeout(function () { - waitCb(null); - }, 1000); + await Promise.all([ + new Promise((resolve) => setTimeout(resolve, 1000)), + ...testMessages.map((event) => testchannel.publish(event.name, event.data)), + ]); + + /* so now the messages are there; try querying the timeline */ + var resultPage = await testchannel.history(); + /* verify all messages are received */ + var messages = resultPage.items; + expect(messages.length).to.equal(testMessages.length, 'Verify correct number of messages found'); + + /* verify message ids are unique */ + var ids = {}; + utils.arrForEach(messages, function (msg) { + ids[msg.id] = msg; }); - try { - async.parallel(publishTasks, function (err) { - if (err) { - done(err); - return; - } - - /* so now the messages are there; try querying the timeline */ - testchannel.history(function (err, resultPage) { - if (err) { - done(err); - return; - } - /* verify all messages are received */ - var messages = resultPage.items; - expect(messages.length).to.equal(testMessages.length, 'Verify correct number of messages found'); - - /* verify message ids are unique */ - var ids = {}; - utils.arrForEach(messages, function (msg) { - ids[msg.id] = msg; - }); - expect(utils.keysArray(ids).length).to.equal( - testMessages.length, - 'Verify correct number of distinct message ids found' - ); - done(); - }); - }); - } catch (err) { - done(err); - } + expect(utils.keysArray(ids).length).to.equal( + testMessages.length, + 'Verify correct number of distinct message ids found' + ); }); - restTestOnJsonMsgpack('history_multiple', function (done, rest, channelName) { + restTestOnJsonMsgpack('history_multiple', async function (rest, channelName) { var testchannel = rest.channels.get('persisted:' + channelName); /* first, send a number of events to this channel */ - var publishTasks = [ - function (publishCb) { - testchannel.publish(testMessages, publishCb); - }, - ]; - - publishTasks.push(function (waitCb) { - setTimeout(function () { - waitCb(null); - }, 1000); + await Promise.all([new Promise((resolve) => setTimeout(resolve, 1000)), testchannel.publish(testMessages)]); + + /* so now the messages are there; try querying the timeline */ + var resultPage = await testchannel.history(); + /* verify all messages are received */ + var messages = resultPage.items; + expect(messages.length).to.equal(testMessages.length, 'Verify correct number of messages found'); + + /* verify message ids are unique */ + var ids = {}; + utils.arrForEach(messages, function (msg) { + ids[msg.id] = msg; }); - try { - async.parallel(publishTasks, function (err) { - if (err) { - done(err); - return; - } - - /* so now the messages are there; try querying the timeline */ - testchannel.history(function (err, resultPage) { - if (err) { - done(err); - return; - } - /* verify all messages are received */ - var messages = resultPage.items; - expect(messages.length).to.equal(testMessages.length, 'Verify correct number of messages found'); - - /* verify message ids are unique */ - var ids = {}; - utils.arrForEach(messages, function (msg) { - ids[msg.id] = msg; - }); - expect(utils.keysArray(ids).length).to.equal( - testMessages.length, - 'Verify correct number of distinct message ids found' - ); - done(); - }); - }); - } catch (err) { - done(err); - } + expect(utils.keysArray(ids).length).to.equal( + testMessages.length, + 'Verify correct number of distinct message ids found' + ); }); - restTestOnJsonMsgpack('history_simple_paginated_b', function (done, rest, channelName) { + restTestOnJsonMsgpack('history_simple_paginated_b', async function (rest, channelName) { var testchannel = rest.channels.get('persisted:' + channelName); /* first, send a number of events to this channel */ - var publishTasks = utils.arrMap(testMessages, function (event) { - return function (publishCb) { - testchannel.publish(event.name, event.data, publishCb); - }; - }); + for (var message of testMessages) { + await testchannel.publish(message.name, message.data); + } - publishTasks.push(function (waitCb) { - setTimeout(function () { - waitCb(null); - }, 1000); - }); - try { - async.series(publishTasks, function (err) { - if (err) { - done(err); - return; - } - - /* so now the messages are there; try querying the timeline to get messages one at a time */ - var ids = {}, - totalMessagesExpected = testMessages.length, - nextPage = function (cb) { - testchannel.history({ limit: 1, direction: 'backwards' }, cb); - }; - - testMessages.reverse(); - async.mapSeries( - testMessages, - function (expectedMessage, cb) { - nextPage(function (err, resultPage) { - if (err) { - cb(err); - return; - } - /* verify expected number of messages in this page */ - expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); - var resultMessage = resultPage.items[0]; - ids[resultMessage.id] = resultMessage; - - /* verify expected message */ - expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); - expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); - - if (--totalMessagesExpected > 0) { - expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; - expect(!resultPage.isLast(), 'Verify not last page').to.be.ok; - nextPage = resultPage.next; - } - cb(); - }); - }, - function (err) { - if (err) { - done(err); - return; - } - /* verify message ids are unique */ - expect(utils.keysArray(ids).length).to.equal( - testMessages.length, - 'Verify correct number of distinct message ids found' - ); - done(); - } - ); - }); - } catch (err) { - done(err); + await new Promise((resolve) => setTimeout(resolve, 1000)); + + /* so now the messages are there; try querying the timeline to get messages one at a time */ + var ids = {}, + totalMessagesExpected = testMessages.length; + + var resultPage = await testchannel.history({ limit: 1, direction: 'backwards' }); + for (var expectedMessage of reversedMessages) { + /* verify expected number of messages in this page */ + expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); + var resultMessage = resultPage.items[0]; + ids[resultMessage.id] = resultMessage; + + /* verify expected message */ + expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); + expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); + + if (--totalMessagesExpected > 0) { + expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; + expect(!resultPage.isLast(), 'Verify not last page').to.be.ok; + resultPage = await resultPage.next(); + } } + /* verify message ids are unique */ + expect(utils.keysArray(ids).length).to.equal( + testMessages.length, + 'Verify correct number of distinct message ids found' + ); }); - it('history_simple_paginated_f', function (done) { + it('history_simple_paginated_f', async function () { var testchannel = rest.channels.get('persisted:history_simple_paginated_f'); /* first, send a number of events to this channel */ - var publishTasks = utils.arrMap(testMessages, function (event) { - return function (publishCb) { - testchannel.publish(event.name, event.data, publishCb); - }; - }); + for (var message of testMessages) { + await testchannel.publish(message.name, message.data); + } - publishTasks.push(function (waitCb) { - setTimeout(function () { - waitCb(null); - }, 1000); + await new Promise(function (resolve) { + setTimeout(resolve, 1000); }); - try { - async.series(publishTasks, function (err) { - if (err) { - done(err); - return; - } - - /* so now the messages are there; try querying the timeline to get messages one at a time */ - var ids = {}, - totalMessagesExpected = testMessages.length, - nextPage = function (cb) { - testchannel.history({ limit: 1, direction: 'forwards' }, cb); - }; - - async.mapSeries( - testMessages, - function (expectedMessage, cb) { - nextPage(function (err, resultPage) { - if (err) { - cb(err); - return; - } - /* verify expected number of messages in this page */ - expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); - var resultMessage = resultPage.items[0]; - ids[resultMessage.id] = resultMessage; - - /* verify expected message */ - expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); - expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); - - if (--totalMessagesExpected > 0) { - expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; - nextPage = resultPage.next; - } - cb(); - }); - }, - function (err) { - if (err) { - done(err); - return; - } - /* verify message ids are unique */ - expect(utils.keysArray(ids).length).to.equal( - testMessages.length, - 'Verify correct number of distinct message ids found' - ); - done(); - } - ); - }); - } catch (err) { - done(err); + + var ids = {}, + totalMessagesExpected = testMessages.length; + + var resultPage = await testchannel.history({ limit: 1, direction: 'forwards' }); + for (var expectedMessage of testMessages) { + /* verify expected number of messages in this page */ + expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); + var resultMessage = resultPage.items[0]; + ids[resultMessage.id] = resultMessage; + + /* verify expected message */ + expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); + expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); + + if (--totalMessagesExpected > 0) { + expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; + resultPage = await resultPage.next(); + } } + + /* verify message ids are unique */ + expect(utils.keysArray(ids).length).to.equal( + testMessages.length, + 'Verify correct number of distinct message ids found' + ); }); - it('history_multiple_paginated_b', function (done) { + it('history_multiple_paginated_b', async function () { var testchannel = rest.channels.get('persisted:history_multiple_paginated_b'); /* first, send a number of events to this channel */ - var publishTasks = [ - function (publishCb) { - testchannel.publish(testMessages, publishCb); - }, - ]; - - publishTasks.push(function (waitCb) { - setTimeout(function () { - waitCb(null); - }, 1000); + for (var message of testMessages) { + await testchannel.publish(message.name, message.data); + } + + await new Promise(function (resolve) { + setTimeout(resolve, 1000); }); - try { - async.series(publishTasks, function (err) { - if (err) { - done(err); - return; - } - - /* so now the messages are there; try querying the timeline to get messages one at a time */ - var ids = {}, - totalMessagesExpected = testMessages.length, - nextPage = function (cb) { - testchannel.history({ limit: 1, direction: 'backwards' }, cb); - }; - - testMessages.reverse(); - async.mapSeries( - testMessages, - function (expectedMessage, cb) { - nextPage(function (err, resultPage) { - if (err) { - cb(err); - return; - } - /* verify expected number of messages in this page */ - expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); - var resultMessage = resultPage.items[0]; - ids[resultMessage.id] = resultMessage; - - /* verify expected message */ - expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); - expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); - - if (--totalMessagesExpected > 0) { - expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; - nextPage = resultPage.next; - } - cb(); - }); - }, - function (err) { - if (err) { - done(err); - return; - } - /* verify message ids are unique */ - expect(utils.keysArray(ids).length).to.equal( - testMessages.length, - 'Verify correct number of distinct message ids found' - ); - done(); - } - ); - }); - } catch (err) { - done(err); + + /* so now the messages are there; try querying the timeline to get messages one at a time */ + var ids = {}, + totalMessagesExpected = testMessages.length; + + var resultPage = await testchannel.history({ limit: 1, direction: 'backwards' }); + for (var expectedMessage of reversedMessages) { + /* verify expected number of messages in this page */ + expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); + var resultMessage = resultPage.items[0]; + ids[resultMessage.id] = resultMessage; + + /* verify expected message */ + expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); + expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); + + if (--totalMessagesExpected > 0) { + expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; + resultPage = await resultPage.next(); + } } }); - it('history_multiple_paginated_f', function (done) { + it('history_multiple_paginated_f', async function () { var testchannel = rest.channels.get('persisted:history_multiple_paginated_f'); /* first, send a number of events to this channel */ - var publishTasks = [ - function (publishCb) { - testchannel.publish(testMessages, publishCb); - }, - ]; - - publishTasks.push(function (waitCb) { - setTimeout(function () { - waitCb(null); - }, 1000); + await testchannel.publish(testMessages); + + await new Promise(function (resolve) { + setTimeout(resolve, 1000); }); - try { - async.series(publishTasks, function (err) { - if (err) { - done(err); - return; - } - - /* so now the messages are there; try querying the timeline to get messages one at a time */ - var ids = {}, - totalMessagesExpected = testMessages.length, - nextPage = function (cb) { - testchannel.history({ limit: 1, direction: 'forwards' }, cb); - }; - - async.mapSeries( - testMessages, - function (expectedMessage, cb) { - nextPage(function (err, resultPage) { - if (err) { - cb(err); - return; - } - /* verify expected number of messages in this page */ - expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); - var resultMessage = resultPage.items[0]; - ids[resultMessage.id] = resultMessage; - - /* verify expected message */ - expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); - expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); - - if (--totalMessagesExpected > 0) { - expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; - nextPage = resultPage.next; - } - cb(); - }); - }, - function (err) { - if (err) { - done(err); - return; - } - /* verify message ids are unique */ - expect(utils.keysArray(ids).length).to.equal( - testMessages.length, - 'Verify correct number of distinct message ids found' - ); - done(); - } - ); - }); - } catch (err) { - done(err); + + /* so now the messages are there; try querying the timeline to get messages one at a time */ + var ids = {}, + totalMessagesExpected = testMessages.length; + + var resultPage = await testchannel.history({ limit: 1, direction: 'forwards' }); + for (var expectedMessage of testMessages) { + /* verify expected number of messages in this page */ + expect(resultPage.items.length).to.equal(1, 'Verify a single message received'); + var resultMessage = resultPage.items[0]; + ids[resultMessage.id] = resultMessage; + + /* verify expected message */ + expect(expectedMessage.name).to.equal(resultMessage.name, 'Verify expected name value present'); + expect(expectedMessage.data).to.deep.equal(resultMessage.data, 'Verify expected data value present'); + + if (--totalMessagesExpected > 0) { + expect(resultPage.hasNext(), 'Verify next link is present').to.be.ok; + var resultPage = await resultPage.next(); + } } + + /* verify message ids are unique */ + expect(utils.keysArray(ids).length).to.equal( + testMessages.length, + 'Verify correct number of distinct message ids found' + ); }); - restTestOnJsonMsgpack('history_encoding_errors', function (done, rest, channelName) { + restTestOnJsonMsgpack('history_encoding_errors', async function (rest, channelName) { var testchannel = rest.channels.get('persisted:' + channelName); var badMessage = { name: 'jsonUtf8string', encoding: 'json/utf-8', data: '{"foo":"bar"}' }; - try { - testchannel.publish(badMessage, function (err) { - if (err) { - done(err); - return; - } - setTimeout(function () { - testchannel.history(function (err, resultPage) { - if (err) { - done(err); - return; - } - /* verify all messages are received */ - var message = resultPage.items[0]; - expect(message.data).to.equal(badMessage.data, 'Verify data preserved'); - expect(message.encoding).to.equal(badMessage.encoding, 'Verify encoding preserved'); - done(); - }); - }, 1000); - }); - } catch (err) { - done(err); - } + testchannel.publish(badMessage); + await new Promise((resolve) => setTimeout(resolve, 1000)); + var resultPage = await testchannel.history(); + /* verify all messages are received */ + var message = resultPage.items[0]; + expect(message.data).to.equal(badMessage.data, 'Verify data preserved'); + expect(message.encoding).to.equal(badMessage.encoding, 'Verify encoding preserved'); }); - - if (typeof Promise !== 'undefined') { - it('historyPromise', function (done) { - var rest = helper.AblyRest({ promises: true }); - var testchannel = rest.channels.get('persisted:history_promise'); - - testchannel - .publish('one', null) - .then(function () { - return testchannel.publish('two', null); - }) - .then(function () { - return testchannel.history({ limit: 1, direction: 'forwards' }); - }) - .then(function (resultPage) { - expect(resultPage.items.length).to.equal(1); - expect(resultPage.items[0].name).to.equal('one'); - return resultPage.first(); - }) - .then(function (resultPage) { - expect(resultPage.items[0].name).to.equal('one'); - return resultPage.current(); - }) - .then(function (resultPage) { - expect(resultPage.items[0].name).to.equal('one'); - return resultPage.next(); - }) - .then(function (resultPage) { - expect(resultPage.items[0].name).to.equal('two'); - done(); - }) - ['catch'](function (err) { - done(err); - }); - }); - } }); }); diff --git a/test/rest/http.test.js b/test/rest/http.test.js index 21502fed71..315f751551 100644 --- a/test/rest/http.test.js +++ b/test/rest/http.test.js @@ -21,46 +21,44 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { /** * RSC7a */ - it('Should send X-Ably-Version and Ably-Agent headers in get/post requests', function (done) { - //Intercept Http.do with test - function testRequestHandler(_, __, ___, headers) { - try { - expect('X-Ably-Version' in headers, 'Verify version header exists').to.be.ok; - expect('Ably-Agent' in headers, 'Verify agent header exists').to.be.ok; + it('Should send X-Ably-Version and Ably-Agent headers in get/post requests', async function () { + var originalDo = rest.http.do; - // This test should not directly validate version against Defaults.version, as - // ultimately the version header has been derived from that value. - expect(headers['X-Ably-Version']).to.equal('2', 'Verify current version number'); - expect(headers['Ably-Agent'].indexOf('ably-js/' + Defaults.version) > -1, 'Verify agent').to.be.ok; - expect(headers['Ably-Agent'].indexOf('custom-agent/0.1.2') > -1, 'Verify custom agent').to.be.ok; + // Intercept Http.do with test + function testRequestHandler(method, rest, path, headers, body, params, callback) { + expect('X-Ably-Version' in headers, 'Verify version header exists').to.be.ok; + expect('Ably-Agent' in headers, 'Verify agent header exists').to.be.ok; - // We don't test on NativeScript so a check for that platform is excluded here - if (typeof document !== 'undefined') { - // browser - expect(headers['Ably-Agent'].indexOf('browser') > -1, 'Verify agent').to.be.ok; - } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - // reactnative - expect(headers['Ably-Agent'].indexOf('reactnative') > -1, 'Verify agent').to.be.ok; - } else { - // node - expect(headers['Ably-Agent'].indexOf('nodejs') > -1, 'Verify agent').to.be.ok; - } - } catch (err) { - done(err); + // This test should not directly validate version against Defaults.version, as + // ultimately the version header has been derived from that value. + expect(headers['X-Ably-Version']).to.equal('2', 'Verify current version number'); + expect(headers['Ably-Agent'].indexOf('ably-js/' + Defaults.version) > -1, 'Verify agent').to.be.ok; + expect(headers['Ably-Agent'].indexOf('custom-agent/0.1.2') > -1, 'Verify custom agent').to.be.ok; + + // We don't test on NativeScript so a check for that platform is excluded here + if (typeof document !== 'undefined') { + // browser + expect(headers['Ably-Agent'].indexOf('browser') > -1, 'Verify agent').to.be.ok; + } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { + // reactnative + expect(headers['Ably-Agent'].indexOf('reactnative') > -1, 'Verify agent').to.be.ok; + } else { + // node + expect(headers['Ably-Agent'].indexOf('nodejs') > -1, 'Verify agent').to.be.ok; } + + originalDo.call(rest.http, method, rest, path, headers, body, params, callback); } rest.http.do = testRequestHandler; // Call all methods that use rest http calls - rest.auth.requestToken(); - rest.time(); - rest.stats(); + await rest.auth.requestToken(); + await rest.time(); + await rest.stats(); var channel = rest.channels.get('http_test_channel'); - channel.publish('test', 'Testing http headers'); - channel.presence.get(); - - done(); + await channel.publish('test', 'Testing http headers'); + await channel.presence.get(); }); }); }); diff --git a/test/rest/init.test.js b/test/rest/init.test.js index 7d83f277e0..2d4b316dde 100644 --- a/test/rest/init.test.js +++ b/test/rest/init.test.js @@ -23,27 +23,16 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { expect(rest.options.key).to.equal(keyStr); }); - it('Init with token string', function (done) { - try { - /* first generate a token ... */ - var rest = helper.AblyRest(); - var testKeyOpts = { key: helper.getTestApp().keys[1].keyStr }; + it('Init with token string', async function () { + /* first generate a token ... */ + var rest = helper.AblyRest(); + var testKeyOpts = { key: helper.getTestApp().keys[1].keyStr }; - rest.auth.requestToken(null, testKeyOpts, function (err, tokenDetails) { - if (err) { - done(err); - return; - } + var tokenDetails = await rest.auth.requestToken(null, testKeyOpts); + var tokenStr = tokenDetails.token, + rest = new helper.Ably.Rest(tokenStr); - var tokenStr = tokenDetails.token, - rest = new helper.Ably.Rest(tokenStr); - - expect(rest.options.token).to.equal(tokenStr); - done(); - }); - } catch (err) { - done(err); - } + expect(rest.options.token).to.equal(tokenStr); }); it('Init with tls: false', function () { @@ -73,26 +62,5 @@ define(['ably', 'shared_helper', 'chai'], function (Ably, helper, chai) { var rest = helper.AblyRest({ clientId: false }); }, 'Check can’t init library with a boolean clientId').to.throw; }); - - it('Init promises', function () { - var rest, - keyStr = helper.getTestApp().keys[0].keyStr; - - rest = new Ably.Rest(keyStr); - expect(!rest.options.promises, 'Check promises defaults to false').to.be.ok; - - rest = new Ably.Rest.Promise(keyStr); - expect(rest.options.promises, 'Check promises default to true with promise constructor').to.be.ok; - - if (!isBrowser && typeof require == 'function') { - var AblyPromises = require('../../promises'); - rest = new AblyPromises.Rest(keyStr); - expect(rest.options.promises, 'Check promises default to true with promise require target').to.be.ok; - - var AblyCallbacks = require('../../callbacks'); - rest = new AblyCallbacks.Rest(keyStr); - expect(!rest.options.promises, 'Check promises default to false with callback require target').to.be.ok; - } - }); }); }); diff --git a/test/rest/message.test.js b/test/rest/message.test.js index 125a91e981..389e0b7d74 100644 --- a/test/rest/message.test.js +++ b/test/rest/message.test.js @@ -18,7 +18,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* Authenticate with a clientId and ensure that the clientId is not sent in the Message and is implicitly added when published */ - it('Should implicitly send clientId when authenticated with clientId', function (done) { + it('Should implicitly send clientId when authenticated with clientId', async function () { var clientId = 'implicit_client_id_0', rest = helper.AblyRest({ clientId: clientId, useBinaryProtocol: false }), channel = rest.channels.get('rest_implicit_client_id_0'); @@ -26,41 +26,21 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var originalPublish = channel._publish; channel._publish = function (requestBody) { var message = JSON.parse(requestBody)[0]; - try { - expect(message.name === 'event0', 'Outgoing message interecepted').to.be.ok; - expect(!message.clientId, 'client ID is not added by the client library as it is implicit').to.be.ok; - } catch (err) { - done(err); - } + expect(message.name === 'event0', 'Outgoing message interecepted').to.be.ok; + expect(!message.clientId, 'client ID is not added by the client library as it is implicit').to.be.ok; originalPublish.apply(channel, arguments); }; - channel.publish('event0', null, function (err) { - if (err) { - done(err); - return; - } - - channel.history(function (err, page) { - if (err) { - done(err); - return; - } + await channel.publish('event0', null); + var page = await channel.history(); - var message = page.items[0]; - try { - expect(message.clientId == clientId, 'Client ID was added implicitly').to.be.ok; - done(); - } catch (err) { - done(err); - } - }); - }); + var message = page.items[0]; + expect(message.clientId == clientId, 'Client ID was added implicitly').to.be.ok; }); /* Authenticate with a clientId and explicitly provide the same clientId in the Message and ensure it is published */ - it('Should publish clientId when provided explicitly in message', function (done) { + it('Should publish clientId when provided explicitly in message', async function () { var clientId = 'explicit_client_id_0', rest = helper.AblyRest({ clientId: clientId, useBinaryProtocol: false }), channel = rest.channels.get('rest_explicit_client_id_0'); @@ -68,155 +48,85 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var originalPublish = channel._publish; channel._publish = function (requestBody) { var message = JSON.parse(requestBody)[0]; - try { - expect(message.name === 'event0', 'Outgoing message interecepted').to.be.ok; - expect( - message.clientId == clientId, - 'client ID is added by the client library as it is explicit in the publish' - ).to.be.ok; - } catch (err) { - done(err); - } + expect(message.name === 'event0', 'Outgoing message interecepted').to.be.ok; + expect( + message.clientId == clientId, + 'client ID is added by the client library as it is explicit in the publish' + ).to.be.ok; originalPublish.apply(channel, arguments); }; - channel.publish({ name: 'event0', clientId: clientId }, function (err) { - if (err) { - done(err); - } - - channel.history(function (err, page) { - if (err) { - done(err); - return; - } - - var message = page.items[0]; - try { - expect(message.clientId == clientId, 'Client ID was retained').to.be.ok; - done(); - } catch (err) { - done(err); - } - }); - }); + await channel.publish({ name: 'event0', clientId: clientId }); + var page = await channel.history(); + var message = page.items[0]; + expect(message.clientId == clientId, 'Client ID was retained').to.be.ok; }); /* Authenticate with a clientId and explicitly provide a different invalid clientId in the Message and expect it to not be published and be rejected */ - it('Should error when clientId sent in message is different than authenticated clientId', function (done) { + it('Should error when clientId sent in message is different than authenticated clientId', async function () { var clientId = 'explicit_client_id_0', invalidClientId = 'invalid'; - helper.AblyRest().auth.requestToken({ clientId: clientId }, function (err, token) { - try { - expect(token.clientId === clientId, 'client ID is present in the Token').to.be.ok; - } catch (err) { - done(err); - } - - // REST client uses a token string so is unaware of the clientId so cannot reject before communicating with Ably - var rest = helper.AblyRest({ token: token.token, useBinaryProtocol: false }), - channel = rest.channels.get('rest_explicit_client_id_1'); - - var originalPublish = channel._publish; - channel._publish = function (requestBody) { - var message = JSON.parse(requestBody)[0]; - try { - expect(message.name === 'event0', 'Outgoing message interecepted').to.be.ok; - expect( - message.clientId == invalidClientId, - 'invalid client ID is added by the client library as it is explicit in the publish' - ).to.be.ok; - } catch (err) { - done(err); - } - originalPublish.apply(channel, arguments); - }; + var token = await helper.AblyRest().auth.requestToken({ clientId: clientId }); + expect(token.clientId === clientId, 'client ID is present in the Token').to.be.ok; - channel.publish({ name: 'event0', clientId: invalidClientId }, function (err) { - if (!err) { - done(new Error('Publish should have failed with invalid clientId')); - return; - } + // REST client uses a token string so is unaware of the clientId so cannot reject before communicating with Ably + var rest = helper.AblyRest({ token: token.token, useBinaryProtocol: false }), + channel = rest.channels.get('rest_explicit_client_id_1'); - channel.history(function (err, page) { - if (err) { - done(err); - return; - } + var originalPublish = channel._publish; + channel._publish = function (requestBody) { + var message = JSON.parse(requestBody)[0]; + expect(message.name === 'event0', 'Outgoing message interecepted').to.be.ok; + expect( + message.clientId == invalidClientId, + 'invalid client ID is added by the client library as it is explicit in the publish' + ).to.be.ok; + originalPublish.apply(channel, arguments); + }; - try { - expect(page.items.length).to.equal(0, 'Message should not have been published'); - done(); - } catch (err) { - done(err); - } - }); - }); - }); + try { + await channel.publish({ name: 'event0', clientId: invalidClientId }); + } catch (err) { + var page = await channel.history(); + expect(page.items.length).to.equal(0, 'Message should not have been published'); + return; + } + expect.fail('Publish should have failed with invalid clientId'); }); /* TO3l8; CD2C; RSL1i */ - it('Should error when publishing message larger than maxMessageSize', function (done) { + it('Should error when publishing message larger than maxMessageSize', async function () { /* No connectionDetails mechanism for REST, so just pass the override into the constructor */ - var realtime = helper.AblyRest({ maxMessageSize: 64 }), + var realtime = helper.AblyRest({ internal: { maxMessageSize: 64 } }), channel = realtime.channels.get('maxMessageSize'); - channel.publish('foo', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', function (err) { - try { - expect(err, 'Check publish refused').to.be.ok; - expect(err.code).to.equal(40009); - done(); - } catch (err) { - done(err); - } - }); + try { + await channel.publish('foo', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); + } catch (err) { + expect(err, 'Check publish refused').to.be.ok; + expect(err.code).to.equal(40009); + return; + } + expect.fail('Expected channel.publish() to throw error'); }); /* Check ids are correctly sent */ - it('Should send correct IDs when idempotentRestPublishing set to false', function (done) { + it('Should send correct IDs when idempotentRestPublishing set to false', async function () { var rest = helper.AblyRest({ idempotentRestPublishing: false, useBinaryProtocol: false }), channel = rest.channels.get('idempotent_rest_publishing'), message = { name: 'test', id: 'idempotent-msg-id:0' }; - async.parallel( - [ - function (parCb) { - channel.publish(message, parCb); - }, - function (parCb) { - channel.publish(message, parCb); - }, - function (parCb) { - channel.publish(message, parCb); - }, - ], - function (err) { - if (err) { - done(err); - return; - } + await Promise.all([channel.publish(message), channel.publish(message), channel.publish(message)]); - channel.history(function (err, page) { - if (err) { - done(err); - return; - } - try { - expect(page.items.length).to.equal(1, 'Check only one message published'); - expect(page.items[0].id).to.equal(message.id, 'Check message id preserved in history'); - done(); - } catch (err) { - done(err); - } - }); - } - ); + var page = await channel.history(); + expect(page.items.length).to.equal(1, 'Check only one message published'); + expect(page.items[0].id).to.equal(message.id, 'Check message id preserved in history'); }); /* Check ids are added when automatic idempotent rest publishing option enabled */ - it('Should add IDs when automatic idempotent rest publishing option enabled', function (done) { + it('Should add IDs when automatic idempotent rest publishing option enabled', async function () { /* easiest way to get the host we're using for tests */ var dummyRest = helper.AblyRest(), host = dummyRest.options.restHost, @@ -234,27 +144,22 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async originalDoUri = Ably.Realtime.Platform.Http.doUri; channel._publish = function (requestBody) { - try { - var messageOne = JSON.parse(requestBody)[0]; - var messageTwo = JSON.parse(requestBody)[1]; - expect(messageOne.name).to.equal('one', 'Outgoing message 1 interecepted'); - expect(messageTwo.name).to.equal('two', 'Outgoing message 2 interecepted'); - idOne = messageOne.id; - idTwo = messageTwo.id; - expect(idOne, 'id set on message 1').to.be.ok; - expect(idTwo, 'id set on message 2').to.be.ok; - expect(idOne && idOne.split(':')[1]).to.equal('0', 'check zero-based index'); - expect(idTwo && idTwo.split(':')[1]).to.equal('1', 'check zero-based index'); - originalPublish.apply(channel, arguments); - } catch (err) { - done(err); - } + var messageOne = JSON.parse(requestBody)[0]; + var messageTwo = JSON.parse(requestBody)[1]; + expect(messageOne.name).to.equal('one', 'Outgoing message 1 interecepted'); + expect(messageTwo.name).to.equal('two', 'Outgoing message 2 interecepted'); + idOne = messageOne.id; + idTwo = messageTwo.id; + expect(idOne, 'id set on message 1').to.be.ok; + expect(idTwo, 'id set on message 2').to.be.ok; + expect(idOne && idOne.split(':')[1]).to.equal('0', 'check zero-based index'); + expect(idTwo && idTwo.split(':')[1]).to.equal('1', 'check zero-based index'); + originalPublish.apply(channel, arguments); }; Ably.Rest.Platform.Http.doUri = function (method, rest, uri, headers, body, params, callback) { originalDoUri(method, rest, uri, headers, body, params, function (err) { if (err) { - done(err); callback(err); return; } @@ -264,85 +169,36 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async Ably.Rest.Platform.Http.doUri = originalDoUri; }; - channel.publish([{ name: 'one' }, { name: 'two' }], function (err) { - if (err) { - done(err); - return; - } - - channel.history({ direction: 'forwards' }, function (err, page) { - if (err) { - done(err); - return; - } - /* TODO uncomment when idempotent publishing works on sandbox - * until then, test with ABLY_ENV=idempotent-dev - test.equal(page.items.length, 2, 'Only one message (with two items) should have been published'); - */ - try { - expect(page.items[0].id).to.equal(idOne, 'Check message id 1 preserved in history'); - expect(page.items[1].id).to.equal(idTwo, 'Check message id 1 preserved in history'); - done(); - } catch (err) { - done(err); - } - }); - }); + await channel.publish([{ name: 'one' }, { name: 'two' }]); + var page = await channel.history({ direction: 'forwards' }); + /* TODO uncomment when idempotent publishing works on sandbox + * until then, test with ABLY_ENV=idempotent-dev + * test.equal(page.items.length, 2, 'Only one message (with two items) should have been published'); + */ + expect(page.items[0].id).to.equal(idOne, 'Check message id 1 preserved in history'); + expect(page.items[1].id).to.equal(idTwo, 'Check message id 1 preserved in history'); }); - if (typeof Promise !== undefined) { - it('Rest publish promise', function (done) { - var rest = helper.AblyRest({ promises: true }); - var channel = rest.channels.get('publishpromise'); - - channel - .publish('name', 'data') - .then(function () { - return channel.history(); - }) - .then(function (page) { - var message = page.items[0]; - try { - expect( - message.data == 'data', - 'Check publish and history promise methods both worked as expected' - ).to.be.ok; - done(); - } catch (err) { - done(err); - } - }) - ['catch'](function (err) { - done(err); - }); - }); - } - - it('Rest publish params', function (done) { + it('Rest publish params', async function () { var rest = helper.AblyRest(), channel = rest.channels.get('publish_params'); + var originalPublish = channel._publish; + /* Stub out _publish to check params */ - var i = 0; channel._publish = function (requestBody, headers, params) { - try { - expect(params && params.testParam).to.equal('testParamValue'); - } catch (err) { - done(err); - } - if (++i === 8) { - done(); - } + expect(params && params.testParam).to.equal('testParamValue'); + originalPublish.apply(channel, arguments); }; - channel.publish('foo', 'bar', { testParam: 'testParamValue' }); - channel.publish('foo', { data: 'data' }, { testParam: 'testParamValue' }); - channel.publish('foo', { data: 'data' }, { testParam: 'testParamValue' }, noop); - channel.publish('foo', null, { testParam: 'testParamValue' }); - channel.publish(null, 'foo', { testParam: 'testParamValue' }); - channel.publish({ name: 'foo', data: 'bar' }, { testParam: 'testParamValue' }); - channel.publish([{ name: 'foo', data: 'bar' }], { testParam: 'testParamValue' }); - channel.publish([{ name: 'foo', data: 'bar' }], { testParam: 'testParamValue' }, noop); + await channel.publish('foo', 'bar', { testParam: 'testParamValue' }); + await channel.publish('foo', { data: 'data' }, { testParam: 'testParamValue' }); + await channel.publish('foo', { data: 'data' }, { testParam: 'testParamValue' }, noop); + await channel.publish('foo', null, { testParam: 'testParamValue' }); + await channel.publish(null, 'foo', { testParam: 'testParamValue' }); + await channel.publish({ name: 'foo', data: 'bar' }, { testParam: 'testParamValue' }); + await channel.publish([{ name: 'foo', data: 'bar' }], { testParam: 'testParamValue' }); + await channel.publish([{ name: 'foo', data: 'bar' }], { testParam: 'testParamValue' }, noop); }); }); }); diff --git a/test/rest/presence.test.js b/test/rest/presence.test.js index c7c6da664d..1c9640631f 100644 --- a/test/rest/presence.test.js +++ b/test/rest/presence.test.js @@ -21,6 +21,8 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async } describe('rest/presence', function () { + this.timeout(60 * 1000); + before(function (done) { helper.setupApp(function () { rest = helper.AblyRest(); @@ -30,43 +32,33 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); function presence_simple(operation) { - return function (done) { - try { - var cipherParams = cipherParamsFromConfig(cipherConfig); - var channel = rest.channels.get('persisted:presence_fixtures', { cipher: cipherParams }); - channel.presence[operation](function (err, resultPage) { - if (err) { - done(err); - return; - } - var presenceMessages = resultPage.items; - expect(presenceMessages.length).to.equal(6, 'Verify correct number of messages found'); - if (presenceMessages.length != 6) { - console.log('presenceMessages: ', JSON.stringify(presenceMessages)); - } - var encodedMessage = arrFind(presenceMessages, function (msg) { - return msg.clientId == 'client_encoded'; - }); - var decodedMessage = arrFind(presenceMessages, function (msg) { - return msg.clientId == 'client_decoded'; - }); - var boolMessage = arrFind(presenceMessages, function (msg) { - return msg.clientId == 'client_bool'; - }); - var intMessage = arrFind(presenceMessages, function (msg) { - return msg.clientId == 'client_int'; - }); - expect(encodedMessage.data).to.deep.equal(decodedMessage.data, 'Verify message decoding works correctly'); - expect(encodedMessage.encoding).to.equal(null, 'Decoding should remove encoding field'); - expect(decodedMessage.encoding).to.equal(null, 'Decoding should remove encoding field'); - expect(boolMessage.data).to.equal('true', 'should not attempt to parse string data when no encoding field'); - expect(intMessage.data).to.equal('24', 'should not attempt to parse string data when no encoding field'); - expect(boolMessage.action).to.equal(operation === 'get' ? 'present' : 'enter', 'appropriate action'); - done(); - }); - } catch (err) { - done(err); + return async function () { + var cipherParams = cipherParamsFromConfig(cipherConfig); + var channel = rest.channels.get('persisted:presence_fixtures', { cipher: cipherParams }); + var resultPage = await channel.presence[operation](); + var presenceMessages = resultPage.items; + expect(presenceMessages.length).to.equal(6, 'Verify correct number of messages found'); + if (presenceMessages.length != 6) { + console.log('presenceMessages: ', JSON.stringify(presenceMessages)); } + var encodedMessage = arrFind(presenceMessages, function (msg) { + return msg.clientId == 'client_encoded'; + }); + var decodedMessage = arrFind(presenceMessages, function (msg) { + return msg.clientId == 'client_decoded'; + }); + var boolMessage = arrFind(presenceMessages, function (msg) { + return msg.clientId == 'client_bool'; + }); + var intMessage = arrFind(presenceMessages, function (msg) { + return msg.clientId == 'client_int'; + }); + expect(encodedMessage.data).to.deep.equal(decodedMessage.data, 'Verify message decoding works correctly'); + expect(encodedMessage.encoding).to.equal(null, 'Decoding should remove encoding field'); + expect(decodedMessage.encoding).to.equal(null, 'Decoding should remove encoding field'); + expect(boolMessage.data).to.equal('true', 'should not attempt to parse string data when no encoding field'); + expect(intMessage.data).to.equal('24', 'should not attempt to parse string data when no encoding field'); + expect(boolMessage.action).to.equal(operation === 'get' ? 'present' : 'enter', 'appropriate action'); }; } @@ -75,91 +67,44 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async /* Ensure that calling JSON strinfigy on the Presence object converts the action string value back to a numeric value which the API requires */ - it('Presence message JSON serialisation', function (done) { + it('Presence message JSON serialisation', async function () { var channel = rest.channels.get('persisted:presence_fixtures'); - channel.presence.get(function (err, resultPage) { - if (err) { - done(err); - return; - } - var presenceMessages = resultPage.items; - var presenceBool = arrFind(presenceMessages, function (msg) { - return msg.clientId == 'client_bool'; - }); - try { - expect(JSON.parse(JSON.stringify(presenceBool)).action).to.equal(1); // present - presenceBool.action = 'leave'; - expect(JSON.parse(JSON.stringify(presenceBool)).action).to.equal(3); // leave - done(); - } catch (err) { - done(err); - } + var resultPage = await channel.presence.get(); + var presenceMessages = resultPage.items; + var presenceBool = arrFind(presenceMessages, function (msg) { + return msg.clientId == 'client_bool'; }); + expect(JSON.parse(JSON.stringify(presenceBool)).action).to.equal(1); // present + presenceBool.action = 'leave'; + expect(JSON.parse(JSON.stringify(presenceBool)).action).to.equal(3); // leave }); - it('Presence get limits and filtering', function (done) { - try { - var channel = rest.channels.get('persisted:presence_fixtures'); + it('Presence get limits and filtering', async function () { + var channel = rest.channels.get('persisted:presence_fixtures'); - var tests = [ - // Result limit - function (cb) { - channel.presence.get({ limit: 3 }, function (err, resultPage) { - if (err) cb(err); - var presenceMessages = resultPage.items; - expect(presenceMessages.length).to.equal(3, 'Verify correct number of messages found'); - cb(); - }); - }, - // Filter by clientId - function (cb) { - channel.presence.get({ clientId: 'client_json' }, function (err, resultPage) { - if (err) cb(err); - var presenceMessages = resultPage.items; - expect(presenceMessages.length).to.equal(1, 'Verify correct number of messages found'); - cb(); - }); - }, - // Filter by connectionId - function (cb) { - channel.presence.get(function (err, resultPage) { - if (err) cb(err); - channel.presence.get({ connectionId: resultPage.items[0].connectionId }, function (err, resultPage) { - if (err) cb(err); - var presenceMessages = resultPage.items; - expect(presenceMessages.length).to.equal(6, 'Verify correct number of messages found'); - cb(); - }); - }); - }, - ]; + var tests = [ + // Result limit + async function () { + var resultPage = await channel.presence.get({ limit: 3 }); + var presenceMessages = resultPage.items; + expect(presenceMessages.length).to.equal(3, 'Verify correct number of messages found'); + }, + // Filter by clientId + async function (cb) { + var resultPage = await channel.presence.get({ clientId: 'client_json' }); + var presenceMessages = resultPage.items; + expect(presenceMessages.length).to.equal(1, 'Verify correct number of messages found'); + }, + // Filter by connectionId + async function () { + var resultPage = await channel.presence.get(); + var resultPage2 = await channel.presence.get({ connectionId: resultPage.items[0].connectionId }); + var presenceMessages = resultPage2.items; + expect(presenceMessages.length).to.equal(6, 'Verify correct number of messages found'); + }, + ]; - async.parallel(tests, function (err) { - if (err) { - done(err); - return; - } - done(); - }); - } catch (err) { - done(err); - } + await Promise.all(tests); }); - - if (typeof Promise !== 'undefined') { - it('presencePromise', function (done) { - var rest = helper.AblyRest({ promises: true }); - var channel = rest.channels.get('some_channel'); - - channel.presence - .get() - .then(function () { - done(); - }) - ['catch'](function (err) { - done(err); - }); - }); - } }); }); diff --git a/test/rest/push.test.js b/test/rest/push.test.js index 6b782e4dfe..9d251ffe68 100644 --- a/test/rest/push.test.js +++ b/test/rest/push.test.js @@ -39,7 +39,7 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async }); }); - it('Get subscriptions', function (done) { + it('Get subscriptions', async function () { var subscribes = []; var deletes = []; var subsByChannel = {}; @@ -52,57 +52,30 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async subsByChannel[sub.channel].push(sub); var rest = helper.AblyRest({ clientId: sub.clientId }); - subscribes.push(function (callback) { - rest.push.admin.channelSubscriptions.save(sub, callback); - }); - deletes.push(function (callback) { - rest.push.admin.channelSubscriptions.remove(sub, callback); - }); + subscribes.push(() => rest.push.admin.channelSubscriptions.save(sub)); + deletes.push(() => rest.push.admin.channelSubscriptions.remove(sub)); })(i); } var rest = helper.AblyRest(); - async.series( - [ - function (callback) { - async.parallel(subscribes, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo1' }, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo2' }, callback); - }, - function (callback) { - async.parallel(deletes, callback); - }, - ], - function (err, result) { - if (err) { - done(err); - return; - } - try { - testIncludesUnordered(untyped(result[1].items), untyped(subsByChannel['pushenabled:foo1'])); - testIncludesUnordered(untyped(result[2].items), untyped(subsByChannel['pushenabled:foo2'])); - done(); - } catch (err) { - done(err); - } - } - ); + await Promise.all(subscribes.map((sub) => sub())); + + var res1 = await rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo1' }); + var res2 = await rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo2' }); + + await Promise.all(deletes.map((del) => del())); + + testIncludesUnordered(untyped(res1.items), untyped(subsByChannel['pushenabled:foo1'])); + testIncludesUnordered(untyped(res2.items), untyped(subsByChannel['pushenabled:foo2'])); }); - it('Publish', function (done) { - var realtime = helper.AblyRealtime(); + it('Publish', async function () { + try { + var realtime = helper.AblyRealtime(); - var channel = realtime.channels.get('pushenabled:foo'); - channel.attach(function (err) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } + var channel = realtime.channels.get('pushenabled:foo'); + await channel.attach(); var pushPayload = { notification: { title: 'Test message', body: 'Test message body' }, @@ -117,111 +90,38 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async ablyUrl: baseUri, }; - channel.subscribe('__ably_push__', function (msg) { - var receivedPushPayload = JSON.parse(msg.data); - try { + var prom = new Promise(function (resolve, reject) { + channel.subscribe('__ably_push__', function (msg) { expect(receivedPushPayload.data).to.deep.equal(pushPayload.data); expect(receivedPushPayload.notification.title).to.deep.equal(pushPayload.notification.title); expect(receivedPushPayload.notification.body).to.deep.equal(pushPayload.notification.body); - closeAndFinish(done, realtime); - } catch (err) { - closeAndFinish(done, realtime, err); - } + resolve(); + }); }); - realtime.push.admin.publish(pushRecipient, pushPayload, function (err) { - if (err) { - closeAndFinish(done, realtime, err); - } - }); - }); + await realtime.push.admin.publish(pushRecipient, pushPayload); + realtime.close(); + } catch (err) { + realtime.close(); + throw err; + } }); - if (typeof Promise !== 'undefined') { - it('Publish promise', function (done) { - var realtime = helper.AblyRealtime({ promises: true }); - var channelName = 'pushenabled:publish_promise'; - var channel = realtime.channels.get(channelName); - channel.attach(function (err) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } - - var pushPayload = { - notification: { title: 'Test message', body: 'Test message body' }, - data: { foo: 'bar' }, - }; - - var baseUri = realtime.baseUri(Ably.Rest.Platform.Defaults.getHost(realtime.options)); - var pushRecipient = { - transportType: 'ablyChannel', - channel: 'pushenabled:foo', - ablyKey: realtime.options.key, - ablyUrl: baseUri, - }; - - channel.subscribe('__ably_push__', function (msg) { - var receivedPushPayload = JSON.parse(msg.data); - try { - expect(receivedPushPayload.data).to.deep.equal(pushPayload.data); - expect(receivedPushPayload.notification.title).to.deep.equal(pushPayload.notification.title); - expect(receivedPushPayload.notification.body).to.deep.equal(pushPayload.notification.body); - closeAndFinish(done, realtime, err); - } catch (err) { - done(err); - } - }); - - realtime.push.admin - .publish(pushRecipient, pushPayload) - .then(function () { - closeAndFinish(done, realtime); - }) - ['catch'](function (err) { - closeAndFinish(done, realtime, err); - }); - }); - }); - } - - it('deviceRegistrations save', function (done) { + it('deviceRegistrations save', async function () { var rest = helper.AblyRest(); - async.series( - [ - function (callback) { - rest.push.admin.deviceRegistrations.save(testDevice, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.get(testDevice.id, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.remove(testDevice.id, callback); - }, - ], - function (err, result) { - if (err) { - done(err); - return; - } - var saved = result[0]; - var got = result[1]; - try { - expect(got.push.state).to.equal('ACTIVE'); - delete got.metadata; // Ignore these properties for testing - delete got.push.state; - testIncludesUnordered(untyped(got), testDevice_withoutSecret); - testIncludesUnordered(untyped(saved), testDevice_withoutSecret); - done(); - } catch (err) { - done(err); - } - } - ); + var saved = await rest.push.admin.deviceRegistrations.save(testDevice); + var got = await rest.push.admin.deviceRegistrations.get(testDevice.id); + await rest.push.admin.deviceRegistrations.remove(testDevice.id); + + expect(got.push.state).to.equal('ACTIVE'); + delete got.metadata; // Ignore these properties for testing + delete got.push.state; + testIncludesUnordered(untyped(got), testDevice_withoutSecret); + testIncludesUnordered(untyped(saved), testDevice_withoutSecret); }); - it('deviceRegistrations get and list', function (done) { + it('deviceRegistrations get and list', async function () { var registrations = []; var deletes = []; var devices = []; @@ -263,184 +163,77 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async devices_withoutSecret.push(device_withoutSecret); var rest = helper.AblyRest({ clientId: device.clientId }); - registrations.push(function (callback) { - rest.push.admin.deviceRegistrations.save(device, callback); + registrations.push(function () { + return rest.push.admin.deviceRegistrations.save(device); }); - deletes.push(function (callback) { - rest.push.admin.deviceRegistrations.remove('device' + (i + 1), callback); + deletes.push(function () { + return rest.push.admin.deviceRegistrations.remove('device' + (i + 1)); }); })(i); } var rest = helper.AblyRest(); - async.series( - [ - function (callback) { - async.parallel(registrations, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.list(null, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.list({ clientId: 'testClient1' }, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.list({ clientId: 'testClient2' }, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.get(devices[0].id, callback); - }, - function (callback) { - async.parallel( - [ - function (callback) { - rest.push.admin.deviceRegistrations.removeWhere({ clientId: 'testClient1' }, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.removeWhere({ clientId: 'testClient2' }, callback); - }, - ], - callback - ); - }, - function (callback) { - async.parallel(deletes, callback); - }, - ], - function (err, result) { - if (err) { - done(err); - return; - } - try { - expect(numberOfDevices).to.equal(result[0].length); - testIncludesUnordered(untyped(result[1].items), untyped(devices_withoutSecret)); - testIncludesUnordered(untyped(result[2].items), untyped(devicesByClientId['testClient1'])); - testIncludesUnordered(untyped(result[3].items), untyped(devicesByClientId['testClient2'])); - testIncludesUnordered(untyped(result[4]), untyped(devices[0])); - done(); - } catch (err) { - done(err); - } - } - ); + var res0 = await Promise.all(registrations.map((x) => x())); + var res1 = await rest.push.admin.deviceRegistrations.list(null); + var res2 = await rest.push.admin.deviceRegistrations.list({ clientId: 'testClient1' }); + var res3 = await rest.push.admin.deviceRegistrations.list({ clientId: 'testClient2' }); + var res4 = await rest.push.admin.deviceRegistrations.get(devices[0].id); + + await Promise.all([ + rest.push.admin.deviceRegistrations.removeWhere({ clientId: 'testClient1' }), + rest.push.admin.deviceRegistrations.removeWhere({ clientId: 'testClient2' }), + ]); + + await Promise.all(deletes.map((x) => x())); + + expect(numberOfDevices).to.equal(res0.length); + testIncludesUnordered(untyped(res1.items), untyped(devices_withoutSecret)); + testIncludesUnordered(untyped(res2.items), untyped(devicesByClientId['testClient1'])); + testIncludesUnordered(untyped(res3.items), untyped(devicesByClientId['testClient2'])); + testIncludesUnordered(untyped(res4), untyped(devices[0])); }); - it('deviceRegistrations remove removeWhere', function (done) { + it('deviceRegistrations remove removeWhere', async function () { var rest = helper.AblyRest(); - async.series( - [ - function (callback) { - rest.push.admin.deviceRegistrations.save(testDevice, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.remove(testDevice.id, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.get(testDevice.id, function (err, result) { - expect(err && err.statusCode).to.equal(404, 'Check device reg not found after removal'); - callback(null); - }); - }, - function (callback) { - rest.push.admin.deviceRegistrations.save(testDevice, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.removeWhere({ deviceId: testDevice.id }, callback); - }, - function (callback) { - rest.push.admin.deviceRegistrations.get(testDevice.id, function (err, result) { - expect(err && err.statusCode).to.equal(404, 'Check device reg not found after removal'); - callback(null); - }); - }, - ], - function (err, result) { - if (err) { - done(err); - } - done(); - } - ); - }); + await rest.push.admin.deviceRegistrations.save(testDevice); + await rest.push.admin.deviceRegistrations.remove(testDevice.id); - if (typeof Promise !== undefined) { - it('deviceRegistrations promise', function (done) { - var rest = helper.AblyRest({ promises: true }); - - /* save */ - rest.push.admin.deviceRegistrations - .save(testDevice) - .then(function (saved) { - expect(saved.push.state).to.equal('ACTIVE'); - testIncludesUnordered(untyped(saved), testDevice_withoutSecret); - /* get */ - return rest.push.admin.deviceRegistrations.get(testDevice.id); - }) - .then(function (got) { - expect(got.push.state).to.equal('ACTIVE'); - delete got.metadata; // Ignore these properties for testing - delete got.push.state; - testIncludesUnordered(untyped(got), testDevice_withoutSecret); - /* list */ - return rest.push.admin.deviceRegistrations.list({ clientId: testDevice.clientId }); - }) - .then(function (result) { - expect(result.items.length).to.equal(1); - var got = result.items[0]; - expect(got.push.state).to.equal('ACTIVE'); - testIncludesUnordered(untyped(got), testDevice_withoutSecret); - /* remove */ - return rest.push.admin.deviceRegistrations.removeWhere({ deviceId: testDevice.id }); - }) - .then(function () { - done(); - }) - ['catch'](function (err) { - done(err); - }); - }); - } + try { + await rest.push.admin.deviceRegistrations.get(testDevice.id); + expect.fail('Expected push.admin.deviceRegistrations.get() to throw'); + } catch (err) { + expect(err.statusCode).to.equal(404, 'Check device reg not found after removal'); + } + + await rest.push.admin.deviceRegistrations.save(testDevice); + await rest.push.admin.deviceRegistrations.removeWhere({ deviceId: testDevice.id }); - it('channelSubscriptions save', function (done) { + try { + await rest.push.admin.deviceRegistrations.get(testDevice.id); + expect.fail('Expected push.admin.deviceRegistrations.get() to throw'); + } catch (err) { + expect(err.statusCode).to.equal(404, 'Check device reg not found after removal'); + } + }); + + it('channelSubscriptions save', async function () { var rest = helper.AblyRest({ clientId: 'testClient' }); var subscription = { clientId: 'testClient', channel: 'pushenabled:foo' }; - async.series( - [ - function (callback) { - rest.push.admin.channelSubscriptions.save(subscription, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo' }, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.remove(subscription, callback); - }, - ], - function (err, result) { - if (err) { - done(err); - return; - } - var saved = result[0]; - var sub = result[1].items[0]; - try { - expect(subscription.clientId).to.equal(saved.clientId); - expect(subscription.channel).to.equal(saved.channel); - expect(subscription.clientId).to.equal(sub.clientId); - expect(subscription.channel).to.equal(sub.channel); - done(); - } catch (err) { - done(err); - } - } - ); + var saved = await rest.push.admin.channelSubscriptions.save(subscription); + var result = await rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo' }); + var sub = result.items[0]; + await rest.push.admin.channelSubscriptions.remove(subscription); + + expect(subscription.clientId).to.equal(saved.clientId); + expect(subscription.channel).to.equal(saved.channel); + expect(subscription.clientId).to.equal(sub.clientId); + expect(subscription.channel).to.equal(sub.channel); }); - it('channelSubscriptions get', function (done) { + it('channelSubscriptions get', async function () { var subscribes = []; var deletes = []; var subsByChannel = {}; @@ -453,73 +246,37 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async subsByChannel[sub.channel].push(sub); var rest = helper.AblyRest(); - subscribes.push(function (callback) { - rest.push.admin.channelSubscriptions.save(sub, callback); + subscribes.push(function () { + return rest.push.admin.channelSubscriptions.save(sub); }); - deletes.push(function (callback) { - rest.push.admin.channelSubscriptions.remove({ clientId: 'testClient' + i }, callback); + deletes.push(function () { + return rest.push.admin.channelSubscriptions.remove({ clientId: 'testClient' + i }); }); })(i); } var rest = helper.AblyRest(); - async.series( - [ - function (callback) { - async.parallel(subscribes, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo1' }, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo2' }, callback); - }, - function (callback) { - async.parallel(deletes, callback); - }, - ], - function (err, result) { - if (err) { - done(err); - return; - } - try { - testIncludesUnordered(untyped(result[1].items), untyped(subsByChannel['pushenabled:foo1'])); - testIncludesUnordered(untyped(result[2].items), untyped(subsByChannel['pushenabled:foo2'])); - done(); - } catch (err) { - done(err); - } - } - ); + await Promise.all(subscribes.map((x) => x())); + + var res1 = await rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo1' }); + var res2 = await rest.push.admin.channelSubscriptions.list({ channel: 'pushenabled:foo2' }); + + await Promise.all(deletes.map((x) => x())); + + testIncludesUnordered(untyped(res1.items), untyped(subsByChannel['pushenabled:foo1'])); + testIncludesUnordered(untyped(res2.items), untyped(subsByChannel['pushenabled:foo2'])); }); - exports.push_channelSubscriptions_remove = function (test) { + it('push_channelSubscriptions_remove', async function () { var rest = helper.AblyRest({ clientId: 'testClient' }); var subscription = { clientId: 'testClient', channel: 'pushenabled:foo' }; - async.series( - [ - function (callback) { - rest.push.admin.channelSubscriptions.save(subscription, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.remove(subscription, callback); - }, - ], - function (err, result) { - if (err) { - test.ok(false, err.message); - test.done(); - return; - } - test.done(); - } - ); - }; + await rest.push.admin.channelSubscriptions.save(subscription); + await rest.push.admin.channelSubscriptions.remove(subscription); + }); - it('channelSubscriptions listChannels', function (done) { + it('channelSubscriptions listChannels', async function () { var subscribes = []; var deletes = []; for (var i = 0; i < 5; i++) { @@ -527,74 +284,24 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async var sub = { channel: 'pushenabled:listChannels' + ((i % 2) + 1), clientId: 'testClient' + ((i % 3) + 1) }; var rest = helper.AblyRest({ clientId: sub.clientId }); subscribes.push(function (callback) { - rest.push.admin.channelSubscriptions.save(sub, callback); + return rest.push.admin.channelSubscriptions.save(sub); }); - deletes.push(function (callback) { - rest.push.admin.channelSubscriptions.remove(sub, callback); + deletes.push(function () { + return rest.push.admin.channelSubscriptions.remove(sub); }); })(i); } var rest = helper.AblyRest(); - async.series( - [ - function (callback) { - async.parallel(subscribes, callback); - }, - function (callback) { - rest.push.admin.channelSubscriptions.listChannels(null, callback); - }, - function (callback) { - async.parallel(deletes, callback); - }, - ], - function (err, result) { - if (err) { - done(err); - return; - } - try { - testIncludesUnordered(['pushenabled:listChannels1', 'pushenabled:listChannels2'], result[1].items); - done(); - } catch (err) { - done(err); - } - } - ); - }); + await Promise.all(subscribes.map((x) => x())); - if (typeof Promise !== 'undefined') { - it('channelSubscriptions promise', function (done) { - var rest = helper.AblyRest({ promises: true }); - var channelId = 'pushenabled:channelsubscriptions_promise'; - var subscription = { clientId: 'testClient', channel: channelId }; - - rest.push.admin.channelSubscriptions - .save(subscription) - .then(function (saved) { - expect(subscription.clientId).to.equal(saved.clientId); - expect(subscription.channel).to.equal(saved.channel); - return rest.push.admin.channelSubscriptions.list({ channel: channelId }); - }) - .then(function (result) { - var sub = result.items[0]; - expect(subscription.clientId).to.equal(sub.clientId); - expect(subscription.channel).to.equal(sub.channel); - return rest.push.admin.channelSubscriptions.listChannels(null); - }) - .then(function (result) { - expect(Utils.arrIn(result.items, channelId)).to.be.ok; - return rest.push.admin.channelSubscriptions.remove(subscription); - }) - .then(function () { - done(); - }) - ['catch'](function (err) { - done(err); - }); - }); - } + var result = await rest.push.admin.channelSubscriptions.listChannels(null); + + await Promise.all(deletes.map((x) => x())); + + testIncludesUnordered(['pushenabled:listChannels1', 'pushenabled:listChannels2'], result.items); + }); function untyped(x) { return JSON.parse(JSON.stringify(x)); diff --git a/test/rest/request.test.js b/test/rest/request.test.js index 573468e023..7055f46191 100644 --- a/test/rest/request.test.js +++ b/test/rest/request.test.js @@ -1,11 +1,12 @@ 'use strict'; -define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { +define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async, chai) { var rest; var expect = chai.expect; var utils = helper.Utils; var echoServerHost = 'echo.ably.io'; var restTestOnJsonMsgpack = helper.restTestOnJsonMsgpack; + var Defaults = Ably.Rest.Platform.Defaults; describe('rest/request', function () { this.timeout(60 * 1000); @@ -21,240 +22,156 @@ define(['shared_helper', 'async', 'chai'], function (helper, async, chai) { }); }); - restTestOnJsonMsgpack('request_time', function (done, rest) { - rest.request('get', '/time', null, null, null, function (err, res) { + restTestOnJsonMsgpack('request_version', function (rest) { + const version = 150; // arbitrarily chosen + + function testRequestHandler(_, __, ___, headers) { try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(res.statusCode).to.equal(200, 'Check statusCode'); - expect(res.success).to.equal(true, 'Check success'); - expect(utils.isArray(res.items), true, 'Check array returned').to.be.ok; - expect(res.items.length).to.equal(1, 'Check array was of length 1'); + expect('X-Ably-Version' in headers, 'Verify version header exists').to.be.ok; + expect(headers['X-Ably-Version']).to.equal(version.toString(), 'Verify version number sent in request'); done(); } catch (err) { done(err); } - }); + } + + rest.http.do = testRequestHandler; + + rest.request('get', '/time' /* arbitrarily chosen */, version, null, null, null); + }); + + restTestOnJsonMsgpack('request_time', async function (rest) { + const res = await rest.request('get', '/time', Defaults.protocolVersion, null, null, null); + expect(res.statusCode).to.equal(200, 'Check statusCode'); + expect(res.success).to.equal(true, 'Check success'); + expect(utils.isArray(res.items), true, 'Check array returned').to.be.ok; + expect(res.items.length).to.equal(1, 'Check array was of length 1'); }); - restTestOnJsonMsgpack('request_404', function (done, rest) { + restTestOnJsonMsgpack('request_404', async function (rest) { /* NB: can't just use /invalid or something as the CORS preflight will * fail. Need something superficially a valid path but where the actual * request fails */ - rest.request('get', '/keys/ablyjs.test/requestToken', null, null, null, function (err, res) { - try { - expect(err).to.equal( - null, - 'Check that we do not get an error response for a failure that returns an actual ably error code' - ); - expect(res.success).to.equal(false, 'Check res.success is false for a failure'); - expect(res.statusCode).to.equal(404, 'Check HPR.statusCode is 404'); - expect(res.errorCode).to.equal(40400, 'Check HPR.errorCode is 40400'); - expect(res.errorMessage, 'Check have an HPR.errorMessage').to.be.ok; - done(); - } catch (err) { - done(err); - } - }); + const res = await rest.request( + 'get', + '/keys/ablyjs.test/requestToken', + Defaults.protocolVersion, + null, + null, + null + ); + expect(res.success).to.equal(false, 'Check res.success is false for a failure'); + expect(res.statusCode).to.equal(404, 'Check HPR.statusCode is 404'); + expect(res.errorCode).to.equal(40400, 'Check HPR.errorCode is 40400'); + expect(res.errorMessage, 'Check have an HPR.errorMessage').to.be.ok; }); /* With a network issue, should get an actual err, not an HttpPaginatedResponse with error members */ - it('request_network_error', function (done) { + it('request_network_error', async function () { rest = helper.AblyRest({ restHost: helper.unroutableAddress }); - rest.request('get', '/time', null, null, null, function (err, res) { - try { - expect(err, 'Check get an err').to.be.ok; - expect(!res, 'Check do not get a res').to.be.ok; - done(); - } catch (err) { - done(err); - } - }); + try { + var res = await rest.request('get', '/time', Defaults.protocolVersion, null, null, null); + } catch (err) { + expect(err, 'Check get an err').to.be.ok; + expect(!res, 'Check do not get a res').to.be.ok; + return; + } + expect.fail('Expected rest.request to throw'); }); /* Use the request feature to publish, then retrieve (one at a time), some messages */ - restTestOnJsonMsgpack('request_post_get_messages', function (done, rest, channelName) { + restTestOnJsonMsgpack('request_post_get_messages', async function (rest, channelName) { var channelPath = '/channels/' + channelName + '/messages', msgone = { name: 'faye', data: 'whittaker' }, msgtwo = { name: 'martin', data: 'reed' }; - async.waterfall( - [ - function (cb) { - rest.request('post', channelPath, null, msgone, null, function (err, res) { - try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(res.statusCode).to.equal(201, 'Check statusCode is 201'); - expect(res.success).to.equal(true, 'Check post was a success'); - expect(res.items && res.items.length).to.equal(1, 'Check number of results is as expected'); - cb(); - } catch (err) { - cb(err); - } - }); - }, - function (cb) { - rest.request('post', channelPath, null, msgtwo, null, function (err, res) { - try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(res.statusCode).to.equal(201, 'Check statusCode is 201'); - expect(res.items && res.items.length).to.equal(1, 'Check number of results is as expected'); - cb(); - } catch (err) { - cb(err); - } - }); - }, - function (cb) { - rest.request('get', channelPath, { limit: 1, direction: 'forwards' }, null, null, function (err, res) { - try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(res.statusCode).to.equal(200, 'Check statusCode is 200'); - expect(res.items.length).to.equal(1, 'Check only one msg returned'); - expect(res.items[0].name).to.equal(msgone.name, 'Check name is as expected'); - expect(res.items[0].data).to.equal(msgone.data, 'Check data is as expected'); - expect(res.hasNext, 'Check hasNext is true').to.be.ok; - cb(null, res.next); - } catch (err) { - cb(err); - } - }); - }, - function (next, cb) { - next(function (err, res) { - try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(res.statusCode).to.equal(200, 'Check statusCode is 200'); - expect(res.success).to.equal(true, 'Check success'); - expect(res.items.length).to.equal(1, 'Check only one msg returned'); - expect(res.items[0].name).to.equal(msgtwo.name, 'Check name is as expected'); - expect(res.items[0].data).to.equal(msgtwo.data, 'Check data is as expected'); - cb(); - } catch (err) { - cb(err); - } - }); - }, - function (cb) { - /* Finally check the messages the 'normal' way to make sure everything's as expected */ - rest.channels.get(channelName).history(function (err, res) { - try { - expect(!err, err && helper.displayError(err)).to.be.ok; - expect(res.items.length).to.equal(2, 'Check both msgs returned'); - expect(res.items[0].name).to.equal(msgtwo.name, 'Check name is as expected'); - expect(res.items[0].data).to.equal(msgtwo.data, 'Check data is as expected'); - cb(); - } catch (err) { - cb(err); - } - }); - }, - ], - function (err) { - if (err) { - done(err); - return; - } - done(); - } + var res = await rest.request('post', channelPath, Defaults.protocolVersion, null, msgone, null); + expect(res.statusCode).to.equal(201, 'Check statusCode is 201'); + expect(res.success).to.equal(true, 'Check post was a success'); + expect(res.items && res.items.length).to.equal(1, 'Check number of results is as expected'); + + res = await rest.request('post', channelPath, Defaults.protocolVersion, null, msgtwo, null); + expect(res.statusCode).to.equal(201, 'Check statusCode is 201'); + expect(res.items && res.items.length).to.equal(1, 'Check number of results is as expected'); + + res = await rest.request( + 'get', + channelPath, + Defaults.protocolVersion, + { limit: 1, direction: 'forwards' }, + null, + null ); + expect(res.statusCode).to.equal(200, 'Check statusCode is 200'); + expect(res.items.length).to.equal(1, 'Check only one msg returned'); + expect(res.items[0].name).to.equal(msgone.name, 'Check name is as expected'); + expect(res.items[0].data).to.equal(msgone.data, 'Check data is as expected'); + expect(res.hasNext, 'Check hasNext is true').to.be.ok; + + res = await res.next(); + expect(res.statusCode).to.equal(200, 'Check statusCode is 200'); + expect(res.success).to.equal(true, 'Check success'); + expect(res.items.length).to.equal(1, 'Check only one msg returned'); + expect(res.items[0].name).to.equal(msgtwo.name, 'Check name is as expected'); + expect(res.items[0].data).to.equal(msgtwo.data, 'Check data is as expected'); + + /* Finally check the messages the 'normal' way to make sure everything's as expected */ + res = await rest.channels.get(channelName).history(); + expect(res.items.length).to.equal(2, 'Check both msgs returned'); + expect(res.items[0].name).to.equal(msgtwo.name, 'Check name is as expected'); + expect(res.items[0].data).to.equal(msgtwo.data, 'Check data is as expected'); }); - restTestOnJsonMsgpack('request_batch_api_success', function (done, rest, name) { + restTestOnJsonMsgpack('request_batch_api_success', async function (rest, name) { var body = { channels: [name + '1', name + '2'], messages: { data: 'foo' } }; - rest.request('POST', '/messages', {}, body, {}, function (err, res) { - try { - expect(err).to.equal(null, 'Check that we do not get an error response for a success'); - expect(res.success).to.equal(true, 'Check res.success is true for a success'); - expect(res.statusCode).to.equal(201, 'Check res.statusCode is 201 for a success'); - expect(res.errorCode).to.equal(null, 'Check res.errorCode is null for a success'); - expect(res.errorMessage).to.equal(null, 'Check res.errorMessage is null for a success'); - - expect( - !res.items[0].batchResponse, - 'Check no batchResponse, since items is now just a flat array of channel responses' - ).to.be.ok; - expect(res.items.length).to.equal(2, 'Verify batched response includes response for each channel'); - expect(!res.items[0].error, 'Verify channel1 response is not an error').to.be.ok; - expect(res.items[0].channel).to.equal(name + '1', 'Verify channel1 response includes correct channel'); - expect(!res.items[1].error, 'Verify channel2 response is not an error').to.be.ok; - expect(res.items[1].channel).to.equal(name + '2', 'Verify channel2 response includes correct channel'); - done(); - } catch (err) { - done(err); - } - }); + const res = await rest.request('POST', '/messages', Defaults.protocolVersion, {}, body, {}); + expect(res.success).to.equal(true, 'Check res.success is true for a success'); + expect(res.statusCode).to.equal(201, 'Check res.statusCode is 201 for a success'); + expect(res.errorCode).to.equal(null, 'Check res.errorCode is null for a success'); + expect(res.errorMessage).to.equal(null, 'Check res.errorMessage is null for a success'); + + expect( + !res.items[0].batchResponse, + 'Check no batchResponse, since items is now just a flat array of channel responses' + ).to.be.ok; + expect(res.items.length).to.equal(2, 'Verify batched response includes response for each channel'); + expect(!res.items[0].error, 'Verify channel1 response is not an error').to.be.ok; + expect(res.items[0].channel).to.equal(name + '1', 'Verify channel1 response includes correct channel'); + expect(!res.items[1].error, 'Verify channel2 response is not an error').to.be.ok; + expect(res.items[1].channel).to.equal(name + '2', 'Verify channel2 response includes correct channel'); }); - restTestOnJsonMsgpack.skip('request_batch_api_partial_success', function (done, rest, name) { + restTestOnJsonMsgpack.skip('request_batch_api_partial_success', async function (rest, name) { var body = { channels: [name, '[invalid', ''], messages: { data: 'foo' } }; - rest.request('POST', '/messages', {}, body, {}, function (err, res) { - try { - expect(err).to.equal(null, 'Check that we do not get an error response for a partial success'); - expect(res.success).to.equal(false, 'Check res.success is false for a partial failure'); - expect(res.statusCode).to.equal(400, 'Check HPR.statusCode is 400 for a partial failure'); - expect(res.errorCode).to.equal(40020, 'Check HPR.errorCode is 40020 for a partial failure'); - expect(res.errorMessage, 'Check have an HPR.errorMessage').to.be.ok; - - var response = res.items[0]; - expect(response.error.code).to.equal(40020, 'Verify response has an errorCode'); - expect(response.batchResponse.length).to.equal( - 3, - 'Verify batched response includes response for each channel' - ); - expect(response.batchResponse[0].channel).to.equal(name, 'Verify channel1 response includes correct channel'); - expect(!response.batchResponse[0].error, 'Verify first channel response is not an error').to.be.ok; - expect(response.batchResponse[1].error.code).to.equal( - 40010, - 'Verify [invalid response includes an error with the right code' - ); - expect(response.batchResponse[2].error.code).to.equal( - 40010, - 'Verify empty channel response includes an error with the right code' - ); - done(); - } catch (err) { - done(err); - } - }); + var res = await rest.request('POST', '/messages', Defaults.protocolVersion, {}, body, {}); + expect(res.success).to.equal(false, 'Check res.success is false for a partial failure'); + expect(res.statusCode).to.equal(400, 'Check HPR.statusCode is 400 for a partial failure'); + expect(res.errorCode).to.equal(40020, 'Check HPR.errorCode is 40020 for a partial failure'); + expect(res.errorMessage, 'Check have an HPR.errorMessage').to.be.ok; + + var response = res.items[0]; + expect(response.error.code).to.equal(40020, 'Verify response has an errorCode'); + expect(response.batchResponse.length).to.equal(3, 'Verify batched response includes response for each channel'); + expect(response.batchResponse[0].channel).to.equal(name, 'Verify channel1 response includes correct channel'); + expect(!response.batchResponse[0].error, 'Verify first channel response is not an error').to.be.ok; + expect(response.batchResponse[1].error.code).to.equal( + 40010, + 'Verify [invalid response includes an error with the right code' + ); + expect(response.batchResponse[2].error.code).to.equal( + 40010, + 'Verify empty channel response includes an error with the right code' + ); }); utils.arrForEach(['put', 'patch', 'delete'], function (method) { - it('check' + method, function (done) { + it('check' + method, async function () { var restEcho = helper.AblyRest({ useBinaryProtocol: false, restHost: echoServerHost, tls: true }); - restEcho.request(method, '/methods', {}, {}, {}, function (err, res) { - if (err) { - done(err); - } else { - try { - expect(res.items[0] && res.items[0].method).to.equal(method); - done(); - } catch (err) { - done(err); - } - } - }); + var res = await restEcho.request(method, '/methods', Defaults.protocolVersion, {}, {}, {}); + expect(res.items[0] && res.items[0].method).to.equal(method); }); }); - - if (typeof Promise !== 'undefined') { - it('request_promise', function (done) { - var client = helper.AblyRest({ promises: true }); - - client - .request('get', '/time', null, null, null) - .then(function (res) { - expect(res.statusCode).to.equal(200, 'Check statusCode'); - expect(res.success).to.equal(true, 'Check success'); - expect(utils.isArray(res.items), true, 'Check array returned').to.be.ok; - expect(res.items.length).to.equal(1, 'Check array was of length 1'); - done(); - }) - ['catch'](function (err) { - done(err); - }); - }); - } }); }); diff --git a/test/rest/stats.test.js b/test/rest/stats.test.js index 840acfe70f..bda82edfb5 100644 --- a/test/rest/stats.test.js +++ b/test/rest/stats.test.js @@ -79,541 +79,300 @@ define(['shared_helper', 'chai'], function (helper, chai) { * Using an interval ID string format, check minute-level inbound and outbound stats match fixture data (forwards) * @spec : (RSC6b4) */ - it('appstats_minute0', function (done) { - rest.stats( - { - start: lastYear + '-02-03:15:03', - end: lastYear + '-02-03:15:05', - direction: 'forwards', - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length).to.equal(3, 'Verify 3 stat records found'); - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it('appstats_minute0', async function () { + var page = await rest.stats({ + start: lastYear + '-02-03:15:03', + end: lastYear + '-02-03:15:05', + direction: 'forwards', + }); + var stats = page.items; + expect(stats.length).to.equal(3, 'Verify 3 stat records found'); + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); }); /** * Using milliseconds since epoch, check minute-level inbound and outbound stats match fixture data (forwards) * @spec : (RSC6b4) */ - it('appstats_minute1', function (done) { - rest.stats( - { - start: firstIntervalEpoch, - end: secondIntervalEpoch, - direction: 'forwards', - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length).to.equal(3, 'Verify 3 stat records found'); - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it('appstats_minute1', async function () { + var page = await rest.stats({ + start: firstIntervalEpoch, + end: secondIntervalEpoch, + direction: 'forwards', + }); + var stats = page.items; + expect(stats.length).to.equal(3, 'Verify 3 stat records found'); + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); }); /** * Check hour-level inbound and outbound stats match fixture data (forwards) * @spec : (RSC6b4) */ - it('appstats_hour0', function (done) { - rest.stats( - { - start: lastYear + '-02-03:15', - end: lastYear + '-02-03:18', - direction: 'forwards', - by: 'hour', - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length).to.equal(1, 'Verify 1 stat record found'); - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it('appstats_hour0', async function () { + var page = await rest.stats({ + start: lastYear + '-02-03:15', + end: lastYear + '-02-03:18', + direction: 'forwards', + by: 'hour', + }); + var stats = page.items; + expect(stats.length).to.equal(1, 'Verify 1 stat record found'); + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); }); /** * Check day-level stats exist (forwards) * @spec : (RSC6b4) */ - it.skip('appstats_day0', function (done) { - rest.stats( - { - end: lastYear + '-02-03', - direction: 'forwards', - by: 'day', - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it.skip('appstats_day0', async function () { + var page = await rest.stats({ + end: lastYear + '-02-03', + direction: 'forwards', + by: 'day', + }); + var stats = page.items; + expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); }); /** * Check month-level stats exist (forwards) * @spec : (RSC6b4) */ - it.skip('appstats_month0', function (done) { - rest.stats( - { - end: lastYear + '-02', - direction: 'forwards', - by: 'month', - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it.skip('appstats_month0', async function () { + var page = await rest.stats({ + end: lastYear + '-02', + direction: 'forwards', + by: 'month', + }); + var stats = page.items; + expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(50 + 60 + 70, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(20 + 10 + 40, 'Verify all outbound messages found'); }); /** * Check limit query param (backwards) * @spec : (RSC6b3) */ - it('appstats_limit_backwards', function (done) { - rest.stats( - { - end: lastYear + '-02-03:15:04', - direction: 'backwards', - limit: 1, - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(60, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(10, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it('appstats_limit_backwards', async function () { + var page = await rest.stats({ + end: lastYear + '-02-03:15:04', + direction: 'backwards', + limit: 1, + }); + var stats = page.items; + expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(60, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(10, 'Verify all outbound messages found'); }); /** * Check limit query param (forwards) * @spec : (RSC6b3) */ - it('appstats_limit_forwards', function (done) { - rest.stats( - { - end: lastYear + '-02-03:15:04', - direction: 'forwards', - limit: 1, - }, - function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; - - var totalInbound = 0, - totalOutbound = 0; - for (var i = 0; i < stats.length; i++) { - totalInbound += stats[i].inbound.all.messages.count; - totalOutbound += stats[i].outbound.all.messages.count; - } - - expect(totalInbound).to.equal(50, 'Verify all inbound messages found'); - expect(totalOutbound).to.equal(20, 'Verify all outbound messages found'); - done(); - } catch (err) { - done(err); - } - } - ); + it('appstats_limit_forwards', async function () { + var page = await rest.stats({ + end: lastYear + '-02-03:15:04', + direction: 'forwards', + limit: 1, + }); + var stats = page.items; + expect(stats.length == 1, 'Verify 1 stat records found').to.be.ok; + + var totalInbound = 0, + totalOutbound = 0; + for (var i = 0; i < stats.length; i++) { + totalInbound += stats[i].inbound.all.messages.count; + totalOutbound += stats[i].outbound.all.messages.count; + } + + expect(totalInbound).to.equal(50, 'Verify all inbound messages found'); + expect(totalOutbound).to.equal(20, 'Verify all outbound messages found'); }); /** * Check query pagination (backwards) * @spec : (RSC6b2) */ - it('appstats_pagination_backwards', function (done) { - rest.stats( - { - end: lastYear + '-02-03:15:05', - direction: 'backwards', - limit: 1, - }, - function (err, page) { - if (err) { - done(err); - return; - } - - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(7000, 'Verify all published message data found'); - - /* get next page */ - expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; - page.next(function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(6000, 'Verify all published message data found'); - - /* get next page */ - expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; - } catch (err) { - done(err); - return; - } - page.next(function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(5000, 'Verify all published message data found'); - - /* verify no further pages */ - expect(page.isLast(), 'Verify last page').to.be.ok; - } catch (err) { - done(err); - return; - } - - page.first(function (err, page) { - if (err) { - done(err); - return; - } - try { - var totalData = 0; - var stats = page.items; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(7000, 'Verify all published message data found'); - - /* that's it */ - done(); - } catch (err) { - done(err); - return; - } - }); - }); - }); - } - ); + it('appstats_pagination_backwards', async function () { + var page = await rest.stats({ + end: lastYear + '-02-03:15:05', + direction: 'backwards', + limit: 1, + }); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(7000, 'Verify all published message data found'); + + /* get next page */ + expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; + var page = await page.next(); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(6000, 'Verify all published message data found'); + + /* get next page */ + expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; + var page = await page.next(); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(5000, 'Verify all published message data found'); + + /* verify no further pages */ + expect(page.isLast(), 'Verify last page').to.be.ok; + + var page = await page.first(); + var totalData = 0; + var stats = page.items; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(7000, 'Verify all published message data found'); }); /** * Check query pagination (forwards) * @spec : (RSC6b2) */ - it('appstats_pagination_forwards', function (done) { - rest.stats( - { - end: lastYear + '-02-03:15:05', - direction: 'forwards', - limit: 1, - }, - function (err, page) { - if (err) { - done(err); - return; - } - - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(5000, 'Verify all published message data found'); - - /* get next page */ - expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; - } catch (err) { - done(err); - return; - } - page.next(function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(6000, 'Verify all published message data found'); - - /* get next page */ - expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; - } catch (err) { - done(err); - return; - } - page.next(function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(7000, 'Verify all published message data found'); - - /* verify no further pages */ - expect(page.isLast(), 'Verify last page').to.be.ok; - } catch (err) { - done(err); - return; - } - - page.first(function (err, page) { - if (err) { - done(err); - return; - } - try { - var totalData = 0; - var stats = page.items; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(5000, 'Verify all published message data found'); - - /* that's it */ - done(); - } catch (err) { - done(err); - } - }); - }); - }); - } - ); + it('appstats_pagination_forwards', async function () { + var page = await rest.stats({ + end: lastYear + '-02-03:15:05', + direction: 'forwards', + limit: 1, + }); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(5000, 'Verify all published message data found'); + + /* get next page */ + expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; + var page = await page.next(); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(6000, 'Verify all published message data found'); + + /* get next page */ + expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; + var page = await page.next(); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(7000, 'Verify all published message data found'); + + /* verify no further pages */ + expect(page.isLast(), 'Verify last page').to.be.ok; + + var page = await page.first(); + var totalData = 0; + var stats = page.items; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(5000, 'Verify all published message data found'); }); /** * Check query pagination omitted (defaults to backwards) * @spec : (RSC6b2) */ - it('appstats_pagination_omitted', function (done) { - rest.stats( - { - end: lastYear + '-02-03:15:05', - limit: 1, - }, - function (err, page) { - if (err) { - done(err); - return; - } - - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(7000, 'Verify all published message data found'); - - /* get next page */ - expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; - } catch (err) { - done(err); - return; - } - page.next(function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(6000, 'Verify all published message data found'); - - /* get next page */ - expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; - } catch (err) { - done(err); - return; - } - page.next(function (err, page) { - if (err) { - done(err); - return; - } - try { - var stats = page.items; - expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; - var totalData = 0; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(5000, 'Verify all published message data found'); - - /* verify no further pages */ - expect(page.isLast(), 'Verify last page').to.be.ok; - } catch (err) { - done(err); - return; - } - - page.first(function (err, page) { - if (err) { - done(err); - return; - } - try { - var totalData = 0; - var stats = page.items; - for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; - expect(totalData).to.equal(7000, 'Verify all published message data found'); - - /* that's it */ - done(); - } catch (err) { - done(err); - } - }); - }); - }); - } - ); - }); - - if (typeof Promise !== 'undefined') { - it('stats_promise', function (done) { - var client = helper.AblyRest({ promises: true }); - - client - .stats() - .then(function () { - console.log('here'); - done(); - }) - ['catch'](function (err) { - done(err); - }); + it('appstats_pagination_omitted', async function () { + var page = await rest.stats({ + end: lastYear + '-02-03:15:05', + limit: 1, }); - } + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(7000, 'Verify all published message data found'); + + /* get next page */ + expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; + var page = await page.next(); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(6000, 'Verify all published message data found'); + + /* get next page */ + expect(page.hasNext(), 'Verify next page rel link present').to.be.ok; + var page = await page.next(); + var stats = page.items; + expect(stats.length == 1, 'Verify exactly one stats record found').to.be.ok; + var totalData = 0; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(5000, 'Verify all published message data found'); + + /* verify no further pages */ + expect(page.isLast(), 'Verify last page').to.be.ok; + + var page = await page.first(); + var totalData = 0; + var stats = page.items; + for (var i = 0; i < stats.length; i++) totalData += stats[i].inbound.all.messages.data; + expect(totalData).to.equal(7000, 'Verify all published message data found'); + }); }); }); diff --git a/test/rest/status.test.js b/test/rest/status.test.js index 55573b4594..55c33a8b59 100644 --- a/test/rest/status.test.js +++ b/test/rest/status.test.js @@ -21,52 +21,18 @@ define(['shared_helper', 'chai'], function (helper, chai) { }); }); - restTestOnJsonMsgpack('status0', function (done, rest) { + restTestOnJsonMsgpack('status0', async function (rest) { var channel = rest.channels.get('status0'); - channel.status(function (err, channelDetails) { - try { - expect(channelDetails.channelId).to.equal('status0'); - expect(channelDetails.status.isActive).to.be.a('boolean'); - var metrics = channelDetails.status.occupancy.metrics; - expect(metrics.connections).to.be.a('number'); - expect(metrics.presenceConnections).to.be.a('number'); - expect(metrics.presenceMembers).to.be.a('number'); - expect(metrics.presenceSubscribers).to.be.a('number'); - expect(metrics.publishers).to.be.a('number'); - expect(metrics.subscribers).to.be.a('number'); - done(); - } catch (err) { - done(err); - } - }); + var channelDetails = await channel.status(); + expect(channelDetails.channelId).to.equal('status0'); + expect(channelDetails.status.isActive).to.be.a('boolean'); + var metrics = channelDetails.status.occupancy.metrics; + expect(metrics.connections).to.be.a('number'); + expect(metrics.presenceConnections).to.be.a('number'); + expect(metrics.presenceMembers).to.be.a('number'); + expect(metrics.presenceSubscribers).to.be.a('number'); + expect(metrics.publishers).to.be.a('number'); + expect(metrics.subscribers).to.be.a('number'); }); - - if (typeof Promise !== 'undefined') { - it('statusPromise', function (done) { - var rest = helper.AblyRest({ promises: true }); - var channel = rest.channels.get('statusPromise'); - channel - .status() - .then(function (channelDetails) { - try { - expect(channelDetails.channelId).to.equal('statusPromise'); - expect(channelDetails.status.isActive).to.be.a('boolean'); - var metrics = channelDetails.status.occupancy.metrics; - expect(metrics.connections).to.be.a('number'); - expect(metrics.presenceConnections).to.be.a('number'); - expect(metrics.presenceMembers).to.be.a('number'); - expect(metrics.presenceSubscribers).to.be.a('number'); - expect(metrics.publishers).to.be.a('number'); - expect(metrics.subscribers).to.be.a('number'); - done(); - } catch (err) { - done(err); - } - }) - ['catch'](function (err) { - done(err); - }); - }); - } }); }); diff --git a/test/rest/time.test.js b/test/rest/time.test.js index 839584378e..71d0ee28ab 100644 --- a/test/rest/time.test.js +++ b/test/rest/time.test.js @@ -17,37 +17,13 @@ define(['shared_helper', 'chai'], function (helper, chai) { }); }); - it('time0', function (done) { - rest.time(function (err, serverTime) { - if (err) { - done(err); - return; - } - try { - var localFiveMinutesAgo = utils.now() - 5 * 60 * 1000; - expect( - serverTime > localFiveMinutesAgo, - 'Verify returned time matches current local time with 5 minute leeway for badly synced local clocks' - ).to.be.ok; - done(); - } catch (err) { - done(err); - } - }); + it('time0', async function () { + var serverTime = await rest.time(); + var localFiveMinutesAgo = utils.now() - 5 * 60 * 1000; + expect( + serverTime > localFiveMinutesAgo, + 'Verify returned time matches current local time with 5 minute leeway for badly synced local clocks' + ).to.be.ok; }); - - if (typeof Promise !== 'undefined') { - it('timePromise', function (done) { - var rest = helper.AblyRest({ promises: true }); - rest - .time() - .then(function () { - done(); - }) - ['catch'](function (err) { - done(err); - }); - }); - } }); }); diff --git a/test/support/browser_file_list.js b/test/support/browser_file_list.js index 6175faaf54..4d0fa8522d 100644 --- a/test/support/browser_file_list.js +++ b/test/support/browser_file_list.js @@ -1,7 +1,5 @@ window.__testFiles__ = { base: '../' }; window.__testFiles__.files = { - 'build/ably-commonjs.js': true, - 'build/ably-commonjs.noencryption.js': true, 'build/ably-nativescript.js': true, 'build/ably-node.js': true, 'build/ably-reactnative.js': true, @@ -13,9 +11,6 @@ window.__testFiles__.files = { 'browser/lib/util/base64.js': true, 'node_modules/async/lib/async.js': true, 'node_modules/@ably/vcdiff-decoder/dist/vcdiff-decoder.js': true, - 'node_modules/crypto-js/build/enc-base64.js': true, - 'node_modules/crypto-js/build/enc-utf8.js': true, - 'node_modules/crypto-js/build/core.js': true, 'test/common/globals/environment.js': true, 'test/common/globals/named_dependencies.js': true, 'test/common/modules/client_module.js': true, diff --git a/test/web_server b/test/web_server index 1549b96692..f42134d906 100755 --- a/test/web_server +++ b/test/web_server @@ -35,15 +35,6 @@ server.get('/', function(req, res) { } }); - -/** - * This is a rather hacky workaround since crypto-js base64 depends on node_modules/crypto-js/build/core but will request the file from the root level of the server. - * I'm leaving this here for now in lieu of a more elegant solution as the 'real' solution is to improve the way we use dependencies in these tests. - */ -server.get('/core.js', function (req, res) { - res.redirect('/node_modules/crypto-js/build/core.js'); -}); - server.use('/node_modules', express.static(__dirname + '/../node_modules')); server.use('/test', express.static(__dirname)); server.use('/browser', express.static(__dirname + '/../src/web')); diff --git a/webpack.config.js b/webpack.config.js index 54b49e6109..c569d64272 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -27,7 +27,7 @@ const baseConfig = { { test: /\.ts$/, loader: 'ts-loader' }, ], }, - target: 'web', + target: ['web', 'es5'], externals: { request: false, ws: false, @@ -54,7 +54,7 @@ const nodeConfig = { ...baseConfig.output, filename: 'ably-node.js', }, - target: 'node', + target: ['node', 'es5'], externals: { got: true, ws: true, @@ -73,12 +73,11 @@ const browserConfig = { entry: { index: platformPath('web'), }, - node: { - crypto: 'empty', - Buffer: false, - }, - externals: { - 'crypto-js': true, + resolve: { + ...baseConfig.resolve, + fallback: { + crypto: false, + }, }, optimization: { minimize: false, @@ -95,9 +94,11 @@ const nativeScriptConfig = { entry: { index: platformPath('nativescript'), }, - node: { - crypto: 'empty', - Buffer: false, + resolve: { + ...baseConfig.resolve, + fallback: { + crypto: false, + }, }, externals: { request: false, @@ -122,10 +123,9 @@ const reactNativeConfig = { resolve: { extensions: ['.js', '.ts'], plugins: [new TsconfigPathsPlugin()], - }, - node: { - crypto: 'empty', - Buffer: false, + fallback: { + crypto: false, + }, }, externals: { request: false, @@ -137,23 +137,8 @@ const reactNativeConfig = { }, }; -const browserMinConfig = { - ...browserConfig, - output: { - ...baseConfig.output, - filename: 'ably.min.js', - }, - optimization: { - minimize: true, - }, - performance: { - hints: 'warning', - }, - devtool: 'source-map', -}; - const webworkerConfig = { - target: 'webworker', + target: ['webworker', 'es5'], ...browserConfig, entry: { index: platformPath('web', 'index-webworker.ts'), @@ -181,55 +166,9 @@ const webworkerConfig = { ], }; -const noEncryptionConfig = { - ...browserConfig, - entry: { - index: platformPath('web-noencryption'), - }, - output: { - ...baseConfig.output, - filename: 'ably.noencryption.js', - }, -}; - -const noEncryptionMinConfig = { - ...browserMinConfig, - entry: { - index: platformPath('web-noencryption'), - }, - output: { - ...baseConfig.output, - filename: 'ably.noencryption.min.js', - }, - devtool: 'source-map', -}; - -// We are using UMD in ably.js now so there is no need to build separately for CommonJS. These files are still being distributed to avoid breaking changes but should no longer be used. -const commonJsConfig = { - ...browserConfig, - output: { - ...baseConfig.output, - filename: 'ably-commonjs.js', - }, -}; - -const commonJsNoEncryptionConfig = { - ...noEncryptionConfig, - output: { - ...baseConfig.output, - filename: 'ably-commonjs.noencryption.js', - }, -}; - module.exports = { node: nodeConfig, - browser: browserConfig, - browserMin: browserMinConfig, webworker: webworkerConfig, nativeScript: nativeScriptConfig, reactNative: reactNativeConfig, - noEncryption: noEncryptionConfig, - noEncryptionMin: noEncryptionMinConfig, - commonJs: commonJsConfig, - commonJsNoEncryption: commonJsNoEncryptionConfig, };