diff --git a/dist/adapter.esm.js b/dist/adapter.esm.js index 862552155c8e296fb791c512cac2c438de251a06..9398f89ef080b9a7d96e5f880b87a8a2c98b9ffd 100644 --- a/dist/adapter.esm.js +++ b/dist/adapter.esm.js @@ -8,6 +8,20 @@ class Adapter { this.protocol = protocol; this.config = config; this.axios = axios; + this.pollTimer = null; + } + + /** + * Start listening for inbound messages + */ + start() { + switch (this.getMode()) { + case 'socket': this.openSocket(); break; + case 'http': { + const interval = ('pollInterval' in this.config) ? this.config.pollInterval : 5; + this.pollEveryXSeconds(interval); + } break; + } } /** @@ -79,6 +93,16 @@ class Adapter { }); } + /** + * Setup a timer to call poll every interval seconds + * @param {int} interval + */ + pollEveryXSeconds(interval) { + if (this.pollTimer) clearTimeout(this.pollTimer); + this.pollTimer = setTimeout(this.pollEveryXSeconds.bind(this, interval), interval*1000); + this.poll(); + } + /** * Call the GET /receive endpoint and process the messages with decode * @@ -96,14 +120,7 @@ class Adapter { }) .then((response) => { response.data.forEach((message) => { - const parsed = JSON.parse(message.message); - const validation = this.validate(parsed); - if (validation.valid) { - const type = this.protocol.getType(parsed); - this.protocol.decode(type, parsed); - } else { - this.protocol.receivedInvalid(parsed, validation); - } + this.receive(message); }); return response; }) @@ -125,16 +142,110 @@ class Adapter { }); } + /** + * Process a message received either from poll + * or from socket.onMessage + * @param {object} message + */ + receive(message) { + try { + const parsed = JSON.parse(message.message); + const validation = this.validate(parsed); + if (validation.valid) { + const type = this.protocol.getType(parsed); + this.protocol.decode(type, parsed); + } else { + this.protocol.receivedInvalid(parsed, validation); + } + } catch(err) { + console.error('receive failed', err); + } + } + + /** + * Decide whether to use http or socket for comms + * with the backbone + * @returns string + */ + getMode() { + return ('mode' in this.config) ? this.config.mode : 'http'; + } + + /** + * Create a new socket connection and send an authentication + * message. Websocket doesn't support headers so as soon + * as the socket is open a message is sent containing + * the authorisation header to authenticate the connection + */ + openSocket() { + this.getAuthorizationHeader() + .then((headers) => { + + const protocols = []; + + const socket = new WebSocket( + this.config.socket, + protocols, + ); + + socket.addEventListener('open', () => { + socket.send(JSON.stringify({ action: 'auth', headers })); + }); + + socket.addEventListener('message', (event) => { + console.log('message received'); + try { + const message = JSON.parse(event.data); + this.receive(message); + } catch (err) { + console.error('invalid message', typeof event.data); + } + }); + + socket.addEventListener('close', () => { + this.closeSocket(); + }); + + this.socket = socket; + return socket; + }); + } + + /** + * If the socket connection is lost ensure that a new socket + * is opened rather than continuing to send messages on this + * socket + */ + closeSocket() { + this.socket = null; + } + /** * Publish a message to the backbone with the specified topic * * Messages should be passed through encode before sending * @param {string} topic * @param {string} body - * @param {boolean} is_retry * @returns */ - publish(topic, body, is_retry = false) { + publish(topic, body) { + let mode = this.getMode(); + let response; + switch (mode) { + case 'http': response = this.http_publish(topic, body); break; + case 'socket': response = this.socket_publish(topic, body); break; + } + return response; + } + + /** + * Send via a POST to /send + * @param {string} topic + * @param {string} body + * @param {boolean} is_retry + * @returns Promise + */ + http_publish(topic, body, is_retry = false) { let adapterConfig = this.config; return this.getAuthorizationHeader() .then((headers) => { @@ -165,11 +276,26 @@ class Adapter { retry = true; } } - if (retry && !is_retry) return this.publish(topic, body, true); + if (retry && !is_retry) return this.http_publish(topic, body, true); else return Promise.reject(error); }); } + /** + * Publish via websocket socket.send + * @param {string} topic + * @param {string} body + */ + socket_publish(topic, body) { + if (this.socket) { + this.socket.send(JSON.stringify({ topic, message: body })); + } else { + this.openSocket().then((socket) => { + socket.send(JSON.stringify({ topic, message: body })); + }); + } + } + /** * Broadcast the message on the backbone * @@ -179,10 +305,25 @@ class Adapter { * * Messages should be passed through encode before sending * @param {string} body - * @param {boolean} is_retry * @returns */ - broadcast(body, is_retry = false) { + broadcast(body) { + let mode = this.getMode(); + let response; + switch (mode) { + case 'http': response = this.http_broadcast(body); break; + case 'socket': response = this.socket_broadcast(body); break; + } + return response; + } + + /** + * Broadcast via POST to /notify + * @param {string} body + * @param {boolean} is_retry + * @returns Promise + */ + http_broadcast(body, is_retry = false) { let adapterConfig = this.config; return this.getAuthorizationHeader() .then((headers) => { @@ -212,10 +353,24 @@ class Adapter { retry = true; } } - if (retry && !is_retry) return this.broadcast(body, true); + if (retry && !is_retry) return this.http_broadcast(body, true); else return Promise.reject(error); }); } + + /** + * Broadcast via websocket socket.send + * @param {string} body + */ + socket_broadcast(body) { + if (this.socket) { + this.socket.send(JSON.stringify({ message: body })); + } else { + this.openSocket().then((socket) => { + socket.send(JSON.stringify({ message: body })); + }); + } + } } export { Adapter }; diff --git a/dist/adapter.js b/dist/adapter.js index c1f0e28e2fa62fdf78acd646cc8f3f4a54c08c85..a262c180345426b690f83dca16fc3fdf7d71591e 100644 --- a/dist/adapter.js +++ b/dist/adapter.js @@ -10,6 +10,20 @@ class Adapter { this.protocol = protocol; this.config = config; this.axios = axios; + this.pollTimer = null; + } + + /** + * Start listening for inbound messages + */ + start() { + switch (this.getMode()) { + case 'socket': this.openSocket(); break; + case 'http': { + const interval = ('pollInterval' in this.config) ? this.config.pollInterval : 5; + this.pollEveryXSeconds(interval); + } break; + } } /** @@ -81,6 +95,16 @@ class Adapter { }); } + /** + * Setup a timer to call poll every interval seconds + * @param {int} interval + */ + pollEveryXSeconds(interval) { + if (this.pollTimer) clearTimeout(this.pollTimer); + this.pollTimer = setTimeout(this.pollEveryXSeconds.bind(this, interval), interval*1000); + this.poll(); + } + /** * Call the GET /receive endpoint and process the messages with decode * @@ -98,14 +122,7 @@ class Adapter { }) .then((response) => { response.data.forEach((message) => { - const parsed = JSON.parse(message.message); - const validation = this.validate(parsed); - if (validation.valid) { - const type = this.protocol.getType(parsed); - this.protocol.decode(type, parsed); - } else { - this.protocol.receivedInvalid(parsed, validation); - } + this.receive(message); }); return response; }) @@ -127,16 +144,110 @@ class Adapter { }); } + /** + * Process a message received either from poll + * or from socket.onMessage + * @param {object} message + */ + receive(message) { + try { + const parsed = JSON.parse(message.message); + const validation = this.validate(parsed); + if (validation.valid) { + const type = this.protocol.getType(parsed); + this.protocol.decode(type, parsed); + } else { + this.protocol.receivedInvalid(parsed, validation); + } + } catch(err) { + console.error('receive failed', err); + } + } + + /** + * Decide whether to use http or socket for comms + * with the backbone + * @returns string + */ + getMode() { + return ('mode' in this.config) ? this.config.mode : 'http'; + } + + /** + * Create a new socket connection and send an authentication + * message. Websocket doesn't support headers so as soon + * as the socket is open a message is sent containing + * the authorisation header to authenticate the connection + */ + openSocket() { + this.getAuthorizationHeader() + .then((headers) => { + + const protocols = []; + + const socket = new WebSocket( + this.config.socket, + protocols, + ); + + socket.addEventListener('open', () => { + socket.send(JSON.stringify({ action: 'auth', headers })); + }); + + socket.addEventListener('message', (event) => { + console.log('message received'); + try { + const message = JSON.parse(event.data); + this.receive(message); + } catch (err) { + console.error('invalid message', typeof event.data); + } + }); + + socket.addEventListener('close', () => { + this.closeSocket(); + }); + + this.socket = socket; + return socket; + }); + } + + /** + * If the socket connection is lost ensure that a new socket + * is opened rather than continuing to send messages on this + * socket + */ + closeSocket() { + this.socket = null; + } + /** * Publish a message to the backbone with the specified topic * * Messages should be passed through encode before sending * @param {string} topic * @param {string} body - * @param {boolean} is_retry * @returns */ - publish(topic, body, is_retry = false) { + publish(topic, body) { + let mode = this.getMode(); + let response; + switch (mode) { + case 'http': response = this.http_publish(topic, body); break; + case 'socket': response = this.socket_publish(topic, body); break; + } + return response; + } + + /** + * Send via a POST to /send + * @param {string} topic + * @param {string} body + * @param {boolean} is_retry + * @returns Promise + */ + http_publish(topic, body, is_retry = false) { let adapterConfig = this.config; return this.getAuthorizationHeader() .then((headers) => { @@ -167,11 +278,26 @@ class Adapter { retry = true; } } - if (retry && !is_retry) return this.publish(topic, body, true); + if (retry && !is_retry) return this.http_publish(topic, body, true); else return Promise.reject(error); }); } + /** + * Publish via websocket socket.send + * @param {string} topic + * @param {string} body + */ + socket_publish(topic, body) { + if (this.socket) { + this.socket.send(JSON.stringify({ topic, message: body })); + } else { + this.openSocket().then((socket) => { + socket.send(JSON.stringify({ topic, message: body })); + }); + } + } + /** * Broadcast the message on the backbone * @@ -181,10 +307,25 @@ class Adapter { * * Messages should be passed through encode before sending * @param {string} body - * @param {boolean} is_retry * @returns */ - broadcast(body, is_retry = false) { + broadcast(body) { + let mode = this.getMode(); + let response; + switch (mode) { + case 'http': response = this.http_broadcast(body); break; + case 'socket': response = this.socket_broadcast(body); break; + } + return response; + } + + /** + * Broadcast via POST to /notify + * @param {string} body + * @param {boolean} is_retry + * @returns Promise + */ + http_broadcast(body, is_retry = false) { let adapterConfig = this.config; return this.getAuthorizationHeader() .then((headers) => { @@ -214,10 +355,24 @@ class Adapter { retry = true; } } - if (retry && !is_retry) return this.broadcast(body, true); + if (retry && !is_retry) return this.http_broadcast(body, true); else return Promise.reject(error); }); } + + /** + * Broadcast via websocket socket.send + * @param {string} body + */ + socket_broadcast(body) { + if (this.socket) { + this.socket.send(JSON.stringify({ message: body })); + } else { + this.openSocket().then((socket) => { + socket.send(JSON.stringify({ message: body })); + }); + } + } } exports.Adapter = Adapter; diff --git a/package.json b/package.json index 1795dd64b50996bc2a32fc0ed3a387fd586081d5..c107aae53ee111f1777d60a386ee9a1edfc03997 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,11 @@ "*.**": "prettier --check --ignore-unknown" }, "dependencies": { - "faye-websocket": "^0.11.4", "json-schema-remote": "^1.6.2", - "swagger-model-validator": "^3.0.21" + "net": "^1.0.2", + "swagger-model-validator": "^3.0.21", + "tls": "^0.0.1", + "ws": "^8.12.0" }, "devDependencies": { "@babel/core": "^7.0.0-0", @@ -46,7 +48,7 @@ "@commitlint/config-conventional": "^15.0.0", "@cucumber/cucumber": "^8.10.0", "@rollup/plugin-babel": "^6.0.3", - "axios": "^1.2.3", + "axios": "^1.2.4", "axios-mock-adapter": "^1.21.2", "babel-jest": "^27.4.4", "backbone-adapter-testsuite": "git+https://git.noc.ac.uk/communications-backbone-system/backbone-adapter-testsuite.git#v0.1.0", diff --git a/rollup.config.js b/rollup.config.js index 5a1292b35a360bcb4be76e6411b6cf26d847d61b..3d88e2e66364063564b5d254dd0bbb8ba619b337 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -10,7 +10,7 @@ exports.default = [ file: 'dist/adapter.js', format: 'cjs', }, - ], + ] }, { input: 'src/protocol/index.js', diff --git a/src/adapter/index.js b/src/adapter/index.js index ef71cc39fbd2d8adfb931f29db5a08adfe2f45c7..fe7faa1987166365616c4546858a5e2be5b02a51 100644 --- a/src/adapter/index.js +++ b/src/adapter/index.js @@ -8,6 +8,20 @@ export class Adapter { this.protocol = protocol; this.config = config; this.axios = axios; + this.pollTimer = null; + } + + /** + * Start listening for inbound messages + */ + start() { + switch (this.getMode()) { + case 'socket': this.openSocket(); break; + case 'http': { + const interval = ('pollInterval' in this.config) ? this.config.pollInterval : 5; + this.pollEveryXSeconds(interval); + } break; + } } /** @@ -79,6 +93,16 @@ export class Adapter { }); } + /** + * Setup a timer to call poll every interval seconds + * @param {int} interval + */ + pollEveryXSeconds(interval) { + if (this.pollTimer) clearTimeout(this.pollTimer); + this.pollTimer = setTimeout(this.pollEveryXSeconds.bind(this, interval), interval*1000); + this.poll(); + } + /** * Call the GET /receive endpoint and process the messages with decode * @@ -96,14 +120,7 @@ export class Adapter { }) .then((response) => { response.data.forEach((message) => { - const parsed = JSON.parse(message.message); - const validation = this.validate(parsed); - if (validation.valid) { - const type = this.protocol.getType(parsed); - this.protocol.decode(type, parsed); - } else { - this.protocol.receivedInvalid(parsed, validation); - } + this.receive(message); }); return response; }) @@ -125,16 +142,109 @@ export class Adapter { }); } + /** + * Process a message received either from poll + * or from socket.onMessage + * @param {object} message + */ + receive(message) { + try { + const parsed = JSON.parse(message.message); + const validation = this.validate(parsed); + if (validation.valid) { + const type = this.protocol.getType(parsed); + this.protocol.decode(type, parsed); + } else { + this.protocol.receivedInvalid(parsed, validation); + } + } catch(err) { + console.error('receive failed', err); + } + } + + /** + * Decide whether to use http or socket for comms + * with the backbone + * @returns string + */ + getMode() { + return ('mode' in this.config) ? this.config.mode : 'http'; + } + + /** + * Create a new socket connection and send an authentication + * message. Websocket doesn't support headers so as soon + * as the socket is open a message is sent containing + * the authorisation header to authenticate the connection + */ + openSocket() { + this.getAuthorizationHeader() + .then((headers) => { + + const protocols = []; + + const socket = new WebSocket( + this.config.socket, + protocols, + ); + + socket.addEventListener('open', () => { + socket.send(JSON.stringify({ action: 'auth', headers })); + }); + + socket.addEventListener('message', (event) => { + console.log('message received'); + try { + const message = JSON.parse(event.data); + this.receive(message); + } catch (err) { + console.error('invalid message', typeof event.data); + } + }); + + socket.addEventListener('close', () => { + this.closeSocket(); + }); + + this.socket = socket; + return socket; + }); + } + + /** + * If the socket connection is lost ensure that a new socket + * is opened rather than continuing to send messages on this + * socket + */ + closeSocket() { + this.socket = null; + } + /** * Publish a message to the backbone with the specified topic * * Messages should be passed through encode before sending * @param {string} topic * @param {string} body - * @param {boolean} is_retry * @returns */ - publish(topic, body, is_retry = false) { + publish(topic, body) { + let mode = this.getMode(); + let response; + switch (mode) { + case 'http': response = this.http_publish(topic, body); break; + case 'socket': response = this.socket_publish(topic, body); break; + } + return response; + } + + /** + * Send via a POST to /send + * @param {string} topic + * @param {string} body + * @returns Promise + */ + http_publish(topic, body, is_retry = false) { let adapterConfig = this.config; return this.getAuthorizationHeader() .then((headers) => { @@ -165,11 +275,26 @@ export class Adapter { retry = true; } } - if (retry && !is_retry) return this.publish(topic, body, true); + if (retry && !is_retry) return this.http_publish(topic, body, true); else return Promise.reject(error); }); } + /** + * Publish via websocket socket.send + * @param {string} topic + * @param {string} body + */ + socket_publish(topic, body) { + if (this.socket) { + this.socket.send(JSON.stringify({ topic, message: body })); + } else { + this.openSocket().then((socket) => { + socket.send(JSON.stringify({ topic, message: body })); + }); + } + } + /** * Broadcast the message on the backbone * @@ -179,10 +304,25 @@ export class Adapter { * * Messages should be passed through encode before sending * @param {string} body - * @param {boolean} is_retry * @returns */ - broadcast(body, is_retry = false) { + broadcast(body) { + let mode = this.getMode(); + let response; + switch (mode) { + case 'http': response = this.http_broadcast(body); break; + case 'socket': response = this.socket_broadcast(body); break; + } + return response; + } + + /** + * Broadcast via POST to /notify + * @param {string} body + * @param {boolean} is_retry + * @returns Promise + */ + http_broadcast(body, is_retry = false) { let adapterConfig = this.config; return this.getAuthorizationHeader() .then((headers) => { @@ -212,8 +352,22 @@ export class Adapter { retry = true; } } - if (retry && !is_retry) return this.broadcast(body, true); + if (retry && !is_retry) return this.http_broadcast(body, true); else return Promise.reject(error); }); } -} + + /** + * Broadcast via websocket socket.send + * @param {string} body + */ + socket_broadcast(body) { + if (this.socket) { + this.socket.send(JSON.stringify({ message: body })); + } else { + this.openSocket().then((socket) => { + socket.send(JSON.stringify({ message: body })); + }); + } + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 1fc49247dda3b7fbb3691da63eb5ca217d93964b..d64cf2146ab2f969ccded9da1cffb629d2a553f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -52,7 +52,17 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.20.7", "@babel/generator@^7.7.2": +"@babel/generator@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" + integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== + dependencies: + "@babel/types" "^7.21.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.7.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== @@ -77,13 +87,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -99,10 +109,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== +"@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -110,8 +120,8 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": version "7.20.2" @@ -147,14 +157,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" - integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" "@babel/highlight@^7.18.6": version "7.18.6" @@ -165,10 +175,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" + integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== + +"@babel/parser@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" + integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -262,13 +277,13 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/runtime@^7.15.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" - integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": +"@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -277,10 +292,10 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" - integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== +"@babel/traverse@^7.20.12", "@babel/traverse@^7.7.2": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" @@ -288,12 +303,28 @@ "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.7" + "@babel/parser" "^7.20.13" "@babel/types" "^7.20.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" + integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.3" + "@babel/types" "^7.21.3" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== @@ -302,6 +333,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" + integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -457,10 +497,10 @@ resolved "https://registry.yarnpkg.com/@cucumber/ci-environment/-/ci-environment-9.1.0.tgz#6d868141c7cfd616931f14723e122a1069401998" integrity sha512-jdnF6APXP3GawMue8kdMxhu6TBhyRUO4KDRxTowf06NtclLjIw2Ybpo9IcIOMvE8kHukvJyM00uxWX+CfS7JgQ== -"@cucumber/cucumber-expressions@16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.0.tgz#2a2538b775e83b84a275ea10f618242717937968" - integrity sha512-Q/tKDNje9RrcOXF2TO2NwTW92rzk+RwKkhYYKLxQT26Co8Qbjom0Cz02HsCMA2wjJ8dw6/d2IbWgiOay9RQA+w== +"@cucumber/cucumber-expressions@16.1.1": + version "16.1.1" + resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.1.tgz#5f364f39bcf33950544cca2fc3423aca8fa36ed3" + integrity sha512-Ugsb9qxfgrgfUKsGvbx0awVk+69NIFjWfxNT+dnm62YrF2gdTHYxAOzOLuPgvE0yqYTh+3otrFLDDfkHGThM1g== dependencies: regexp-match-indices "1.0.2" @@ -529,23 +569,40 @@ commander "9.4.1" source-map-support "^0.5.21" -"@cucumber/gherkin@25.0.2", "@cucumber/gherkin@^25.0.0": +"@cucumber/gherkin@26.0.3": + version "26.0.3" + resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-26.0.3.tgz#6ffe37570c608caa329784161305056135a19c96" + integrity sha512-xwJHi//bLFEU1drIyw2yswwUHnnVWO4XcyVBbCTDs6DkSh262GkogFI/IWwChZqJfOXnPglzLGxR1DibcZsILA== + dependencies: + "@cucumber/messages" "19.1.4 - 21" + +"@cucumber/gherkin@^25.0.0": version "25.0.2" resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-25.0.2.tgz#e430879f01978d1f9e7a7aa0563031a3a36022e7" integrity sha512-EdsrR33Y5GjuOoe2Kq5Y9DYwgNRtUD32H4y2hCrT6+AWo7ibUQu7H+oiWTgfVhwbkHsZmksxHSxXz/AwqqyCRQ== dependencies: "@cucumber/messages" "^19.1.4" -"@cucumber/html-formatter@20.2.0": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-20.2.0.tgz#20857efec721fbc5d64cc31b0107575db1e58651" - integrity sha512-apcxS5Imeh3Wk4VMkuB3C4UQ+0/PVlNTkcWx9/5wwd+p3EnEbtvbZUhYIHgVBm+0FKEc22yrXBEc0N85fT/r4A== +"@cucumber/html-formatter@20.2.1": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-20.2.1.tgz#e12ef35ae99e0a941d03eea3518103eb127f04b5" + integrity sha512-bwwyr1WjlOJ5dEFOLGbtYWbUprloB2eymqXBmmTC10s0xapZXkFn4VfHgMshaH91XiCIY/MoabWNAau3AeMHkQ== "@cucumber/message-streams@4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-4.0.1.tgz#a5339d3504594bb2edb5732aaae94dddb24d0970" integrity sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA== +"@cucumber/messages@19.1.4 - 21": + version "21.0.1" + resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-21.0.1.tgz#1468cef60d6da4d4f540a70ab1265f6540f44f51" + integrity sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g== + dependencies: + "@types/uuid" "8.3.4" + class-transformer "0.5.1" + reflect-metadata "0.1.13" + uuid "9.0.0" + "@cucumber/messages@20.0.0": version "20.0.0" resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-20.0.0.tgz#494d30bd2880b04dcb3a958f8c0ec5638b7b3596" @@ -582,16 +639,16 @@ tslib "^2" "@eslint-community/eslint-utils@^4.2.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz#a556790523a351b4e47e9d385f47265eaaf9780a" - integrity sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA== + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403" - integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.1.tgz#087cb8d9d757bb22e9c9946c9c0c2bf8806830f1" + integrity sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw== "@eslint/eslintrc@^2.0.1": version "2.0.1" @@ -849,7 +906,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -927,12 +984,12 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -1079,9 +1136,9 @@ acorn@^7.1.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== agent-base@6: version "6.0.2" @@ -1265,10 +1322,10 @@ axios-mock-adapter@^1.21.2: fast-deep-equal "^3.1.3" is-buffer "^2.0.5" -axios@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.3.tgz#31a3d824c0ebf754a004b585e5f04a5f87e6c4ff" - integrity sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw== +axios@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.4.tgz#6555dd955d2efa9b8f4cb4cb0b3371b7b243537a" + integrity sha512-lIQuCfBJvZB/Bv7+RWUqEJqNShGOVpk9v7P0ZWx5Ip0qY6u7JBAU6dzQPMLasU9vHL2uD8av/1FDJXj7n6c39w== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -1419,9 +1476,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001400: - version "1.0.30001442" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz#40337f1cf3be7c637b061e2f78582dc1daec0614" - integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow== + version "1.0.30001448" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001448.tgz#ca7550b1587c92a392a2b377cd9c508b3b4395bf" + integrity sha512-tq2YI+MJnooG96XpbTRYkBxLxklZPOdLmNIOdIhvf7SNJan6u5vCKum8iT7ZfCt70m1GPkuC7P3TtX6UuhupuA== capital-case@^1.0.4: version "1.0.4" @@ -2086,13 +2143,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" @@ -2218,9 +2268,9 @@ get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -2372,11 +2422,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -3012,9 +3057,9 @@ jest@^27.4.4: jest-cli "^27.5.1" js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== js-tokens@^4.0.0: version "4.0.0" @@ -3465,6 +3510,11 @@ nested-error-stacks@~2.0.1: resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b" integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== +net@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/net/-/net-1.0.2.tgz#d1757ec9a7fb2371d83cf4755ce3e27e10829388" + integrity sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -3525,12 +3575,7 @@ object-assign@^4.0.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-inspect@^1.9.0: +object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== @@ -3732,9 +3777,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" - integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + version "2.8.7" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" + integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== pretty-format@^27.5.1: version "27.5.1" @@ -3786,9 +3831,9 @@ psl@^1.1.33: integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.0, punycode@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.2.0.tgz#2092cc57cd2582c38e4e7e8bb869dc8d3148bc74" - integrity sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== q@^1.5.1: version "1.5.1" @@ -3977,9 +4022,9 @@ resolve-pkg@^2.0.0: resolve-from "^5.0.0" resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== resolve@^1.10.0, resolve@^1.20.0: version "1.22.1" @@ -4030,9 +4075,9 @@ rimraf@^3.0.0, rimraf@^3.0.2: glob "^7.1.3" rollup@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.9.1.tgz#27501d3d026418765fe379d5620d25954ff2a011" - integrity sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w== + version "3.10.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.10.1.tgz#56278901ed11fc2898421e8e3e2c8155bc7b40b4" + integrity sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw== optionalDependencies: fsevents "~2.3.2" @@ -4050,7 +4095,7 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-buffer@>=5.1.0, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4436,6 +4481,11 @@ through2@^4.0.0: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tls@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tls/-/tls-0.0.1.tgz#0ab2bf5968d71df2f8c0e1515d24a2240b98aac8" + integrity sha512-GzHpG+hwupY8VMR6rYsnAhTHqT/97zT45PG8WD5eTT1lq+dFE0nN+1PYpsoBcHJgSmTz5ceK2Cv88IkPmIPOtQ== + tmp@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -4689,20 +4739,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -4774,6 +4810,11 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"