diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e2a4057..0c5292b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,6 @@ on: push: branches-ignore: [main] workflow_dispatch: - pull_request: env: UT_DISABLE_NODE_CURRENT: true diff --git a/messages/lightning.preview.app.md b/messages/lightning.preview.app.md index f41ccb1..2b9620f 100644 --- a/messages/lightning.preview.app.md +++ b/messages/lightning.preview.app.md @@ -35,6 +35,10 @@ Type of device to emulate in preview. For mobile virtual devices, specify the device ID to preview. If omitted, the first available virtual device will be used. +# error.no-project + +This command is required to run from within a Salesforce project directory. %s + # error.fetching.app-id Unable to determine App Id for %s @@ -63,15 +67,21 @@ Preparing to download Downloading -# certificate.attention +# trust.local.dev.server + +Note: Your desktop browser requires additional configuration to trust the local development server. See the documentation for more details. + +# certificate.installation.notice + +To use local preview on your device, you have to install a self-signed certificate on it. If you previously set up a certificate for your device, you can skip this step. + +# certificate.installation.skip.message -╔═══════════╗ -║ ATTENTION ║ -╚═══════════╝ +Do you want to skip this step # certificate.installation.description -If you have not done so already, please install the self-signed certificate on your device before proceeding. The certificate file is located at +Before proceeding, install the self-signed certificate on your device. The certificate file is located at `%s` diff --git a/messages/shared.utils.md b/messages/shared.utils.md index 19ae6c3..447a82d 100644 --- a/messages/shared.utils.md +++ b/messages/shared.utils.md @@ -1,19 +1,27 @@ -# lwc-dev-server-utils.port-desc +# config-utils.port-desc The port number of the local dev server -# lwc-dev-server-utils.port-message +# config-utils.port-error-message -Must be a number between 1 and 65535 +The port number must be a number between 1 and 65535 -# lwc-dev-server-utils.workspace-desc +# config-utils.workspace-desc The workspace name of the local lwc dev server -# lwc-dev-server-utils.workspace-message +# config-utils.workspace-error-message Valid workspace value is "SalesforceCLI" OR "mrt" -# identity-utils.token-desc +# config-utils.token-desc The Base64-encoded identity token of the local web server + +# config-utils.cert-desc + +The SSL certificate data to be used by the local dev server for secure connections + +# config-utils.cert-error-message + +You must provide valid SSL certificate data diff --git a/package.json b/package.json index ed09818..8fef1d6 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,11 @@ "@lwrjs/api": "0.13.0-alpha.22", "@lwc/lwc-dev-server": "^8.1.1", "@lwc/sfdc-lwc-compiler": "^8.1.1", - "@oclif/core": "^3.26.6", - "@salesforce/core": "^7.3.9", + "@oclif/core": "^4.0.7", + "@salesforce/core": "^8.1.0", "@salesforce/kit": "^3.1.6", - "@salesforce/lwc-dev-mobile-core": "4.0.0-alpha.4", - "@salesforce/sf-plugins-core": "^9.1.1", + "@salesforce/lwc-dev-mobile-core": "4.0.0-alpha.5", + "@salesforce/sf-plugins-core": "^11.1.2", "@inquirer/select": "^2.3.7", "chalk": "^5.3.0", "lwc": "7.0.0", @@ -23,7 +23,7 @@ "devDependencies": { "@oclif/plugin-command-snapshot": "^5.2.3", "@salesforce/cli-plugins-testkit": "^5.3.16", - "@salesforce/dev-scripts": "^9.1.2", + "@salesforce/dev-scripts": "^10.2.2", "@salesforce/plugin-command-reference": "^3.1.6", "@types/node-fetch": "^2.6.11", "@types/tar": "^6.1.13", diff --git a/src/commands/lightning/preview/app.ts b/src/commands/lightning/preview/app.ts index 8de5830..96d414f 100644 --- a/src/commands/lightning/preview/app.ts +++ b/src/commands/lightning/preview/app.ts @@ -7,7 +7,7 @@ import path from 'node:path'; import * as readline from 'node:readline'; -import { Logger, Messages } from '@salesforce/core'; +import { Logger, Messages, SfProject } from '@salesforce/core'; import { AndroidAppPreviewConfig, AndroidVirtualDevice, @@ -21,7 +21,6 @@ import chalk from 'chalk'; import { OrgUtils } from '../../../shared/orgUtils.js'; import { startLWCServer } from '../../../lwc-dev-server/index.js'; import { PreviewUtils } from '../../../shared/previewUtils.js'; -import { LwcDevServerUtils } from '../../../shared/lwcDevServerUtils.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-lightning-dev', 'lightning.preview.app'); @@ -37,6 +36,8 @@ export const androidSalesforceAppPreviewConfig = { activity: 'com.salesforce.chatter.Chatter', } as AndroidAppPreviewConfig; +const maxInt32 = 2_147_483_647; // maximum 32-bit signed integer value + export default class LightningPreviewApp extends SfCommand { public static readonly summary = messages.getMessage('summary'); public static readonly description = messages.getMessage('description'); @@ -62,15 +63,44 @@ export default class LightningPreviewApp extends SfCommand { }), }; - public static async waitForUserToInstallCert( + private static async waitForKeyPress(): Promise { + return new Promise((resolve) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + + // eslint-disable-next-line no-console + console.log(`\n${messages.getMessage('certificate.waiting')}\n`); + + process.stdin.setRawMode(true); + process.stdin.resume(); + process.stdin.once('data', () => { + process.stdin.setRawMode(false); + process.stdin.pause(); + rl.close(); + resolve(); + }); + }); + } + + public async waitForUserToInstallCert( platform: Platform.ios | Platform.android, device: IOSSimulatorDevice | AndroidVirtualDevice, certFilePath: string ): Promise { - let attention = `\n${messages.getMessage('certificate.attention')}`; - attention = chalk.red(attention); // eslint-disable-next-line no-console - console.log(attention); + console.log(`\n${messages.getMessage('certificate.installation.notice')}`); + + const skipInstall = await this.confirm({ + message: messages.getMessage('certificate.installation.skip.message'), + defaultAnswer: true, + ms: maxInt32, // simulate no timeout and wait for user to answer + }); + + if (skipInstall) { + return; + } let installationSteps = ''; if (platform === Platform.ios) { @@ -111,34 +141,6 @@ export default class LightningPreviewApp extends SfCommand { return LightningPreviewApp.waitForKeyPress(); } - private static async waitForKeyPress(): Promise { - return new Promise((resolve) => { - // Emit keypress events on stdin - readline.emitKeypressEvents(process.stdin); - // Set stdin to raw mode - if (process.stdin.isTTY) { - process.stdin.setRawMode(true); - } - - // eslint-disable-next-line no-console - console.log(`\n${messages.getMessage('certificate.waiting')}\n`); - - // Function to handle key press - function onKeyPress(): void { - // Restore stdin settings - if (process.stdin.isTTY) { - process.stdin.setRawMode(false); - } - process.stdin.removeListener('keypress', onKeyPress); - process.stdin.pause(); - resolve(); - } - - // Add keypress listener - process.stdin.on('keypress', onKeyPress); - }); - } - public async run(): Promise { const { flags } = await this.parse(LightningPreviewApp); const logger = await Logger.child(this.ctor.name); @@ -148,13 +150,12 @@ export default class LightningPreviewApp extends SfCommand { const targetOrg = flags['target-org']; const deviceId = flags['device-id']; - logger.debug('Determining Local Dev Server url'); - // todo: figure out how to make the port dynamic instead of hard-coded value here - const ldpServerUrl = PreviewUtils.generateWebSocketUrlForLocalDevServer( - platform, - `${await LwcDevServerUtils.getLocalDevServerPort()}` - ); - logger.debug(`Local Dev Server url is ${ldpServerUrl}`); + let sfdxProjectRootPath = ''; + try { + sfdxProjectRootPath = await SfProject.resolveProjectPath(); + } catch (error) { + return Promise.reject(new Error(messages.getMessage('error.no-project', [(error as Error)?.message ?? '']))); + } let appId: string | undefined; if (appName) { @@ -170,16 +171,39 @@ export default class LightningPreviewApp extends SfCommand { logger.debug(`App Id is ${appId}`); } + logger.debug('Determining the next available port for Local Dev Server'); + const serverPort = await PreviewUtils.getNextAvailablePort(); + logger.debug(`Next available port is ${serverPort}`); + + logger.debug('Determining Local Dev Server url'); + const ldpServerUrl = PreviewUtils.generateWebSocketUrlForLocalDevServer(platform, serverPort); + logger.debug(`Local Dev Server url is ${ldpServerUrl}`); + if (platform === Platform.desktop) { - await this.desktopPreview(ldpServerUrl, appId, logger); + await this.desktopPreview(sfdxProjectRootPath, serverPort, ldpServerUrl, appId, logger); } else { - await this.mobilePreview(platform, ldpServerUrl, appName, appId, deviceId, logger); + await this.mobilePreview( + platform, + sfdxProjectRootPath, + serverPort, + ldpServerUrl, + appName, + appId, + deviceId, + logger + ); } } - private async desktopPreview(ldpServerUrl: string, appId?: string, logger?: Logger): Promise { + private async desktopPreview( + sfdxProjectRootPath: string, + serverPort: number, + ldpServerUrl: string, + appId: string | undefined, + logger: Logger + ): Promise { if (!appId) { - logger?.debug('No Lightning Experience application name provided.... using the default app instead.'); + logger.debug('No Lightning Experience application name provided.... using the default app instead.'); } // There are various ways to pass in a target org (as an alias, as a username, etc). @@ -202,46 +226,55 @@ export default class LightningPreviewApp extends SfCommand { targetOrg = this.argv[idx + 1]; } + const protocol = new URL(ldpServerUrl).protocol.replace(':', '').toLowerCase(); + if (protocol === 'wss') { + this.log(`\n${messages.getMessage('trust.local.dev.server')}`); + } + const launchArguments = PreviewUtils.generateDesktopPreviewLaunchArguments(ldpServerUrl, appId, targetOrg); // Start the LWC Dev Server - await startLWCServer(process.cwd(), logger ? logger : await Logger.child(this.ctor.name)); + await startLWCServer(logger, sfdxProjectRootPath, serverPort, protocol); + // Open the browser and navigate to the right page await this.config.runCommand('org:open', launchArguments); } private async mobilePreview( platform: Platform.ios | Platform.android, + sfdxProjectRootPath: string, + serverPort: number, ldpServerUrl: string, - appName?: string, - appId?: string, - deviceId?: string, - logger?: Logger + appName: string | undefined, + appId: string | undefined, + deviceId: string | undefined, + logger: Logger ): Promise { try { - // 1. Verify that user environment is set up for mobile (i.e. has right tooling) + // Verify that user environment is set up for mobile (i.e. has right tooling) await this.verifyMobileRequirements(platform, logger); - // 2. Fetch the target device + // Fetch the target device const device = await PreviewUtils.getMobileDevice(platform, deviceId, logger); if (!device) { throw new Error(messages.getMessage('error.device.notfound', [deviceId ?? ''])); } - // 3. Boot the device if not already booted + // Boot the device if not already booted this.spinner.start(messages.getMessage('spinner.device.boot', [device.toString()])); const resolvedDeviceId = platform === Platform.ios ? (device as IOSSimulatorDevice).udid : device.name; const emulatorPort = await PreviewUtils.bootMobileDevice(platform, resolvedDeviceId, logger); this.spinner.stop(); - // 4. Generate self-signed certificate and wait for user to install it - // TODO: update the save location to be the same as server config file path + // Configure certificates for dev server secure connection this.spinner.start(messages.getMessage('spinner.cert.gen')); - const certFilePath = PreviewUtils.generateSelfSignedCert(platform, '~/Desktop/cert'); + const { certData, certFilePath } = await PreviewUtils.generateSelfSignedCert(platform, sfdxProjectRootPath); this.spinner.stop(); - await LightningPreviewApp.waitForUserToInstallCert(platform, device, certFilePath); - // 5. Check if Salesforce Mobile App is installed on the device + // Show message and wait for user to install the certificate on their device + await this.waitForUserToInstallCert(platform, device, certFilePath); + + // Check if Salesforce Mobile App is installed on the device const appConfig = platform === Platform.ios ? iOSSalesforceAppPreviewConfig : androidSalesforceAppPreviewConfig; const appInstalled = await PreviewUtils.verifyMobileAppInstalled( platform, @@ -251,10 +284,9 @@ export default class LightningPreviewApp extends SfCommand { logger ); - // 6. If Salesforce Mobile App is not installed, download and install it + // If Salesforce Mobile App is not installed, download and install it let bundlePath: string | undefined; if (!appInstalled) { - const maxInt32 = 2_147_483_647; // maximum 32-bit signed integer value const proceedWithDownload = await this.confirm({ message: messages.getMessage('mobileapp.download', [appConfig.name]), defaultAnswer: false, @@ -285,8 +317,10 @@ export default class LightningPreviewApp extends SfCommand { } // Start the LWC Dev Server - await startLWCServer(process.cwd(), logger ? logger : await Logger.child(this.ctor.name)); - // 7. Launch the native app for previewing (launchMobileApp will show its own spinner) + const protocol = new URL(ldpServerUrl).protocol.replace(':', '').toLowerCase(); + await startLWCServer(logger, sfdxProjectRootPath, serverPort, protocol, certData); + + // Launch the native app for previewing (launchMobileApp will show its own spinner) // eslint-disable-next-line camelcase appConfig.launch_arguments = PreviewUtils.generateMobileAppPreviewLaunchArguments(ldpServerUrl, appName, appId); await PreviewUtils.launchMobileApp(platform, appConfig, resolvedDeviceId, emulatorPort, bundlePath, logger); @@ -305,13 +339,13 @@ export default class LightningPreviewApp extends SfCommand { * @param platform A mobile platform (iOS or Android) * @param logger An optional logger to be used for logging */ - private async verifyMobileRequirements(platform: Platform.ios | Platform.android, logger?: Logger): Promise { - logger?.debug(`Verifying environment meets requirements for previewing on ${platform}`); + private async verifyMobileRequirements(platform: Platform.ios | Platform.android, logger: Logger): Promise { + logger.debug(`Verifying environment meets requirements for previewing on ${platform}`); const setupCommand = new LwcDevMobileCoreSetup(['-p', platform], this.config); await setupCommand.init(); await setupCommand.run(); - logger?.debug('Requirements are met'); // if we make it here then all is good + logger.debug('Requirements are met'); // if we make it here then all is good } } diff --git a/src/configMeta.ts b/src/configMeta.ts index b81d852..010b7a8 100644 --- a/src/configMeta.ts +++ b/src/configMeta.ts @@ -5,17 +5,25 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import type { ConfigPropertyMeta, ConfigValue } from '@salesforce/core'; import { Workspace } from '@lwc/lwc-dev-server'; -import { Messages } from '@salesforce/core'; +import { ConfigPropertyMeta, ConfigValue, Messages } from '@salesforce/core'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-lightning-dev', 'shared.utils'); -const IDENTITY_TOKEN_DESC = messages.getMessage('identity-utils.token-desc'); -const LOCAL_DEV_SERVER_PORT_DESC = messages.getMessage('lwc-dev-server-utils.port-desc'); -const LOCAL_DEV_SERVER_PORT_MESSAGE = messages.getMessage('lwc-dev-server-utils.port-message'); -const LOCAL_DEV_SERVER_WORKSPACE_DESC = messages.getMessage('lwc-dev-server-utils.workspace-desc'); -const LOCAL_DEV_SERVER_WORKSPACE_MESSAGE = messages.getMessage('lwc-dev-server-utils.workspace-message'); +const IDENTITY_TOKEN_DESC = messages.getMessage('config-utils.token-desc'); +const LOCAL_DEV_SERVER_CERT_DESC = messages.getMessage('config-utils.cert-desc'); +const LOCAL_DEV_SERVER_CERT_ERROR_MESSAGE = messages.getMessage('config-utils.cert-error-message'); +const LOCAL_DEV_SERVER_PORT_DESC = messages.getMessage('config-utils.port-desc'); +const LOCAL_DEV_SERVER_PORT_ERROR_MESSAGE = messages.getMessage('config-utils.port-error-message'); +const LOCAL_DEV_SERVER_WORKSPACE_DESC = messages.getMessage('config-utils.workspace-desc'); +const LOCAL_DEV_SERVER_WORKSPACE_ERROR_MESSAGE = messages.getMessage('config-utils.workspace-error-message'); + +export type SerializedSSLCertificateData = { + derCertificate: string; + pemCertificate: string; + pemPrivateKey: string; + pemPublicKey: string; +}; export const enum ConfigVars { /** @@ -24,6 +32,11 @@ export const enum ConfigVars { */ LOCAL_WEB_SERVER_IDENTITY_TOKEN = 'local-web-server-identity-token', + /** + * The SSL certificate data to be used by local dev server + */ + LOCAL_DEV_SERVER_HTTPS_CERT_DATA = 'local-dev-server-certificate-data', + /** * The port number of the local dev server. */ @@ -42,6 +55,21 @@ export default [ hidden: true, encrypted: true, }, + { + key: ConfigVars.LOCAL_DEV_SERVER_HTTPS_CERT_DATA, + description: LOCAL_DEV_SERVER_CERT_DESC, + input: { + validator: (value: ConfigValue): boolean => { + const data = value as SerializedSSLCertificateData; + if (!data?.derCertificate || !data?.pemCertificate || !data?.pemPrivateKey) { + return false; + } + + return true; + }, + failedMessage: LOCAL_DEV_SERVER_CERT_ERROR_MESSAGE, + }, + }, { key: ConfigVars.LOCAL_DEV_SERVER_PORT, description: LOCAL_DEV_SERVER_PORT_DESC, @@ -53,12 +81,12 @@ export default [ const parsedPort = parseInt(value as string, 10); - if (isNaN(parsedPort) || parsedPort < 1 || parsedPort > 65535) { + if (isNaN(parsedPort) || parsedPort < 1 || parsedPort > 65_535) { return false; } return true; }, - failedMessage: LOCAL_DEV_SERVER_PORT_MESSAGE, + failedMessage: LOCAL_DEV_SERVER_PORT_ERROR_MESSAGE, }, }, { @@ -77,7 +105,7 @@ export default [ } return false; }, - failedMessage: LOCAL_DEV_SERVER_WORKSPACE_MESSAGE, + failedMessage: LOCAL_DEV_SERVER_WORKSPACE_ERROR_MESSAGE, }, }, ] as ConfigPropertyMeta[]; diff --git a/src/lwc-dev-server/index.ts b/src/lwc-dev-server/index.ts index fdac358..2678afc 100644 --- a/src/lwc-dev-server/index.ts +++ b/src/lwc-dev-server/index.ts @@ -8,10 +8,14 @@ import { existsSync, lstatSync, readFileSync } from 'node:fs'; import path from 'node:path'; import process from 'node:process'; -import { LWCServer, LogLevel, ServerConfig, startLwcDevServer } from '@lwc/lwc-dev-server'; +import { LWCServer, LogLevel, ServerConfig, startLwcDevServer, Workspace } from '@lwc/lwc-dev-server'; import { Logger } from '@salesforce/core'; -import { LwcDevServerUtils } from '../shared/lwcDevServerUtils.js'; -import { IdentityUtils } from '../shared/identityUtils.js'; +import { SSLCertificateData } from '@salesforce/lwc-dev-mobile-core'; +import { + ConfigUtils, + LOCAL_DEV_SERVER_DEFAULT_PORT, + LOCAL_DEV_SERVER_DEFAULT_WORKSPACE, +} from '../shared/configUtils.js'; /** * Map sf cli log level to lwc dev server log level @@ -39,8 +43,15 @@ function mapLogLevel(cliLogLevel: number): number { } } -async function createLWCServerConfig(rootDir: string, logger: Logger): Promise { - const identityToken = await IdentityUtils.getOrCreateIdentityToken(); +async function createLWCServerConfig( + logger: Logger, + rootDir: string, + serverPort?: number, + serverProtocol?: string, + certData?: SSLCertificateData, + workspace?: Workspace, + token?: string +): Promise { const sfdxConfig = path.resolve(rootDir, 'sfdx-project.json'); if (!existsSync(sfdxConfig) || !lstatSync(sfdxConfig).isFile()) { @@ -66,21 +77,41 @@ async function createLWCServerConfig(rootDir: string, logger: Logger): Promise { - const config = await createLWCServerConfig(rootDir, logger); +export async function startLWCServer( + logger: Logger, + rootDir: string, + serverPort?: number, + serverProtocol?: string, + certData?: SSLCertificateData, + workspace?: Workspace, + token?: string +): Promise { + const config = await createLWCServerConfig(logger, rootDir, serverPort, serverProtocol, certData, workspace, token); + logger.trace(`Starting LWC Dev Server with config: ${JSON.stringify(config)}`); let lwcDevServer: LWCServer | null = await startLwcDevServer(config); diff --git a/src/shared/configUtils.ts b/src/shared/configUtils.ts new file mode 100644 index 0000000..7db49cf --- /dev/null +++ b/src/shared/configUtils.ts @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2024, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ + +import { Workspace } from '@lwc/lwc-dev-server'; +import { CryptoUtils, SSLCertificateData } from '@salesforce/lwc-dev-mobile-core'; +import { Config, ConfigAggregator } from '@salesforce/core'; +import configMeta, { ConfigVars, SerializedSSLCertificateData } from './../configMeta.js'; + +export const LOCAL_DEV_SERVER_DEFAULT_PORT = 8081; +export const LOCAL_DEV_SERVER_DEFAULT_WORKSPACE = Workspace.SfCli; + +export class ConfigUtils { + static #config: Config; + static #globalConfig: Config; + + public static async getConfig(): Promise { + if (this.#config) { + return this.#config; + } + this.#config = await Config.create({ isGlobal: false }); + Config.addAllowedProperties(configMeta); + return this.#config; + } + + public static async getGlobalConfig(): Promise { + if (this.#globalConfig) { + return this.#globalConfig; + } + this.#globalConfig = await Config.create({ isGlobal: true }); + Config.addAllowedProperties(configMeta); + return this.#globalConfig; + } + + public static async getOrCreateIdentityToken(): Promise { + let token = await this.getIdentityToken(); + if (!token) { + token = CryptoUtils.generateIdentityToken(); + await this.writeIdentityToken(token); + } + return token; + } + + public static async getIdentityToken(): Promise { + const config = await ConfigAggregator.create({ customConfigMeta: configMeta }); + // Need to reload to make sure the values read are decrypted + await config.reload(); + const identityToken = config.getPropertyValue(ConfigVars.LOCAL_WEB_SERVER_IDENTITY_TOKEN); + + return identityToken as string; + } + + public static async writeIdentityToken(token: string): Promise { + const config = await this.getConfig(); + config.set(ConfigVars.LOCAL_WEB_SERVER_IDENTITY_TOKEN, token); + await config.write(); + } + + public static async getCertData(): Promise { + const config = await this.getGlobalConfig(); + const serializedData = config.get(ConfigVars.LOCAL_DEV_SERVER_HTTPS_CERT_DATA) as SerializedSSLCertificateData; + if (serializedData) { + const deserializedData: SSLCertificateData = { + derCertificate: Buffer.from(serializedData.derCertificate, 'base64'), + pemCertificate: serializedData.pemCertificate, + pemPrivateKey: serializedData.pemPrivateKey, + pemPublicKey: serializedData.pemPublicKey, + }; + + return deserializedData; + } + + return undefined; + } + + public static async writeCertData(data: SSLCertificateData): Promise { + const config = await this.getGlobalConfig(); + const serializedData: SerializedSSLCertificateData = { + derCertificate: data.derCertificate.toString('base64'), + pemCertificate: data.pemCertificate, + pemPrivateKey: data.pemPrivateKey, + pemPublicKey: data.pemPublicKey, + }; + config.set(ConfigVars.LOCAL_DEV_SERVER_HTTPS_CERT_DATA, serializedData); + await config.write(); + } + + public static async getLocalDevServerPort(): Promise { + const config = await this.getConfig(); + const configPort = config.get(ConfigVars.LOCAL_DEV_SERVER_PORT) as number; + + return configPort; + } + + public static async getLocalDevServerWorkspace(): Promise { + const config = await this.getConfig(); + const configWorkspace = config.get(ConfigVars.LOCAL_DEV_SERVER_WORKSPACE) as Workspace; + + return configWorkspace; + } +} diff --git a/src/shared/identityUtils.ts b/src/shared/identityUtils.ts deleted file mode 100644 index 45c37ed..0000000 --- a/src/shared/identityUtils.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause - */ - -import { CryptoUtils } from '@salesforce/lwc-dev-mobile-core'; -import { Config, ConfigAggregator } from '@salesforce/core'; -import configMeta, { ConfigVars } from './../configMeta.js'; - -export class IdentityUtils { - public static async getOrCreateIdentityToken(): Promise { - let token = await this.getIdentityToken(); - if (!token) { - token = CryptoUtils.generateIdentityToken(); - await this.writeIdentityToken(token); - } - return token; - } - - public static async getIdentityToken(): Promise { - const config = await ConfigAggregator.create({ customConfigMeta: configMeta }); - // Need to reload to make sure the values read are decrypted - await config.reload(); - const identityToken = config.getPropertyValue(ConfigVars.LOCAL_WEB_SERVER_IDENTITY_TOKEN); - - return identityToken as string; - } - - public static async writeIdentityToken(token: string): Promise { - const config = await Config.create({ isGlobal: false }); - Config.addAllowedProperties(configMeta); - config.set(ConfigVars.LOCAL_WEB_SERVER_IDENTITY_TOKEN, token); - await config.write(); - } -} diff --git a/src/shared/lwcDevServerUtils.ts b/src/shared/lwcDevServerUtils.ts deleted file mode 100644 index 2cdf4dc..0000000 --- a/src/shared/lwcDevServerUtils.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause - */ - -import { Workspace } from '@lwc/lwc-dev-server'; -import { Config } from '@salesforce/core'; -import configMeta, { ConfigVars } from '../configMeta.js'; - -export const LOCAL_DEV_SERVER_DEFAULT_PORT = 8081; -export const LOCAL_DEV_SERVER_DEFAULT_WORKSPACE = Workspace.SfCli; - -export class LwcDevServerUtils { - static #config: Config; - - public static async getConfig(): Promise { - if (this.#config) { - return this.#config; - } - this.#config = await Config.create({ isGlobal: false }); - Config.addAllowedProperties(configMeta); - return this.#config; - } - - public static async getLocalDevServerPort(): Promise { - const config = await this.getConfig(); - const configPort = config.get(ConfigVars.LOCAL_DEV_SERVER_PORT) as number; - - return configPort || LOCAL_DEV_SERVER_DEFAULT_PORT; - } - - public static async getLocalDevServerWorkspace(): Promise { - const config = await this.getConfig(); - const configWorkspace = config.get(ConfigVars.LOCAL_DEV_SERVER_WORKSPACE) as Workspace; - - return configWorkspace || LOCAL_DEV_SERVER_DEFAULT_WORKSPACE; - } -} diff --git a/src/shared/previewUtils.ts b/src/shared/previewUtils.ts index 22a30ff..f4e7569 100644 --- a/src/shared/previewUtils.ts +++ b/src/shared/previewUtils.ts @@ -27,17 +27,65 @@ import { LaunchArgument, PreviewUtils as LwcDevMobileCorePreviewUtils, Platform, + SSLCertificateData, } from '@salesforce/lwc-dev-mobile-core'; import { Progress, Spinner } from '@salesforce/sf-plugins-core'; import fetch from 'node-fetch'; +import { ConfigUtils, LOCAL_DEV_SERVER_DEFAULT_PORT } from './configUtils.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-lightning-dev', 'lightning.preview.app'); const DevPreviewAuraMode = 'DEVPREVIEW'; export class PreviewUtils { - public static generateWebSocketUrlForLocalDevServer(platform: string, port: string): string { - return LwcDevMobileCorePreviewUtils.generateWebSocketUrlForLocalDevServer(platform, port); + public static generateWebSocketUrlForLocalDevServer(platform: string, port: string | number): string { + return LwcDevMobileCorePreviewUtils.generateWebSocketUrlForLocalDevServer(platform, port.toString()); + } + + /** + * Returns a port number to be used by the local dev server. + * + * It starts by checking whether the user has configured a port in their config file. + * If so then we are only allowed to use that port, regardless of whether it is in use + * or not. + * + * If the user has not configured a port in their config file then we are free to choose + * one. We'll start with the default port (8081) and checks to see if it is in use or not. + * If it is in use then we increment the port number by 2 and check if it is in use or not. + * This process is repeated until a port that is not in use is found. + * + * @returns a port number to be used by the local dev server. + */ + public static async getNextAvailablePort(): Promise { + const userConfiguredPort = await ConfigUtils.getLocalDevServerPort(); + + if (userConfiguredPort) { + return Promise.resolve(userConfiguredPort); + } + + let port = LOCAL_DEV_SERVER_DEFAULT_PORT; + let done = false; + + while (!done) { + const cmd = + process.platform === 'win32' ? `netstat -an | find "LISTENING" | find ":${port}"` : `lsof -i :${port}`; + + try { + const result = CommonUtils.executeCommandSync(cmd); + if (result.trim()) { + port = port + 2; // that port is in use so try another + } else { + done = true; + } + } catch (error) { + // On some platforms (like mac) if the command doesn't produce + // any results then that is considered an error but in our case + // that means the port is not in use and is ready for us to use. + done = true; + } + } + + return Promise.resolve(port); } /** @@ -161,9 +209,9 @@ export class PreviewUtils { launchArguments.push({ name: 'LightningExperienceAppID', value: appId }); } - launchArguments.push({ name: 'aura.ldpServerUrl', value: ldpServerUrl }); + launchArguments.push({ name: '0.aura.ldpServerUrl', value: ldpServerUrl }); - launchArguments.push({ name: 'aura.mode', value: auraMode }); + launchArguments.push({ name: '0.aura.mode', value: auraMode }); return launchArguments; } @@ -171,31 +219,37 @@ export class PreviewUtils { /** * Generates a self-signed certificate and saves it to a file at the specified location. * - * @param platform A supported platform (Desktop or iOS or Android) + * @param platform A mobile platform (iOS or Android) * @param saveLocation Path to a folder where the generated certificated will be saved to (defaults to the current working directory) - * @returns Path to the generated certificate file + * @returns Path to the generated certificate file and the certificate data */ - public static generateSelfSignedCert(platform: Platform, saveLocation = '.'): string { - const cert = CryptoUtils.generateSelfSignedCert('localhost', 2048, 365); + public static async generateSelfSignedCert( + platform: Platform.ios | Platform.android, + saveLocation = '.' + ): Promise<{ certData: SSLCertificateData; certFilePath: string }> { + // See if we have previously generated cert data which is stored in the global config. + // If so then use that data otherwise generate new cert data and store it in the global config. + let data = await ConfigUtils.getCertData(); + if (!data) { + data = CryptoUtils.generateSelfSignedCert('localhost', 2048, 820); + await ConfigUtils.writeCertData(data); + } - // Resolve the save location and ensure it exists const basePath = path.resolve(CommonUtils.resolveUserHomePath(saveLocation)); - if (!fs.existsSync(basePath)) { - fs.mkdirSync(basePath); - } - let fileName = ''; - if (platform === Platform.ios) { - // iOS expects the certificate to be a binary DER file - fileName = path.join(basePath, 'certificate.der'); - fs.writeFileSync(fileName, cert.derCertificate, { encoding: 'binary' }); - } else { - // all other platforms can work with a base64 PEM text file - fileName = path.join(basePath, 'certificate.pem'); - fs.writeFileSync(fileName, cert.pemCertificate); + const targetFile = + platform === Platform.ios ? path.join(basePath, 'localhost.der') : path.join(basePath, 'localhost.pem'); + + // If we have not previously generated the cert files then go ahead and do so + if (!fs.existsSync(targetFile)) { + if (platform === Platform.ios) { + fs.writeFileSync(targetFile, data.derCertificate); + } else { + fs.writeFileSync(targetFile, data.pemCertificate); + } } - return fileName; + return { certData: data, certFilePath: targetFile }; } /** diff --git a/test/commands/lightning/preview/app.test.ts b/test/commands/lightning/preview/app.test.ts index 73cb96a..4585c5f 100644 --- a/test/commands/lightning/preview/app.test.ts +++ b/test/commands/lightning/preview/app.test.ts @@ -6,8 +6,8 @@ */ import path from 'node:path'; -import { Config } from '@oclif/core'; -import { Messages } from '@salesforce/core'; +import { Config as OclifConfig } from '@oclif/core'; +import { Config as SfConfig, Messages } from '@salesforce/core'; import { MockTestOrgData, TestContext } from '@salesforce/core/testSetup'; import { AndroidVirtualDevice, @@ -56,6 +56,13 @@ describe('lightning preview app', () => { stubUx($$.SANDBOX); stubSpinner($$.SANDBOX); await $$.stubAuths(testOrgData); + + $$.SANDBOX.stub(SfConfig, 'create').withArgs($$.SANDBOX.match.any).resolves(SfConfig.prototype); + $$.SANDBOX.stub(SfConfig, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(SfConfig.prototype, 'get').returns(undefined); + $$.SANDBOX.stub(SfConfig.prototype, 'set'); + $$.SANDBOX.stub(SfConfig.prototype, 'write').resolves(); + MockedLightningPreviewApp = await esmock( '../../../../src/commands/lightning/preview/app.js', { @@ -105,7 +112,7 @@ describe('lightning preview app', () => { async function verifyOrgOpen(expectedAppPath: string, appName?: string): Promise { $$.SANDBOX.stub(OrgUtils, 'getAppId').resolves(testAppId); $$.SANDBOX.stub(PreviewUtils, 'generateWebSocketUrlForLocalDevServer').returns(testServerUrl); - const runCmdStub = $$.SANDBOX.stub(Config.prototype, 'runCommand').resolves(); + const runCmdStub = $$.SANDBOX.stub(OclifConfig.prototype, 'runCommand').resolves(); if (appName) { await MockedLightningPreviewApp.run(['--name', appName, '-o', testOrgData.username]); } else { @@ -199,11 +206,19 @@ describe('lightning preview app', () => { $$.SANDBOX.stub(PreviewUtils, 'bootMobileDevice').resolves(testEmulatorPort); - const expectedCertFilePath = '/path/to/cert.pem'; - $$.SANDBOX.stub(PreviewUtils, 'generateSelfSignedCert').returns(expectedCertFilePath); + const expectedCert = { + certData: { + derCertificate: Buffer.from('A', 'utf-8'), + pemCertificate: 'B', + pemPrivateKey: 'C', + pemPublicKey: 'D', + }, + certFilePath: '/path/to/localhost.pem', + }; + $$.SANDBOX.stub(PreviewUtils, 'generateSelfSignedCert').resolves(expectedCert); const waitForUserToInstallCertStub = $$.SANDBOX.stub( - MockedLightningPreviewApp, + MockedLightningPreviewApp.prototype, 'waitForUserToInstallCert' ).resolves(); @@ -212,12 +227,12 @@ describe('lightning preview app', () => { await verifyMobileWaitsForManualCertInstallation( Platform.ios, - expectedCertFilePath, + expectedCert.certFilePath, waitForUserToInstallCertStub ); await verifyMobileWaitsForManualCertInstallation( Platform.android, - expectedCertFilePath, + expectedCert.certFilePath, waitForUserToInstallCertStub ); }); @@ -235,10 +250,17 @@ describe('lightning preview app', () => { $$.SANDBOX.stub(PreviewUtils, 'bootMobileDevice').resolves(testEmulatorPort); - const expectedCertFilePath = '/path/to/cert.pem'; - $$.SANDBOX.stub(PreviewUtils, 'generateSelfSignedCert').returns(expectedCertFilePath); + $$.SANDBOX.stub(PreviewUtils, 'generateSelfSignedCert').resolves({ + certData: { + derCertificate: Buffer.from('A', 'utf-8'), + pemCertificate: 'B', + pemPrivateKey: 'C', + pemPublicKey: 'D', + }, + certFilePath: '/path/to/localhost.pem', + }); - $$.SANDBOX.stub(MockedLightningPreviewApp, 'waitForUserToInstallCert').resolves(); + $$.SANDBOX.stub(MockedLightningPreviewApp.prototype, 'waitForUserToInstallCert').resolves(); const verifyMobileAppInstalledStub = $$.SANDBOX.stub(PreviewUtils, 'verifyMobileAppInstalled').resolves(false); $$.SANDBOX.stub(MockedLightningPreviewApp.prototype, 'confirm').resolves(false); @@ -260,10 +282,17 @@ describe('lightning preview app', () => { $$.SANDBOX.stub(PreviewUtils, 'bootMobileDevice').resolves(testEmulatorPort); - const expectedCertFilePath = '/path/to/cert.pem'; - $$.SANDBOX.stub(PreviewUtils, 'generateSelfSignedCert').returns(expectedCertFilePath); + $$.SANDBOX.stub(PreviewUtils, 'generateSelfSignedCert').resolves({ + certData: { + derCertificate: Buffer.from('A', 'utf-8'), + pemCertificate: 'B', + pemPrivateKey: 'C', + pemPublicKey: 'D', + }, + certFilePath: '/path/to/localhost.pem', + }); - $$.SANDBOX.stub(MockedLightningPreviewApp, 'waitForUserToInstallCert').resolves(); + $$.SANDBOX.stub(MockedLightningPreviewApp.prototype, 'waitForUserToInstallCert').resolves(); $$.SANDBOX.stub(PreviewUtils, 'verifyMobileAppInstalled').resolves(false); $$.SANDBOX.stub(MockedLightningPreviewApp.prototype, 'confirm').resolves(true); diff --git a/test/lwc-dev-server/index.e2e.test.ts b/test/lwc-dev-server/index.e2e.test.ts index b8b5d0b..f215f6d 100644 --- a/test/lwc-dev-server/index.e2e.test.ts +++ b/test/lwc-dev-server/index.e2e.test.ts @@ -11,8 +11,10 @@ import { expect } from 'chai'; import sinon from 'sinon'; import { Logger } from '@salesforce/core'; import { TestContext } from '@salesforce/core/testSetup'; -import { LWCServer } from '@lwc/lwc-dev-server'; +import { LWCServer, Workspace } from '@lwc/lwc-dev-server'; import * as devServer from '../../src/lwc-dev-server/index.js'; +import { ConfigUtils } from '../../src/shared/configUtils.js'; + // eslint-disable-next-line no-underscore-dangle const __dirname = path.dirname(fileURLToPath(import.meta.url)); const logger = { @@ -28,6 +30,10 @@ describe('lwc-dev-server e2e', () => { beforeEach(() => { processExitSpy = $$.SANDBOX.stub(process, 'exit'); + $$.SANDBOX.stub(ConfigUtils, 'getOrCreateIdentityToken').resolves('testIdentityToken'); + $$.SANDBOX.stub(ConfigUtils, 'getLocalDevServerPort').resolves(1234); + $$.SANDBOX.stub(ConfigUtils, 'getLocalDevServerWorkspace').resolves(Workspace.SfCli); + $$.SANDBOX.stub(ConfigUtils, 'getCertData').resolves(undefined); }); afterEach(() => { @@ -36,7 +42,7 @@ describe('lwc-dev-server e2e', () => { }); it('e2e', async () => { - const server = await devServer.startLWCServer(path.resolve(__dirname, './__mocks__'), logger); + const server = await devServer.startLWCServer(logger, path.resolve(__dirname, './__mocks__')); expect(server).to.be.an.instanceOf(LWCServer); server.stopServer(); diff --git a/test/lwc-dev-server/index.test.ts b/test/lwc-dev-server/index.test.ts index 40efd18..7495ede 100644 --- a/test/lwc-dev-server/index.test.ts +++ b/test/lwc-dev-server/index.test.ts @@ -9,9 +9,12 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { expect } from 'chai'; import { Logger } from '@salesforce/core'; -import { LWCServer } from '@lwc/lwc-dev-server'; +import { LWCServer, Workspace } from '@lwc/lwc-dev-server'; import esmock from 'esmock'; +import { TestContext } from '@salesforce/core/testSetup'; import * as devServer from '../../src/lwc-dev-server/index.js'; +import { ConfigUtils } from '../../src/shared/configUtils.js'; + // eslint-disable-next-line no-underscore-dangle const __dirname = path.dirname(fileURLToPath(import.meta.url)); const logger = { @@ -22,6 +25,7 @@ const logger = { } as Logger; describe('lwc-dev-server', () => { + const $$ = new TestContext(); const server = { stopServer: () => {}, } as LWCServer; @@ -35,12 +39,23 @@ describe('lwc-dev-server', () => { }); }); + beforeEach(async () => { + $$.SANDBOX.stub(ConfigUtils, 'getOrCreateIdentityToken').resolves('testIdentityToken'); + $$.SANDBOX.stub(ConfigUtils, 'getLocalDevServerPort').resolves(1234); + $$.SANDBOX.stub(ConfigUtils, 'getLocalDevServerWorkspace').resolves(Workspace.SfCli); + $$.SANDBOX.stub(ConfigUtils, 'getCertData').resolves(undefined); + }); + + afterEach(() => { + $$.restore(); + }); + it('exports a startLWCServer function', () => { expect(lwcDevServer.startLWCServer).to.be.a('function'); }); it('calling startLWCServer returns an LWCServer', async () => { - const s = await lwcDevServer.startLWCServer(path.resolve(__dirname, './__mocks__'), logger); + const s = await lwcDevServer.startLWCServer(logger, path.resolve(__dirname, './__mocks__')); expect(s).to.equal(server); }); }); diff --git a/test/shared/configUtils.test.ts b/test/shared/configUtils.test.ts new file mode 100644 index 0000000..913210b --- /dev/null +++ b/test/shared/configUtils.test.ts @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2024, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ + +import { expect } from 'chai'; +import { Workspace } from '@lwc/lwc-dev-server'; +import { Config, ConfigAggregator } from '@salesforce/core'; +import { TestContext } from '@salesforce/core/testSetup'; +import { CryptoUtils } from '@salesforce/lwc-dev-mobile-core'; +import { + ConfigUtils, + LOCAL_DEV_SERVER_DEFAULT_PORT, + LOCAL_DEV_SERVER_DEFAULT_WORKSPACE, +} from '../../src/shared/configUtils.js'; +import { ConfigVars } from '../../src/configMeta.js'; + +describe('configUtils', () => { + const $$ = new TestContext(); + + afterEach(() => { + $$.restore(); + }); + + it('getOrCreateIdentityToken resolves if token is found', async () => { + const fakeIdentityToken = 'fake identity token'; + $$.SANDBOX.stub(ConfigUtils, 'getIdentityToken').resolves(fakeIdentityToken); + + const resolved = await ConfigUtils.getOrCreateIdentityToken(); + expect(resolved).to.equal(fakeIdentityToken); + }); + + it('getOrCreateIdentityToken resolves and writeIdentityToken is called when there is no token', async () => { + const fakeIdentityToken = 'fake identity token'; + $$.SANDBOX.stub(ConfigUtils, 'getIdentityToken').resolves(undefined); + $$.SANDBOX.stub(CryptoUtils, 'generateIdentityToken').resolves(fakeIdentityToken); + const writeIdentityTokenStub = $$.SANDBOX.stub(ConfigUtils, 'writeIdentityToken').resolves(); + + const resolved = await ConfigUtils.getOrCreateIdentityToken(); + expect(resolved).to.equal(fakeIdentityToken); + expect(writeIdentityTokenStub.calledOnce).to.be.true; + }); + + it('getIdentityToken resolves to undefined when identity token is not available', async () => { + $$.SANDBOX.stub(ConfigAggregator, 'create').resolves(ConfigAggregator.prototype); + $$.SANDBOX.stub(ConfigAggregator.prototype, 'reload').resolves(); + $$.SANDBOX.stub(ConfigAggregator.prototype, 'getPropertyValue').returns(undefined); + const resolved = await ConfigUtils.getIdentityToken(); + + expect(resolved).to.equal(undefined); + }); + + it('getIdentityToken resolves to a string when identity token is available', async () => { + const fakeIdentityToken = 'fake identity token'; + $$.SANDBOX.stub(ConfigAggregator, 'create').resolves(ConfigAggregator.prototype); + $$.SANDBOX.stub(ConfigAggregator.prototype, 'reload').resolves(); + $$.SANDBOX.stub(ConfigAggregator.prototype, 'getPropertyValue').returns(fakeIdentityToken); + + const resolved = await ConfigUtils.getIdentityToken(); + expect(resolved).to.equal(fakeIdentityToken); + }); + + it('writeIdentityToken resolves', async () => { + const fakeIdentityToken = 'fake identity token'; + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'set').withArgs( + ConfigVars.LOCAL_WEB_SERVER_IDENTITY_TOKEN, + $$.SANDBOX.match.string + ); + $$.SANDBOX.stub(Config.prototype, 'write').resolves(); + + const resolved = await ConfigUtils.writeIdentityToken(fakeIdentityToken); + expect(resolved).to.equal(undefined); + }); + + it('getCertData resolves to undefined when value not found in config', async () => { + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'get').withArgs(ConfigVars.LOCAL_DEV_SERVER_HTTPS_CERT_DATA).returns(undefined); + const resolved = await ConfigUtils.getCertData(); + + expect(resolved).to.equal(undefined); + }); + + it('getCertData resolves to value in config', async () => { + const certData = { + derCertificate: 'derCertificate', + pemCertificate: 'pemCertificate', + pemPrivateKey: 'pemPrivateKey', + pemPublicKey: 'pemPublicKey', + }; + + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'get').withArgs(ConfigVars.LOCAL_DEV_SERVER_HTTPS_CERT_DATA).returns(certData); + const resolved = await ConfigUtils.getCertData(); + + expect(resolved).to.deep.equal(certData); + }); + + it('writeCertData resolves', async () => { + const certData = { + derCertificate: Buffer.from('derCertificate', 'utf-8'), + pemCertificate: 'pemCertificate', + pemPrivateKey: 'pemPrivateKey', + pemPublicKey: 'pemPublicKey', + }; + + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'set').withArgs(ConfigVars.LOCAL_DEV_SERVER_HTTPS_CERT_DATA); + $$.SANDBOX.stub(Config.prototype, 'write').resolves(); + + const resolved = await ConfigUtils.writeCertData(certData); + expect(resolved).to.equal(undefined); + }); + + it('getLocalDevServerPort resolves to default port when value not found in config', async () => { + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'get').withArgs(ConfigVars.LOCAL_DEV_SERVER_PORT).returns(undefined); + const resolved = await ConfigUtils.getLocalDevServerPort(); + + expect(resolved).to.equal(LOCAL_DEV_SERVER_DEFAULT_PORT); + }); + + it('getLocalDevServerPort resolves to port value in config', async () => { + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'get').withArgs(ConfigVars.LOCAL_DEV_SERVER_PORT).returns(123); + const resolved = await ConfigUtils.getLocalDevServerPort(); + + expect(resolved).to.equal(123); + }); + + it('getLocalDevServerWorkspace resolves to default workspace when value not found in config', async () => { + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'get').withArgs(ConfigVars.LOCAL_DEV_SERVER_WORKSPACE).returns(undefined); + const resolved = await ConfigUtils.getLocalDevServerWorkspace(); + + expect(resolved).to.equal(LOCAL_DEV_SERVER_DEFAULT_WORKSPACE); + }); + + it('getLocalDevServerWorkspace resolves to workspace value in config', async () => { + $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); + $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); + $$.SANDBOX.stub(Config.prototype, 'get').withArgs(ConfigVars.LOCAL_DEV_SERVER_WORKSPACE).returns(Workspace.SfCli); + const resolved = await ConfigUtils.getLocalDevServerWorkspace(); + + expect(resolved).to.equal(Workspace.SfCli); + }); +}); diff --git a/test/shared/identityUtils.test.ts b/test/shared/identityUtils.test.ts deleted file mode 100644 index 6ca502f..0000000 --- a/test/shared/identityUtils.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause - */ - -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ - -import { expect } from 'chai'; -import { Config, ConfigAggregator } from '@salesforce/core'; -import { TestContext } from '@salesforce/core/testSetup'; -import { CryptoUtils } from '@salesforce/lwc-dev-mobile-core'; -import { IdentityUtils } from '../../src/shared/identityUtils.js'; -import { ConfigVars } from '../../src/configMeta.js'; - -describe('identityUtils', () => { - const $$ = new TestContext(); - - afterEach(() => { - $$.restore(); - }); - - it('getOrCreateIdentityToken resolves if token is found', async () => { - const fakeIdentityToken = 'fake identity token'; - $$.SANDBOX.stub(IdentityUtils, 'getIdentityToken').resolves(fakeIdentityToken); - - const resolved = await IdentityUtils.getOrCreateIdentityToken(); - expect(resolved).to.equal(fakeIdentityToken); - }); - - it('getOrCreateIdentityToken resolves and writeIdentityToken is called when there is no token', async () => { - const fakeIdentityToken = 'fake identity token'; - $$.SANDBOX.stub(IdentityUtils, 'getIdentityToken').resolves(undefined); - $$.SANDBOX.stub(CryptoUtils, 'generateIdentityToken').resolves(fakeIdentityToken); - const writeIdentityTokenStub = $$.SANDBOX.stub(IdentityUtils, 'writeIdentityToken').resolves(); - - const resolved = await IdentityUtils.getOrCreateIdentityToken(); - expect(resolved).to.equal(fakeIdentityToken); - expect(writeIdentityTokenStub.calledOnce).to.be.true; - }); - - it('getIdentityToken resolves to undefined when identity token is not available', async () => { - $$.SANDBOX.stub(ConfigAggregator, 'create').resolves(ConfigAggregator.prototype); - $$.SANDBOX.stub(ConfigAggregator.prototype, 'reload').resolves(); - $$.SANDBOX.stub(ConfigAggregator.prototype, 'getPropertyValue').returns(undefined); - const resolved = await IdentityUtils.getIdentityToken(); - - expect(resolved).to.equal(undefined); - }); - - it('getIdentityToken resolves to a string when identity token is available', async () => { - const fakeIdentityToken = 'fake identity token'; - $$.SANDBOX.stub(ConfigAggregator, 'create').resolves(ConfigAggregator.prototype); - $$.SANDBOX.stub(ConfigAggregator.prototype, 'reload').resolves(); - $$.SANDBOX.stub(ConfigAggregator.prototype, 'getPropertyValue').returns(fakeIdentityToken); - - const resolved = await IdentityUtils.getIdentityToken(); - expect(resolved).to.equal(fakeIdentityToken); - }); - - it('writeIdentityToken resolves', async () => { - const fakeIdentityToken = 'fake identity token'; - $$.SANDBOX.stub(Config, 'create').withArgs($$.SANDBOX.match.any).resolves(Config.prototype); - $$.SANDBOX.stub(Config, 'addAllowedProperties').withArgs($$.SANDBOX.match.any); - $$.SANDBOX.stub(Config.prototype, 'set').withArgs( - ConfigVars.LOCAL_WEB_SERVER_IDENTITY_TOKEN, - $$.SANDBOX.match.string - ); - $$.SANDBOX.stub(Config.prototype, 'write').resolves(); - - const resolved = await IdentityUtils.writeIdentityToken(fakeIdentityToken); - expect(resolved).to.equal(undefined); - }); -}); diff --git a/yarn.lock b/yarn.lock index d62463e..1ffb124 100644 --- a/yarn.lock +++ b/yarn.lock @@ -79,14 +79,14 @@ tslib "^2.6.2" "@aws-sdk/client-cloudfront@^3.592.0": - version "3.600.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.600.0.tgz#7220c3ee1abdc430bf8566b6a22d3d969b667a04" - integrity sha512-5qO3lc6AvErAqia552zA8ADwFO3UiJpJ8R2jy7JL18RifmePVs/f0jPeWPtAoV81iehmFziLyu6pWUMnfh3EJg== + version "3.606.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.606.0.tgz#461149ff59094cbee6103b52e5b1746828756b6b" + integrity sha512-NGcBgt3D1ISB4wMCYWw+VjFmzTif+9AO2TXnI5X5pdaIRPz6vxCBHcTyozT7WUOUyQ7/Wo8DUbqbd/42s7EP3A== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.600.0" - "@aws-sdk/client-sts" "3.600.0" + "@aws-sdk/client-sso-oidc" "3.606.0" + "@aws-sdk/client-sts" "3.606.0" "@aws-sdk/core" "3.598.0" "@aws-sdk/credential-provider-node" "3.600.0" "@aws-sdk/middleware-host-header" "3.598.0" @@ -129,15 +129,15 @@ tslib "^2.6.2" "@aws-sdk/client-s3@^3.600.0": - version "3.600.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.600.0.tgz#3ce415d9257b8d1c8385bc26c6c86e6403aff83c" - integrity sha512-iYoKbJTputbf+ubkX6gSK/y/4uJEBRaXZ18jykLdBQ8UJuGrk2gqvV8h7OlGAhToCeysmmMqM0vDWyLt6lP8nw== + version "3.606.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.606.0.tgz#ff9d7e029591387522783b7aae3d458d4cb0b473" + integrity sha512-IGM/E8kVk/NY/kZwLdmGRsX1QYtuPljoNutM5kBRdtGahQL5VwVAve5PElPUArcsTkfTyW+LfXpznDeeHxMCcA== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.600.0" - "@aws-sdk/client-sts" "3.600.0" + "@aws-sdk/client-sso-oidc" "3.606.0" + "@aws-sdk/client-sts" "3.606.0" "@aws-sdk/core" "3.598.0" "@aws-sdk/credential-provider-node" "3.600.0" "@aws-sdk/middleware-bucket-endpoint" "3.598.0" @@ -192,14 +192,13 @@ "@smithy/util-waiter" "^3.0.1" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.600.0": - version "3.600.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.600.0.tgz#37966020af55a052822b9ef21adc38d2afcb0f34" - integrity sha512-7+I8RWURGfzvChyNQSyj5/tKrqRbzRl7H+BnTOf/4Vsw1nFOi5ROhlhD4X/Y0QCTacxnaoNcIrqnY7uGGvVRzw== +"@aws-sdk/client-sso-oidc@3.606.0": + version "3.606.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.606.0.tgz#19d4818b9d04e5d1b6a7fe50a86b0c98a2b30c42" + integrity sha512-gL1FHPS6hwgMNS/A+Qh5bUyHOeRVOqdb7c6+i+9gR3wtGvt2lvoSm8w5DhS08Xiiacz2AqYRDEapp0xuyCrbBQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sts" "3.600.0" "@aws-sdk/core" "3.598.0" "@aws-sdk/credential-provider-node" "3.600.0" "@aws-sdk/middleware-host-header" "3.598.0" @@ -282,14 +281,14 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.600.0": - version "3.600.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.600.0.tgz#8a437f8cf626cf652f99628105576213dbba48b2" - integrity sha512-KQG97B7LvTtTiGmjlrG1LRAY8wUvCQzrmZVV5bjrJ/1oXAU7DITYwVbSJeX9NWg6hDuSk0VE3MFwIXS2SvfLIA== +"@aws-sdk/client-sts@3.606.0": + version "3.606.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.606.0.tgz#81d61a6240761230fbb0e36ac782485c535ac4a2" + integrity sha512-b11mAhjrkm3MMiAPoMGcmd6vsaz2120lg8rHG/NZCo9vB1K6Kc7WP+a1Q05TRMseer2egTtpWJfn44aVO97VqA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.600.0" + "@aws-sdk/client-sso-oidc" "3.606.0" "@aws-sdk/core" "3.598.0" "@aws-sdk/credential-provider-node" "3.600.0" "@aws-sdk/middleware-host-header" "3.598.0" @@ -2221,9 +2220,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -2651,7 +2650,7 @@ resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== -"@jsforce/jsforce-node@^3.2.0", "@jsforce/jsforce-node@^3.2.1": +"@jsforce/jsforce-node@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.2.1.tgz#00fab05919e0cbe91ae4d873377e56cfbc087b98" integrity sha512-hjmZQbYVikm6ATmaErOp5NaKR2VofNZsrcGGHrdbGA+bAgpfg/+MA/HzRTb8BvYyPDq3RRc5A8Yk8gx9Vtcrxg== @@ -3460,41 +3459,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@oclif/core@^3.26.6": - version "3.27.0" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-3.27.0.tgz#a22a4ff4e5811db7a182b1687302237a57802381" - integrity sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw== - dependencies: - "@types/cli-progress" "^3.11.5" - ansi-escapes "^4.3.2" - ansi-styles "^4.3.0" - cardinal "^2.1.1" - chalk "^4.1.2" - clean-stack "^3.0.1" - cli-progress "^3.12.0" - color "^4.2.3" - debug "^4.3.5" - ejs "^3.1.10" - get-package-type "^0.1.0" - globby "^11.1.0" - hyperlinker "^1.0.0" - indent-string "^4.0.0" - is-wsl "^2.2.0" - js-yaml "^3.14.1" - minimatch "^9.0.4" - natural-orderby "^2.0.3" - object-treeify "^1.1.33" - password-prompt "^1.1.3" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - supports-color "^8.1.1" - supports-hyperlinks "^2.2.0" - widest-line "^3.1.0" - wordwrap "^1.0.0" - wrap-ansi "^7.0.0" - -"@oclif/core@^4", "@oclif/core@^4.0.6": +"@oclif/core@^4", "@oclif/core@^4.0.6", "@oclif/core@^4.0.7": version "4.0.7" resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.7.tgz#e624fa6e91ddcd84ebd0aa9e6efbe17b94f2dd1f" integrity sha512-sU4Dx+RXCWAkrMw8tQFYAL6VfcHYKLPxVC9iKfgTXr4aDhcCssDwrbgpx0Di1dnNxvQlDGUhuCEInZuIY/nNfw== @@ -3873,31 +3838,7 @@ strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/core@^7.3.6", "@salesforce/core@^7.3.9": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-7.5.0.tgz#cfa57281978c9d5df6f7419e5bc58ea914726cf5" - integrity sha512-mPg9Tj2Qqe/TY7q+CRNSeYYTV+dj/LflM7Fu/32EPLCEPGVIiSp/RaTFLTZwDcFX9BVYHOa2h6oliuO2Qnno+A== - dependencies: - "@jsforce/jsforce-node" "^3.2.0" - "@salesforce/kit" "^3.1.6" - "@salesforce/schemas" "^1.9.0" - "@salesforce/ts-types" "^2.0.10" - ajv "^8.15.0" - change-case "^4.1.2" - fast-levenshtein "^3.0.0" - faye "^1.4.0" - form-data "^4.0.0" - js2xmlparser "^4.0.1" - jsonwebtoken "9.0.2" - jszip "3.10.1" - pino "^9.2.0" - pino-abstract-transport "^1.2.0" - pino-pretty "^11.2.1" - proper-lockfile "^4.1.2" - semver "^7.6.2" - ts-retry-promise "^0.8.1" - -"@salesforce/core@^8.0.1", "@salesforce/core@^8.0.3": +"@salesforce/core@^8.0.1", "@salesforce/core@^8.0.3", "@salesforce/core@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.1.0.tgz#8ee25acdacf9d70a6249907a2fe3503461f18766" integrity sha512-oItr8cdeMe67glJN3dP1Gh/kasD0DUT6S6RfcLTH32wwuZNQAwMXNgBOCvlskr8nxPZ+YSSw7CVuqYMUmCtUXA== @@ -3926,10 +3867,10 @@ resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-4.2.0.tgz#65a59b95aeb4f5512435770da43cba780aa0cfc7" integrity sha512-ahmHPhUslKhIe6qCaZTmMmHZrTXRhUcoMXVimEJaDPxTw2q3Dloq/lehWZdhLsRQCDKscP0WPIOdKulIgZJFBg== -"@salesforce/dev-scripts@^9.1.2": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-9.1.3.tgz#4a2fc111a8651582125443fd26bd8e842a1300f1" - integrity sha512-UpB/y8pe3hPgQTytC1+yBI2lsAp8mWQFh6OTUMIJsTamVq1fEX34ddJrxjm+F8SIOmV5E5CD0MwxeKOjKahJag== +"@salesforce/dev-scripts@^10.2.2": + version "10.2.2" + resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-10.2.2.tgz#0fbcc6504712a38301da13b0ad5f10e38b705c8d" + integrity sha512-dLVhj2sxyXrmwypZN4Sra/cZyXqa1oM9iwq2dRto/0EVsn1kcAwASJo4p1xv5RsS25F/4nG4Wdu0O0qHWjqCBw== dependencies: "@commitlint/cli" "^17.1.2" "@commitlint/config-conventional" "^17.8.1" @@ -3937,14 +3878,14 @@ "@salesforce/prettier-config" "^0.0.3" "@types/chai" "^4.3.14" "@types/mocha" "^10.0.6" - "@types/node" "^18.19.32" + "@types/node" "^18.19.34" "@types/sinon" "^10.0.20" chai "^4.3.10" chalk "^4.0.0" cosmiconfig "^8.3.6" eslint-config-salesforce-typescript "^3.3.0" husky "^7.0.4" - linkinator "^6.0.4" + linkinator "^6.0.5" mocha "^10.4.0" nyc "^15.1.0" prettier "^2.8.8" @@ -3953,7 +3894,7 @@ sinon "10.0.0" source-map-support "^0.5.21" ts-node "^10.9.2" - typedoc "^0.25.12" + typedoc "^0.25.13" typedoc-plugin-missing-exports "0.23.0" typescript "^5.4.3" wireit "^0.14.4" @@ -3973,24 +3914,24 @@ resolved "https://registry.yarnpkg.com/@salesforce/eslint-plugin-lightning/-/eslint-plugin-lightning-1.0.0.tgz#9ecf80527d83394960ef3c358c790cdfde44f578" integrity sha512-zk0PKXAcHKHepAG2EOSWlkOTxQM0Aw1CT6+MUxJcM42fCDwH/yPPpGkG3CWtRfmVViODGOwU9ywU2wlkAYcvUQ== -"@salesforce/kit@^3.1.2", "@salesforce/kit@^3.1.6": +"@salesforce/kit@^3.1.6": version "3.1.6" resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-3.1.6.tgz#aefb39c0e0f325e11f80551ff92cf6979dd74070" integrity sha512-zAYPmCSAvdonDOnL5AzuVRVv0sRMlQd6gi12HDE1964VqSjt5pzlLU90thh3Qq4A1Wxbdu0FbHYx9BvZ4fWPvQ== dependencies: "@salesforce/ts-types" "^2.0.10" -"@salesforce/lwc-dev-mobile-core@4.0.0-alpha.4": - version "4.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/@salesforce/lwc-dev-mobile-core/-/lwc-dev-mobile-core-4.0.0-alpha.4.tgz#5e020cb3222f2603a01248359d43b3d6ca4062e3" - integrity sha512-gNEQQr4QIIdXgGmSr6820Y2/HR7YqwxBjf0Z/PKr/iNoQ24Agc1QGMfUysc5H7/Bmx69GPF9wq7ahbNjSvB+Kg== +"@salesforce/lwc-dev-mobile-core@4.0.0-alpha.5": + version "4.0.0-alpha.5" + resolved "https://registry.yarnpkg.com/@salesforce/lwc-dev-mobile-core/-/lwc-dev-mobile-core-4.0.0-alpha.5.tgz#5d158d5e67b3073994c4d4c3a73638f39293b6eb" + integrity sha512-sz1HWLX2NypAiAVguwd53BgTJYXD0xCh/PYA2upMNdrWNrOHWxPkPvnQfpLDDFWEIYeUHKDlcogKSYYgWgDnyg== dependencies: - "@oclif/core" "^3.26.6" - "@salesforce/core" "^7.3.6" - "@salesforce/sf-plugins-core" "^9.0.10" - ajv "^8.13.0" + "@oclif/core" "^4.0.7" + "@salesforce/core" "^8.1.0" + "@salesforce/sf-plugins-core" "^11.1.2" + ajv "^8.16.0" chalk "^5.3.0" - listr2 "^8.2.1" + listr2 "^8.2.3" node-forge "^1.3.1" "@salesforce/plugin-command-reference@^3.1.6": @@ -4118,7 +4059,7 @@ resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.9.0.tgz#ba477a112653a20b4edcf989c61c57bdff9aa3ca" integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA== -"@salesforce/sf-plugins-core@^11.1.1": +"@salesforce/sf-plugins-core@^11.1.1", "@salesforce/sf-plugins-core@^11.1.2": version "11.1.2" resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-11.1.2.tgz#d18b3cb6603de5d4bedc088fca8c90937ecefb16" integrity sha512-8uM47OfW4ym9KXL/vMAcM9zIF2aEAkSCNins7Ww+QPGA4ssXP3MZKQM2Ncb5tzgvjZK4x0PGP+BAZ3aXUo0pdw== @@ -4136,19 +4077,6 @@ string-width "^7.1.0" terminal-link "^3.0.0" -"@salesforce/sf-plugins-core@^9.0.10", "@salesforce/sf-plugins-core@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-9.1.1.tgz#8818fdb23e0f174d9e6dded0cf34a88be5e3cc44" - integrity sha512-5d4vGLqb1NZoHvDpuTu96TsFg/lexdnQNWC0h7GhOqxikJBpxk6P1DEbk9HrZWL18Gs1YXO9OCj2g8nKqbIC/Q== - dependencies: - "@inquirer/confirm" "^3.1.9" - "@inquirer/password" "^2.1.9" - "@oclif/core" "^3.26.6" - "@salesforce/core" "^7.3.9" - "@salesforce/kit" "^3.1.2" - "@salesforce/ts-types" "^2.0.9" - chalk "^5.3.0" - "@salesforce/ts-types@^2.0.10", "@salesforce/ts-types@^2.0.9": version "2.0.10" resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-2.0.10.tgz#f2107a52b60be6c3fe712f4d40aafad48c6bebe0" @@ -4227,12 +4155,12 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== -"@smithy/abort-controller@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.0.tgz#408fbc0da13c30bc0aac859a44be08a5ba18126a" - integrity sha512-XOm4LkuC0PsK1sf2bBJLIlskn5ghmVxiEBVlo/jg0R8hxASBKYYgOoJEhKWgOr4vWGkN+5rC+oyBAqHYtxjnwQ== +"@smithy/abort-controller@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.1.tgz#291210611ff6afecfc198d0ca72d5771d8461d16" + integrity sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/chunked-blob-reader-native@^3.0.0": @@ -4250,133 +4178,133 @@ dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^3.0.2", "@smithy/config-resolver@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.3.tgz#104106363fbaf6bac61905727f7e2c39c62f3e94" - integrity sha512-4wHqCMkdfVDP4qmr4fVPYOFOH+vKhOv3X4e6KEU9wIC8xXUQ24tnF4CW+sddGDX1zU86GGyQ7A+rg2xmUD6jpQ== +"@smithy/config-resolver@^3.0.2", "@smithy/config-resolver@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.4.tgz#85fffa86cee4562f867b0a70a374057a48525d1b" + integrity sha512-VwiOk7TwXoE7NlNguV/aPq1hFH72tqkHCw8eWXbr2xHspRyyv9DLpLXhq+Ieje+NwoqXrY0xyQjPXdOE6cGcHA== dependencies: - "@smithy/node-config-provider" "^3.1.2" - "@smithy/types" "^3.2.0" + "@smithy/node-config-provider" "^3.1.3" + "@smithy/types" "^3.3.0" "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.2" + "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" "@smithy/core@^2.2.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.2.3.tgz#dc6ba7d338a1b35752be274cdaf6fcbcfdb44a70" - integrity sha512-SpyLOL2vgE6sUYM6nQfu82OirCPkCDKctyG3aMgjMlDPTJpUlmlNH0ttu9ZWwzEjrzzr8uABmPjJTRI7gk1HFQ== - dependencies: - "@smithy/middleware-endpoint" "^3.0.3" - "@smithy/middleware-retry" "^3.0.6" - "@smithy/middleware-serde" "^3.0.2" - "@smithy/protocol-http" "^4.0.2" - "@smithy/smithy-client" "^3.1.4" - "@smithy/types" "^3.2.0" - "@smithy/util-middleware" "^3.0.2" + version "2.2.4" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.2.4.tgz#a83d62fc685ff95ad3133d55d7e365a51526a436" + integrity sha512-qdY3LpMOUyLM/gfjjMQZui+UTNS7kBRDWlvyIhVOql5dn2J3isk9qUTBtQ1CbDH8MTugHis1zu3h4rH+Qmmh4g== + dependencies: + "@smithy/middleware-endpoint" "^3.0.4" + "@smithy/middleware-retry" "^3.0.7" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/protocol-http" "^4.0.3" + "@smithy/smithy-client" "^3.1.5" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" -"@smithy/credential-provider-imds@^3.1.1", "@smithy/credential-provider-imds@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.2.tgz#7e84199a8cd8ff7121c0a2f95f7822dc09cc283f" - integrity sha512-gqVmUaNoeqyrOAjgZg+rTmFLsphh/vS59LCMdFfVpthVS0jbfBzvBmEPktBd+y9ME4DYMGHFAMSYJDK8q0noOQ== +"@smithy/credential-provider-imds@^3.1.1", "@smithy/credential-provider-imds@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.3.tgz#43e6c2d1e3df6bb6bb28bfae6b99c5a4d93bda09" + integrity sha512-U1Yrv6hx/mRK6k8AncuI6jLUx9rn0VVSd9NPEX6pyYFBfkSkChOc/n4zUb8alHUVg83TbI4OdZVo1X0Zfj3ijA== dependencies: - "@smithy/node-config-provider" "^3.1.2" - "@smithy/property-provider" "^3.1.2" - "@smithy/types" "^3.2.0" - "@smithy/url-parser" "^3.0.2" + "@smithy/node-config-provider" "^3.1.3" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" tslib "^2.6.2" -"@smithy/eventstream-codec@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.1.tgz#b47f30bf4ad791ac7981b9fff58e599d18269cf9" - integrity sha512-s29NxV/ng1KXn6wPQ4qzJuQDjEtxLdS0+g5PQFirIeIZrp66FXVJ5IpZRowbt/42zB5dY8TqJ0G0L9KkgtsEZg== +"@smithy/eventstream-codec@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz#4a1c72b34400631b829241151984a1ad8c4f963c" + integrity sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" "@smithy/util-hex-encoding" "^3.0.0" tslib "^2.6.2" "@smithy/eventstream-serde-browser@^3.0.2": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.3.tgz#223267a9e46336aff2bebbc386eb6e62146d1fef" - integrity sha512-ZXKmNAHl6SWKYuVmtoEc/hBQ7Nym/rbAx2SrqoJHn0i9QopIP7fG1AWmoFIeS5R3/VL6AwUIZMR0g8qnjjVRRA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.4.tgz#98d6e7ae60d297e37ee7775af2a7a8bbe574579d" + integrity sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.3" - "@smithy/types" "^3.2.0" + "@smithy/eventstream-serde-universal" "^3.0.4" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/eventstream-serde-config-resolver@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.2.tgz#6238eadae0c060133c61783fd92d8b1ee1e6f99f" - integrity sha512-QbE3asvvBUZr7PwbOaxkSfKDjTAmWZkqh2G7pkYlD4jRkT1Y9nufeyu0OBPlLoF4+gl3YMpSVO7TESe8bVkD+g== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz#f852e096d0ad112363b4685e1d441088d1fce67a" + integrity sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/eventstream-serde-node@^3.0.2": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.3.tgz#51df0ca39f453d78a3d6607c1ac2e96cf900c824" - integrity sha512-v61Ftn7x/ubWFqH7GHFAL/RaU7QZImTbuV95DYugYYItzpO7KaHYEuO8EskCaBpZEfzOxhUGKm4teS9YUSt69Q== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.4.tgz#6301752ca51b3ebabcd2dec112f1dacd990de4c1" + integrity sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.3" - "@smithy/types" "^3.2.0" + "@smithy/eventstream-serde-universal" "^3.0.4" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.3.tgz#2ecac479ba84e10221b4b70545f3d7a223b5345e" - integrity sha512-YXYt3Cjhu9tRrahbTec2uOjwOSeCNfQurcWPGNEUspBhqHoA3KrDrVj+jGbCLWvwkwhzqDnnaeHAxm+IxAjOAQ== +"@smithy/eventstream-serde-universal@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.4.tgz#6754de5b94bdc286d8ef1d6bcf22d80f6ab68f30" + integrity sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A== dependencies: - "@smithy/eventstream-codec" "^3.1.1" - "@smithy/types" "^3.2.0" + "@smithy/eventstream-codec" "^3.1.2" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.0.2", "@smithy/fetch-http-handler@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.1.0.tgz#993d47577c7b86eb5796cd29f8301beafa2cf471" - integrity sha512-s7oQjEOUH9TYjctpITtWF4qxOdg7pBrP9eigEQ8SBsxF3dRFV0S28pGMllC83DUr7ECmErhO/BUwnULfoNhKgQ== +"@smithy/fetch-http-handler@^3.0.2", "@smithy/fetch-http-handler@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.0.tgz#425ce7686bf20176b38f8013ed7fb28302a88929" + integrity sha512-vFvDxMrc6sO5Atec8PaISckMcAwsCrRhYxwUylg97bRT2KZoumOF7qk5+6EVUtuM1IG9AJV5aqXnHln9ZdXHpg== dependencies: - "@smithy/protocol-http" "^4.0.2" - "@smithy/querystring-builder" "^3.0.2" - "@smithy/types" "^3.2.0" + "@smithy/protocol-http" "^4.0.3" + "@smithy/querystring-builder" "^3.0.3" + "@smithy/types" "^3.3.0" "@smithy/util-base64" "^3.0.0" tslib "^2.6.2" "@smithy/hash-blob-browser@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.1.tgz#758b4de6cf75b515cf36c18c4d101a833976c83f" - integrity sha512-8RwdPG7arvL5pfMAFsH6jfBVcC7MDR1LYHjKevZPHREkVtORIQkRfm2K8px7giJt7x0zzQJnWamrsDM4ig8nTQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz#90281c1f183d93686fb4f26107f1819644d68829" + integrity sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg== dependencies: "@smithy/chunked-blob-reader" "^3.0.0" "@smithy/chunked-blob-reader-native" "^3.0.0" - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/hash-node@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.2.tgz#8d1306f3b372e42dc76ae85fd979f7252aea476c" - integrity sha512-43uGA6o6QJQdXwAogybdTDHDd3SCdKyoiHIHb8PpdE2rKmVicjG9b1UgVwdgO8QPytmVqHFaUw27M3LZKwu8Yg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.3.tgz#82c5cb7b0f1a29ee7319081853d2d158c07dff24" + integrity sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" "@smithy/util-buffer-from" "^3.0.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" "@smithy/hash-stream-node@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.1.tgz#ca288961879730a0203b60b4383e2455d015f2ac" - integrity sha512-+uvJHPrFNE9crkh3INVS9FmDcx1DoywDgIzlRWlPy7gqoD8jG14os9ATIFY7wN/ARPz1EWlkCHUap70oXxMmjA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz#89f0290ae44b113863878e75b10c484ff48af71c" + integrity sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" "@smithy/invalid-dependency@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.2.tgz#e455169d86e96e73ebf2bb1728b7d2e2850bdc01" - integrity sha512-+BAY3fMhomtq470tswXyrdVBSUhiLuhBVT+rOmpbz5e04YX+s1dX4NxTLzZGwBjCpeWZNtTxP8zbIvvFk81gUg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz#8d9fd70e3a94b565a4eba4ffbdc95238e1930528" + integrity sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": @@ -4394,175 +4322,175 @@ tslib "^2.6.2" "@smithy/md5-js@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.2.tgz#dec2124a81beb83700b68390d1378010346b8541" - integrity sha512-WlSK9br7fkVucTkCXporwuOttCR3cJ1GV70J8ENYXGNc0nUTPzMdWCyHztgnbbKoekVMjGZOEu+8I52nOdzqwQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.3.tgz#55ee40aa24075b096c39f7910590c18ff7660c98" + integrity sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" "@smithy/middleware-content-length@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.2.tgz#fc69a5b3a46310a798e4c804ef47dbe11ad2045f" - integrity sha512-/Havz3PkYIEmwpqkyRTR21yJsWnFbD1ec4H1pUL+TkDnE7RCQkAVUQepLL/UeCaZeCBXvfdoKbOjSbV01xIinQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.3.tgz#426a7f907cc3c0a5d81deb84e16d38303e5a9ad8" + integrity sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ== dependencies: - "@smithy/protocol-http" "^4.0.2" - "@smithy/types" "^3.2.0" + "@smithy/protocol-http" "^4.0.3" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.0.2", "@smithy/middleware-endpoint@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.3.tgz#bbfdd0f35668af392c5031ca2735c31760740bc6" - integrity sha512-ARAXHodhj4tttKa9y75zvENdSoHq6VGsSi7XS3+yLutrnxttJs6N10UMInCC1yi3/bopT8xug3iOP/y9R6sKJQ== - dependencies: - "@smithy/middleware-serde" "^3.0.2" - "@smithy/node-config-provider" "^3.1.2" - "@smithy/shared-ini-file-loader" "^3.1.2" - "@smithy/types" "^3.2.0" - "@smithy/url-parser" "^3.0.2" - "@smithy/util-middleware" "^3.0.2" +"@smithy/middleware-endpoint@^3.0.2", "@smithy/middleware-endpoint@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.4.tgz#c18518b21c80887c16fb595b156c7c009b0b64ca" + integrity sha512-whUJMEPwl3ANIbXjBXZVdJNgfV2ZU8ayln7xUM47rXL2txuenI7jQ/VFFwCzy5lCmXScjp6zYtptW5Evud8e9g== + dependencies: + "@smithy/middleware-serde" "^3.0.3" + "@smithy/node-config-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.3" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-middleware" "^3.0.3" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.4", "@smithy/middleware-retry@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.6.tgz#ace955263cea4ef6acf1e0e42192be62e20ab558" - integrity sha512-ICsFKp8eAyIMmxN5UT3IU37S6886L879TKtgxPsn/VD/laYNwqTLmJaCAn5//+2fRIrV0dnHp6LFlMwdXlWoUQ== - dependencies: - "@smithy/node-config-provider" "^3.1.2" - "@smithy/protocol-http" "^4.0.2" - "@smithy/service-error-classification" "^3.0.2" - "@smithy/smithy-client" "^3.1.4" - "@smithy/types" "^3.2.0" - "@smithy/util-middleware" "^3.0.2" - "@smithy/util-retry" "^3.0.2" +"@smithy/middleware-retry@^3.0.4", "@smithy/middleware-retry@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.7.tgz#b42d90b3ecc392fdfeda1eff9dc7a023ba11d34b" + integrity sha512-f5q7Y09G+2h5ivkSx5CHvlAT4qRR3jBFEsfXyQ9nFNiWQlr8c48blnu5cmbTQ+p1xmIO14UXzKoF8d7Tm0Gsjw== + dependencies: + "@smithy/node-config-provider" "^3.1.3" + "@smithy/protocol-http" "^4.0.3" + "@smithy/service-error-classification" "^3.0.3" + "@smithy/smithy-client" "^3.1.5" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.1", "@smithy/middleware-serde@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.2.tgz#3ec15a7991c2b066cced5989aba7f81fed4dfb87" - integrity sha512-oT2abV5zLhBucJe1LIIFEcRgIBDbZpziuMPswTMbBQNcaEUycLFvX63zsFmqfwG+/ZQKsNx+BSE8W51CMuK7Yw== +"@smithy/middleware-serde@^3.0.1", "@smithy/middleware-serde@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz#74d974460f74d99f38c861e6862984543a880a66" + integrity sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.1", "@smithy/middleware-stack@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.2.tgz#82610681a7f5986bfb3229df98ca1e050b667660" - integrity sha512-6fRcxomlNKBPIy/YjcnC7YHpMAjRvGUYlYVJAfELqZjkW0vQegNcImjY7T1HgYA6u3pAcCxKVBLYnkTw8z/l0A== +"@smithy/middleware-stack@^3.0.1", "@smithy/middleware-stack@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz#91845c7e61e6f137fa912b623b6def719a4f6ce7" + integrity sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/node-config-provider@^3.1.1", "@smithy/node-config-provider@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.2.tgz#3e739ae02520f2249f6c50197feee6e38125fb1d" - integrity sha512-388fEAa7+6ORj/BDC70peg3fyFBTTXJyXfXJ0Bwd6FYsRltePr2oGzIcm5AuC1WUSLtZ/dF+hYOnfTMs04rLvA== +"@smithy/node-config-provider@^3.1.1", "@smithy/node-config-provider@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.3.tgz#e8e69d0df5be9d6ed3f3a84f51fd2176f09c7ab8" + integrity sha512-rxdpAZczzholz6CYZxtqDu/aKTxATD5DAUDVj7HoEulq+pDSQVWzbg0btZDlxeFfa6bb2b5tUvgdX5+k8jUqcg== dependencies: - "@smithy/property-provider" "^3.1.2" - "@smithy/shared-ini-file-loader" "^3.1.2" - "@smithy/types" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.3" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/node-http-handler@^3.0.1", "@smithy/node-http-handler@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.1.0.tgz#0f37b2c379b1cd85be125234575e7c5129dbed67" - integrity sha512-pOpgB6B+VLXLwAyyvRz+ZAVXABlbAsJ2xvn3WZvrppAPImxwQOPFbeSUzWYMhpC8Tr7yQ3R8fG990QDhskkf1Q== +"@smithy/node-http-handler@^3.0.1", "@smithy/node-http-handler@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.1.1.tgz#9213d9b5139c9f9c5a1928e1574de767a979bf94" + integrity sha512-L71NLyPeP450r2J/mfu1jMc//Z1YnqJt2eSNw7uhiItaONnBLDA68J5jgxq8+MBDsYnFwNAIc7dBG1ImiWBiwg== dependencies: - "@smithy/abort-controller" "^3.1.0" - "@smithy/protocol-http" "^4.0.2" - "@smithy/querystring-builder" "^3.0.2" - "@smithy/types" "^3.2.0" + "@smithy/abort-controller" "^3.1.1" + "@smithy/protocol-http" "^4.0.3" + "@smithy/querystring-builder" "^3.0.3" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/property-provider@^3.1.1", "@smithy/property-provider@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.2.tgz#3da2802511078eae66240bcbeb8ef6f6102aeabf" - integrity sha512-Hzp32BpeFFexBpO1z+ts8okbq/VLzJBadxanJAo/Wf2CmvXMBp6Q/TLWr7Js6IbMEcr0pDZ02V3u1XZkuQUJaA== +"@smithy/property-provider@^3.1.1", "@smithy/property-provider@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.3.tgz#afd57ea82a3f6c79fbda95e3cb85c0ee0a79f39a" + integrity sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/protocol-http@^4.0.1", "@smithy/protocol-http@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.0.2.tgz#502ed3116cb0f1e3f207881df965bac620ccb2da" - integrity sha512-X/90xNWIOqSR2tLUyWxVIBdatpm35DrL44rI/xoeBWUuanE0iyCXJpTcnqlOpnEzgcu0xCKE06+g70TTu2j7RQ== +"@smithy/protocol-http@^4.0.1", "@smithy/protocol-http@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.0.3.tgz#acf16058504e3cce2dbe8abf94f7b544cd09d3f4" + integrity sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/querystring-builder@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.2.tgz#ea0f9a6e2b85d62465b3cc0214e6b86eb7af7ab4" - integrity sha512-xhv1+HacDYsOLdNt7zW+8Fe779KYAzmWvzs9bC5NlKM8QGYCwwuFwDBynhlU4D5twgi2pZ14Lm4h6RiAazCtmA== +"@smithy/querystring-builder@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz#6b0e566f885bb84938d077c69e8f8555f686af13" + integrity sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" "@smithy/util-uri-escape" "^3.0.0" tslib "^2.6.2" -"@smithy/querystring-parser@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.2.tgz#7b8edc661d0ee2c2e7e8a39b1022b00dfff2858e" - integrity sha512-C5hyRKgrZGPNh5QqIWzXnW+LXVrPmVQO0iJKjHeb5v3C61ZkP9QhrKmbfchcTyg/VnaE0tMNf/nmLpQlWuiqpg== +"@smithy/querystring-parser@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz#272a6b83f88dfcbbec8283d72a6bde850cc00091" + integrity sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/service-error-classification@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.2.tgz#ad7a0c8dfd482981a04d42fba24c7ee1ac2eb20b" - integrity sha512-cu0WV2XRttItsuXlcM0kq5MKdphbMMmSd2CXF122dJ75NrFE0o7rruXFGfxAp3BKzgF/DMxX+PllIA/cj4FHMw== +"@smithy/service-error-classification@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz#73484255060a094aa9372f6cd972dcaf97e3ce80" + integrity sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" -"@smithy/shared-ini-file-loader@^3.1.1", "@smithy/shared-ini-file-loader@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.2.tgz#b80f8b9b40841447219a95cb47f7a8f3f85b6467" - integrity sha512-tgnXrXbLMO8vo6VeuqabMw/eTzQHlLmZx0TC0TjtjJghnD0Xl4pEnJtBjTJr6XF5fHMNrt5BcczDXHJT9yNQnA== +"@smithy/shared-ini-file-loader@^3.1.1", "@smithy/shared-ini-file-loader@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.3.tgz#49a5e0e8cd98d219e7e56860586710b146d52ade" + integrity sha512-Z8Y3+08vgoDgl4HENqNnnzSISAaGrF2RoKupoC47u2wiMp+Z8P/8mDh1CL8+8ujfi2U5naNvopSBmP/BUj8b5w== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/signature-v4@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-3.1.1.tgz#4882aacb3260a47b8279b2ffc6a135e03e225260" - integrity sha512-2/vlG86Sr489XX8TA/F+VDA+P04ESef04pSz0wRtlQBExcSPjqO08rvrkcas2zLnJ51i+7ukOURCkgqixBYjSQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-3.1.2.tgz#63fc0d4f9a955e902138fb0a57fafc96b9d4e8bb" + integrity sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA== dependencies: "@smithy/is-array-buffer" "^3.0.0" - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-middleware" "^3.0.2" + "@smithy/util-middleware" "^3.0.3" "@smithy/util-uri-escape" "^3.0.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.1.2", "@smithy/smithy-client@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.1.4.tgz#597a4b0d08c71ed7e66707df28871b8a3a707cce" - integrity sha512-y6xJROGrIoitjpwXLY7P9luDHvuT9jWpAluliuSFdBymFxcl6iyQjo9U/JhYfRHFNTruqsvKOrOESVuPGEcRmQ== - dependencies: - "@smithy/middleware-endpoint" "^3.0.3" - "@smithy/middleware-stack" "^3.0.2" - "@smithy/protocol-http" "^4.0.2" - "@smithy/types" "^3.2.0" - "@smithy/util-stream" "^3.0.4" +"@smithy/smithy-client@^3.1.2", "@smithy/smithy-client@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.1.5.tgz#3956f0b511c3a51f859c45eb11bfd70ae00c5fec" + integrity sha512-x9bL9Mx2CT2P1OiUlHM+ZNpbVU6TgT32f9CmTRzqIHA7M4vYrROCWEoC3o4xHNJASoGd4Opos3cXYPgh+/m4Ww== + dependencies: + "@smithy/middleware-endpoint" "^3.0.4" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/protocol-http" "^4.0.3" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.0.5" tslib "^2.6.2" -"@smithy/types@^3.1.0", "@smithy/types@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.2.0.tgz#1350fe8a50d5e35e12ffb34be46d946860b2b5ab" - integrity sha512-cKyeKAPazZRVqm7QPvcPD2jEIt2wqDPAL1KJKb0f/5I7uhollvsWZuZKLclmyP6a+Jwmr3OV3t+X0pZUUHS9BA== +"@smithy/types@^3.1.0", "@smithy/types@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" + integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.1", "@smithy/url-parser@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.2.tgz#a4d6f364a28d2b11c14d9486041ea8eb4572fc66" - integrity sha512-pRiPHrgibeAr4avtXDoBHmTLtthwA4l8jKYRfZjNgp+bBPyxDMPRg2TMJaYxqbKemvrOkHu9MIBTv2RkdNfD6w== +"@smithy/url-parser@^3.0.1", "@smithy/url-parser@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.3.tgz#e8a060d9810b24b1870385fc2b02485b8a6c5955" + integrity sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A== dependencies: - "@smithy/querystring-parser" "^3.0.2" - "@smithy/types" "^3.2.0" + "@smithy/querystring-parser" "^3.0.3" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/util-base64@^3.0.0": @@ -4612,36 +4540,36 @@ tslib "^2.6.2" "@smithy/util-defaults-mode-browser@^3.0.4": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.6.tgz#4f6d9a8578d6ea131776757accdb9d636f06a6a1" - integrity sha512-tAgoc++Eq+KL7g55+k108pn7nAob3GLWNEMbXhZIQyBcBNaE/o3+r4AEbae0A8bWvLRvArVsjeiuhMykGa04/A== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.7.tgz#5868ae56c9ae4a3532c175f9c0ee281a41065215" + integrity sha512-Q2txLyvQyGfmjsaDbVV7Sg8psefpFcrnlGapDzXGFRPFKRBeEg6OvFK8FljqjeHSaCZ6/UuzQExUPqBR/2qlDA== dependencies: - "@smithy/property-provider" "^3.1.2" - "@smithy/smithy-client" "^3.1.4" - "@smithy/types" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.1.5" + "@smithy/types" "^3.3.0" bowser "^2.11.0" tslib "^2.6.2" "@smithy/util-defaults-mode-node@^3.0.4": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.6.tgz#be733b8c84bf02d2b17803e755f51655e5f99115" - integrity sha512-UNerul6/E8aiCyFTBHk+RSIZCo7m96d/N5K3FeO/wFeZP6oy5HAicLzxqa85Wjv7MkXSxSySX29L/LwTV/QMag== - dependencies: - "@smithy/config-resolver" "^3.0.3" - "@smithy/credential-provider-imds" "^3.1.2" - "@smithy/node-config-provider" "^3.1.2" - "@smithy/property-provider" "^3.1.2" - "@smithy/smithy-client" "^3.1.4" - "@smithy/types" "^3.2.0" + version "3.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.7.tgz#e802ca57df6b8543dc288524d3894a6c357b51fc" + integrity sha512-F4Qcj1fG6MGi2BSWCslfsMSwllws/WzYONBGtLybyY+halAcXdWhcew+mej8M5SKd5hqPYp4f7b+ABQEaeytgg== + dependencies: + "@smithy/config-resolver" "^3.0.4" + "@smithy/credential-provider-imds" "^3.1.3" + "@smithy/node-config-provider" "^3.1.3" + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.1.5" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/util-endpoints@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.3.tgz#480eee018b0bba6f53434444f11558d330b618d5" - integrity sha512-Dyi+pfLglDHSGsKSYunuUUSFM5V0tz7UDgv1Ex97yg+Xkn0Eb0rH0rcvl1n0MaJ11fac3HKDOH0DkALyQYCQag== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.4.tgz#0cfb01deb42ec5cd819b54e85acb2c32e4ba4385" + integrity sha512-ZAtNf+vXAsgzgRutDDiklU09ZzZiiV/nATyqde4Um4priTmasDH+eLpp3tspL0hS2dEootyFMhu1Y6Y+tzpWBQ== dependencies: - "@smithy/node-config-provider" "^3.1.2" - "@smithy/types" "^3.2.0" + "@smithy/node-config-provider" "^3.1.3" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@smithy/util-hex-encoding@^3.0.0": @@ -4651,31 +4579,31 @@ dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.1", "@smithy/util-middleware@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.2.tgz#6daeb9db060552d851801cd7a0afd68769e2f98b" - integrity sha512-7WW5SD0XVrpfqljBYzS5rLR+EiDzl7wCVJZ9Lo6ChNFV4VYDk37Z1QI5w/LnYtU/QKnSawYoHRd7VjSyC8QRQQ== +"@smithy/util-middleware@^3.0.1", "@smithy/util-middleware@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.3.tgz#07bf9602682f5a6c55bc2f0384303f85fc68c87e" + integrity sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw== dependencies: - "@smithy/types" "^3.2.0" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.1", "@smithy/util-retry@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.2.tgz#073b4950f0379307e073a70afe086c52ec2b0329" - integrity sha512-HUVOb1k8p/IH6WFUjsLa+L9H1Zi/FAAB2CDOpWuffI1b2Txi6sknau8kNfC46Xrt39P1j2KDzCE1UlLa2eW5+A== +"@smithy/util-retry@^3.0.1", "@smithy/util-retry@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" + integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== dependencies: - "@smithy/service-error-classification" "^3.0.2" - "@smithy/types" "^3.2.0" + "@smithy/service-error-classification" "^3.0.3" + "@smithy/types" "^3.3.0" tslib "^2.6.2" -"@smithy/util-stream@^3.0.2", "@smithy/util-stream@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.0.4.tgz#7a33a39754d8a0737f30687953d8dcc05810e907" - integrity sha512-CcMioiaOOsEVdb09pS7ux1ij7QcQ2jE/cE1+iin1DXMeRgAEQN/47m7Xztu7KFQuQsj0A5YwB2UN45q97CqKCg== +"@smithy/util-stream@^3.0.2", "@smithy/util-stream@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.0.5.tgz#8ca98441e1deedfc4ec8d3fee9aa4342fdbc484f" + integrity sha512-xC3L5PKMAT/Bh8fmHNXP9sdQ4+4aKVUU3EEJ2CF/lLk7R+wtMJM+v/1B4en7jO++Wa5spGzFDBCl0QxgbUc5Ug== dependencies: - "@smithy/fetch-http-handler" "^3.1.0" - "@smithy/node-http-handler" "^3.1.0" - "@smithy/types" "^3.2.0" + "@smithy/fetch-http-handler" "^3.2.0" + "@smithy/node-http-handler" "^3.1.1" + "@smithy/types" "^3.3.0" "@smithy/util-base64" "^3.0.0" "@smithy/util-buffer-from" "^3.0.0" "@smithy/util-hex-encoding" "^3.0.0" @@ -4706,12 +4634,12 @@ tslib "^2.6.2" "@smithy/util-waiter@^3.0.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.1.tgz#9defbb12eda75135dc6e347923b3a01a8ef4a256" - integrity sha512-xT+Bbpe5sSrC7cCWSElOreDdWzqovR1V+7xrp+fmwGAA+TPYBb78iasaXjO1pa+65sY6JjW5GtGeIoJwCK9B1g== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.2.tgz#2d40c3312f3537feee763459a19acafab4c75cf3" + integrity sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw== dependencies: - "@smithy/abort-controller" "^3.1.0" - "@smithy/types" "^3.2.0" + "@smithy/abort-controller" "^3.1.1" + "@smithy/types" "^3.3.0" tslib "^2.6.2" "@swc/wasm@1.4.16": @@ -4811,13 +4739,6 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== -"@types/cli-progress@^3.11.5": - version "3.11.5" - resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.5.tgz#9518c745e78557efda057e3f96a5990c717268c3" - integrity sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g== - dependencies: - "@types/node" "*" - "@types/connect@*": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" @@ -5058,7 +4979,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== -"@types/node@^18.15.3", "@types/node@^18.19.32": +"@types/node@^18.15.3", "@types/node@^18.19.34": version "18.19.39" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.39.tgz#c316340a5b4adca3aee9dcbf05de385978590593" integrity sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ== @@ -5633,7 +5554,7 @@ ajv@6.12.6, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.11.0, ajv@^8.13.0, ajv@^8.15.0, ajv@^8.16.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.11.0, ajv@^8.16.0, ajv@^8.9.0: version "8.16.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== @@ -5709,7 +5630,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -5721,11 +5642,6 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - ansis@^3.1.1, ansis@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.2.0.tgz#0e050c5be94784f32ffdac4b84fccba064aeae4b" @@ -5987,11 +5903,6 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - astring@^1.8.6, astring@~1.8.6: version "1.8.6" resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" @@ -6538,14 +6449,6 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - ccount@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" @@ -6836,27 +6739,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.20, colorette@^2.0.7: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -7627,9 +7514,9 @@ ejs@^3.1.10: jake "^10.8.5" electron-to-chromium@^1.4.796: - version "1.4.812" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz#21b78709c5a13af5d5c688d135a22dcea7617acf" - integrity sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg== + version "1.4.814" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.814.tgz#176535a0b899c9c473464502ab77576aa8bb1cbe" + integrity sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw== emittery@^0.7.1: version "0.7.2" @@ -8201,7 +8088,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -9530,9 +9417,9 @@ https-proxy-agent@^5.0.0: debug "4" https-proxy-agent@^7.0.1: - version "7.0.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: agent-base "^7.0.2" debug "4" @@ -9552,11 +9439,6 @@ husky@^7.0.4: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -hyperlinker@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" - integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -9730,11 +9612,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -10648,7 +10525,7 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.13.1, js-yaml@^3.14.1: +js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -11016,7 +10893,7 @@ linkify-it@^5.0.0: dependencies: uc.micro "^2.0.0" -linkinator@^6.0.4: +linkinator@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/linkinator/-/linkinator-6.0.5.tgz#b19344d65824d3a8beafd94c9db86ddbfb8e83aa" integrity sha512-LRMHgO/29gk2WQzdj4cFcFHGKPhYPGBWVZOayATP6j3159ubonGJizObNRvgA5qDnrkqsRwJT7p4Tq97pC9GeA== @@ -11032,7 +10909,7 @@ linkinator@^6.0.4: server-destroy "^1.0.1" srcset "^5.0.0" -listr2@^8.2.1: +listr2@^8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.3.tgz#c494bb89b34329cf900e4e0ae8aeef9081d7d7a5" integrity sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw== @@ -11260,9 +11137,9 @@ lowercase-keys@^3.0.0: integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.3.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" + integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== lru-cache@^5.1.1: version "5.1.1" @@ -11973,11 +11850,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -natural-orderby@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" - integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== - natural-orderby@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-3.0.2.tgz#1b874d685fbd68beab2c6e7d14f298e03d631ec3" @@ -12249,11 +12121,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-treeify@^1.1.33: - version "1.1.33" - resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" - integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== - object-treeify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-4.0.1.tgz#f91a7dec795d8275886e7f1bd78408f6975be825" @@ -12603,14 +12470,6 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== -password-prompt@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" - integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== - dependencies: - ansi-escapes "^4.3.2" - cross-spawn "^7.0.3" - path-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" @@ -13205,13 +13064,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" - reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -13896,13 +13748,6 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - sinon@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.0.tgz#52279f97e35646ff73d23207d0307977c9b81430" @@ -13961,15 +13806,6 @@ slash@^5.1.0: resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -14424,7 +14260,7 @@ style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -supports-color@8.1.1, supports-color@^8, supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@8.1.1, supports-color@^8, supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -14951,7 +14787,7 @@ typedoc-plugin-missing-exports@0.23.0: resolved "https://registry.yarnpkg.com/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-0.23.0.tgz#076df6ffce4d84e8097be009b7c62a17d58477a5" integrity sha512-9smahDSsFRno9ZwoEshQDuIYMHWGB1E6LUud5qMxR2wNZ0T4DlZz0QjoK3HzXtX34mUpTH0dYtt7NQUK4D6B6Q== -typedoc@^0.25.12: +typedoc@^0.25.13: version "0.25.13" resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.13.tgz#9a98819e3b2d155a6d78589b46fa4c03768f0922" integrity sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==