From 16c14b28d540fe7ced18df3c7bbe814326e9f050 Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Thu, 9 Oct 2025 22:15:48 -0600 Subject: [PATCH 1/7] feat: add orchestrator app upgrade command - Add new 'sf orchestrator app upgrade' command to upgrade existing apps to new template versions - Support upgrading by app ID or app name - Include template values, runtime method, log level, and chain name options - Add comprehensive validation for template compatibility and JSON input - Include unit tests and NUT tests for command functionality --- command-snapshot.json | 20 ++ messages/orchestrator.app.upgrade.md | 141 +++++++++ src/commands/orchestrator/app/upgrade.ts | 279 ++++++++++++++++++ test/commands/orchestrator/app/upgrade.nut.ts | 46 +++ .../commands/orchestrator/app/upgrade.test.ts | 118 ++++++++ 5 files changed, 604 insertions(+) create mode 100644 messages/orchestrator.app.upgrade.md create mode 100644 src/commands/orchestrator/app/upgrade.ts create mode 100644 test/commands/orchestrator/app/upgrade.nut.ts create mode 100644 test/commands/orchestrator/app/upgrade.test.ts diff --git a/command-snapshot.json b/command-snapshot.json index 7f5a10c..1c65921 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -51,6 +51,26 @@ "flags": ["api-version", "app-id", "app-name", "description", "flags-dir", "json", "label", "target-org"], "plugin": "@salesforce/plugin-orchestrator" }, + { + "alias": [], + "command": "orchestrator:app:upgrade", + "flagAliases": [], + "flagChars": ["c", "i", "l", "n", "o", "r", "t", "v"], + "flags": [ + "api-version", + "app-id", + "app-name", + "chain-name", + "flags-dir", + "json", + "log-level", + "runtime-method", + "target-org", + "template-id", + "template-values" + ], + "plugin": "@salesforce/plugin-orchestrator" + }, { "alias": [], "command": "orchestrator:template:create", diff --git a/messages/orchestrator.app.upgrade.md b/messages/orchestrator.app.upgrade.md new file mode 100644 index 0000000..b244616 --- /dev/null +++ b/messages/orchestrator.app.upgrade.md @@ -0,0 +1,141 @@ +# summary + +Upgrade an orchestrated app. + +# description + +Upgrade an existing orchestrated app by running its template's upgrade chains. This command allows you to apply template upgrades, reconfigure the app with new template values, and modify runtime settings while staying within the same template. + +You can identify the app by either its unique ID or its name. App IDs are guaranteed to be unique, while names should be unique within an org. + +Use this command to run template-defined upgrade workflows that can update app configurations, apply new template versions, or reconfigure template values. This is different from the update command which only changes basic metadata like label and description. + +You must have Data Cloud and Tableau Next enabled in your org and the AppFrameworkManageApp user permission to modify apps. The template ID must match the app's current template - you cannot change the underlying template an app is based on. + +# flags.target-org.summary + +Login username or alias for the target org. + +# flags.target-org.description + +The target org to connect to for upgrading the app. + +# flags.api-version.summary + +Override the API version used for API requests. + +# flags.api-version.description + +Override the API version used for orchestrator API requests. Use this flag to specify a particular API version when the default version doesn't work with your org's configuration. + +# flags.app-id.summary + +ID of the app to upgrade. + +# flags.app-id.description + +The unique identifier of the app to upgrade. + +# flags.app-name.summary + +Name of the app to upgrade. + +# flags.app-name.description + +The name of the app to upgrade. + +# flags.template-id.summary + +ID of the template to use for the upgrade. + +# flags.template-id.description + +The unique identifier of the template to use for upgrading the app. This must match the app's current template ID. Template upgrades run the template's defined upgrade chains to reconfigure or update the app. Use "sf orchestrator template list" to find available template IDs. + +# flags.template-values.summary + +Template-specific configuration values as JSON. + +# flags.template-values.description + +A JSON object containing template-specific configuration values to pass to the upgrade chain. The available values depend on the template's variable definitions. For example: '{"dataSource":"mySource","refreshInterval":30}'. These values customize how the template upgrade chain configures the app. + +# flags.runtime-method.summary + +Runtime method for the upgrade execution. + +# flags.runtime-method.description + +Specifies how the upgrade chain should be executed. Use 'sync' for synchronous execution (wait for completion) or 'async' for asynchronous execution (run in background). This affects how long the command takes to complete and how errors are handled. + +# flags.log-level.summary + +Log level for the upgrade execution. + +# flags.log-level.description + +Sets the logging level for the upgrade chain execution. Higher levels provide more diagnostic information: 'debug' (most verbose), 'info' (normal), 'warn' (warnings only), or 'error' (errors only). Use 'debug' when troubleshooting upgrade issues. + +# flags.chain-name.summary + +Specific chain name to execute for the upgrade. + +# flags.chain-name.description + +The name of the specific upgrade chain to execute. If not specified, the template's default upgrade chain will be used. Different chains may perform different types of upgrades or configurations within the same template. + +# noAppSpecified + +No app specified for upgrade. You must specify either an app ID with --app-id or an app name with --app-name. + +# noAppFound + +No app found with the specified ID or name. + +# invalidTemplateValues + +Invalid template values JSON. Please provide a valid JSON object for --template-values. + +# fetchingApp + +Fetching app details... + +# upgradingApp + +Upgrading app... + +# upgradeSuccess + +Successfully upgraded app: %s + +# error.UpgradeError + +Failed to upgrade app: %s + +# error.UpgradeError.Actions + +- Verify that you have permission to modify apps in the target org +- Check that the app exists and is accessible +- Ensure the template ID matches the app's current template +- Verify the template values are valid JSON and match expected variables +- Check that Data Cloud and Tableau Next are enabled in your org +- Try using a different API version with --api-version +- Verify your authentication and org connection are valid + +# examples + +- Upgrade an app with its current template: + + <%= config.bin %> <%= command.id %> --target-org myOrg --app-id 1zAxx000000000123 --template-id 1zDxx000000001EAA + +- Upgrade an app with new template values: + + <%= config.bin %> <%= command.id %> --target-org myOrg --app-name "My App" --template-id 1zDxx000000001EAA --template-values '{"dataSource":"newSource","refreshInterval":60}' + +- Upgrade an app with async execution: + + <%= config.bin %> <%= command.id %> --target-org myOrg --app-id 1zAxx000000000123 --template-id 1zDxx000000001EAA --runtime-method async --log-level debug + +- Upgrade an app using a specific chain: + + <%= config.bin %> <%= command.id %> --target-org myOrg --app-id 1zAxx000000000123 --template-id 1zDxx000000001EAA --chain-name "UpdateConfiguration" diff --git a/src/commands/orchestrator/app/upgrade.ts b/src/commands/orchestrator/app/upgrade.ts new file mode 100644 index 0000000..cef48e4 --- /dev/null +++ b/src/commands/orchestrator/app/upgrade.ts @@ -0,0 +1,279 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; +import { Messages, SfError, Connection } from '@salesforce/core'; +import AppFrameworkApp from '../../../utils/app/appframeworkapp.js'; +import { AppListUtil } from '../../../utils/app/appListUtils.js'; +import { AppDisplayUtil } from '../../../utils/app/appDisplayUtil.js'; +import { RawApp } from '../../../utils/app/appTypes.js'; + +Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); +const messages = Messages.loadMessages('@salesforce/plugin-orchestrator', 'orchestrator.app.upgrade'); + +export type OrchestratorAppUpgradeResult = { + appId: string; +}; + +type UpdateOptions = { + templateSourceId: string; + templateValues?: Record; + runtimeMethod?: string; + logLevel?: string; + chainName?: string; +}; + +export default class OrchestratorAppUpgrade extends SfCommand { + public static readonly summary = messages.getMessage('summary'); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + public static readonly state = 'preview'; + + public static readonly flags = { + 'target-org': Flags.requiredOrg({ + summary: messages.getMessage('flags.target-org.summary'), + description: messages.getMessage('flags.target-org.description'), + required: true, + }), + 'api-version': Flags.orgApiVersion({ + summary: messages.getMessage('flags.api-version.summary'), + description: messages.getMessage('flags.api-version.description'), + }), + 'app-id': Flags.string({ + char: 'i', + summary: messages.getMessage('flags.app-id.summary'), + description: messages.getMessage('flags.app-id.description'), + exclusive: ['app-name'], + }), + 'app-name': Flags.string({ + char: 'n', + summary: messages.getMessage('flags.app-name.summary'), + description: messages.getMessage('flags.app-name.description'), + exclusive: ['app-id'], + }), + 'template-id': Flags.string({ + char: 't', + summary: messages.getMessage('flags.template-id.summary'), + description: messages.getMessage('flags.template-id.description'), + required: true, + }), + 'template-values': Flags.string({ + char: 'v', + summary: messages.getMessage('flags.template-values.summary'), + description: messages.getMessage('flags.template-values.description'), + }), + 'runtime-method': Flags.string({ + char: 'r', + summary: messages.getMessage('flags.runtime-method.summary'), + description: messages.getMessage('flags.runtime-method.description'), + options: ['sync', 'async'], + }), + 'log-level': Flags.string({ + char: 'l', + summary: messages.getMessage('flags.log-level.summary'), + description: messages.getMessage('flags.log-level.description'), + options: ['debug', 'info', 'warn', 'error'], + }), + 'chain-name': Flags.string({ + char: 'c', + summary: messages.getMessage('flags.chain-name.summary'), + description: messages.getMessage('flags.chain-name.description'), + }), + }; + + private static validateRequiredFlags(flags: Record): void { + if (!flags['app-id'] && !flags['app-name']) { + throw new SfError( + messages.getMessage('noAppSpecified'), + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + } + + private static validateTemplateMatch(app: RawApp, templateId: string): void { + if (app.templateSourceId !== templateId) { + throw new SfError( + `Template ID mismatch. App is using template '${ + app.templateSourceId ?? 'unknown' + }' but you specified '${templateId}'. You cannot change the underlying template during an upgrade.`, + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + } + + private static parseTemplateValues(templateValuesString?: string): Record | undefined { + if (!templateValuesString) { + return undefined; + } + + try { + const parsed: unknown = JSON.parse(templateValuesString); + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw new SfError( + 'Template values must be a valid JSON object, not an array or primitive value.', + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + + return parsed as Record; + } catch (error) { + if (error instanceof SfError) { + throw error; + } + throw new SfError( + messages.getMessage('invalidTemplateValues'), + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + } + + private static buildUpdateOptions( + flags: Record, + templateValues?: Record + ): UpdateOptions { + const updateOptions: UpdateOptions = { + templateSourceId: flags['template-id'] as string, + templateValues, + runtimeMethod: flags['runtime-method'] as string | undefined, + logLevel: flags['log-level'] as string | undefined, + }; + + if (flags['chain-name']) { + updateOptions.chainName = flags['chain-name'] as string; + } + + return updateOptions; + } + + private static async resolveAppById( + appId: string, + appFrameworkApp: AppFrameworkApp + ): Promise<{ appId: string; app: RawApp }> { + if (!appId) { + throw new SfError( + messages.getMessage('noAppSpecified'), + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + + const app = await appFrameworkApp.getApp(appId); + if (!app) { + throw new SfError( + messages.getMessage('noAppFound'), + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + + return { appId, app }; + } + + private static handleUpgradeError(error: unknown): never { + if (error instanceof SfError) { + throw error; + } + + throw new SfError( + messages.getMessage('error.UpgradeError', [(error as Error).message]), + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions'), + undefined, + error as Error + ); + } + + public async run(): Promise { + const { flags } = await this.parse(OrchestratorAppUpgrade); + + OrchestratorAppUpgrade.validateRequiredFlags(flags); + + try { + type OrgType = { getConnection(apiVersion?: string): Connection }; + const connection = (flags['target-org'] as OrgType).getConnection(flags['api-version']); + const appFrameworkApp = new AppFrameworkApp(connection); + + const { appId, app } = await this.resolveApp(flags, appFrameworkApp); + OrchestratorAppUpgrade.validateTemplateMatch(app, flags['template-id']); + const templateValues = OrchestratorAppUpgrade.parseTemplateValues(flags['template-values']); + const updateOptions = OrchestratorAppUpgrade.buildUpdateOptions(flags, templateValues); + + const upgradedAppId = await this.executeUpgrade(appFrameworkApp, appId, updateOptions); + await this.displayUpgradedApp(appFrameworkApp, upgradedAppId); + + return { appId: upgradedAppId }; + } catch (error) { + this.spinner.stop(); + OrchestratorAppUpgrade.handleUpgradeError(error); + } + } + + private async resolveApp( + flags: Record, + appFrameworkApp: AppFrameworkApp + ): Promise<{ appId: string; app: RawApp }> { + if (flags['app-name']) { + return this.resolveAppByName(flags['app-name'] as string, appFrameworkApp); + } + return OrchestratorAppUpgrade.resolveAppById(flags['app-id'] as string, appFrameworkApp); + } + + private async resolveAppByName( + appName: string, + appFrameworkApp: AppFrameworkApp + ): Promise<{ appId: string; app: RawApp }> { + this.spinner.start(messages.getMessage('fetchingApp')); + const apps = await appFrameworkApp.list(); + const foundApp = apps.find((a) => a.name === appName); + + if (!foundApp?.id) { + this.spinner.stop(); + throw new SfError( + messages.getMessage('noAppFound'), + 'AppUpgradeError', + messages.getMessages('error.UpgradeError.Actions') + ); + } + + this.spinner.stop(); + return { appId: foundApp.id, app: foundApp }; + } + + private async executeUpgrade( + appFrameworkApp: AppFrameworkApp, + appId: string, + updateOptions: UpdateOptions + ): Promise { + this.spinner.start(messages.getMessage('upgradingApp')); + const upgradedAppId = await appFrameworkApp.updateApp(appId, updateOptions); + this.spinner.stop(); + this.log(messages.getMessage('upgradeSuccess', [upgradedAppId])); + return upgradedAppId; + } + + private async displayUpgradedApp(appFrameworkApp: AppFrameworkApp, upgradedAppId: string): Promise { + const upgradedApp = await appFrameworkApp.getApp(upgradedAppId); + if (upgradedApp) { + const processedApps = AppListUtil.processApps([upgradedApp]); + if (processedApps.length > 0) { + AppDisplayUtil.displayAppDetails(this, processedApps[0]); + } + } + } +} diff --git a/test/commands/orchestrator/app/upgrade.nut.ts b/test/commands/orchestrator/app/upgrade.nut.ts new file mode 100644 index 0000000..fa49531 --- /dev/null +++ b/test/commands/orchestrator/app/upgrade.nut.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { execCmd, TestSession } from '@salesforce/cli-plugins-testkit'; +import { expect } from 'chai'; + +describe('orchestrator app upgrade NUTs', () => { + let session: TestSession; + + before(async () => { + session = await TestSession.create({ devhubAuthStrategy: 'NONE' }); + }); + + after(async () => { + await session?.clean(); + }); + + it('should show help for upgrade command', () => { + const command = 'orchestrator app upgrade --help'; + const output = execCmd(command, { ensureExitCode: 0 }).shellOutput.stdout; + expect(output).to.contain('Upgrade an app'); + expect(output).to.contain('--template-id'); + expect(output).to.contain('--app-id'); + expect(output).to.contain('--app-name'); + }); + + it('should show exclusive flag documentation', () => { + const command = 'orchestrator app upgrade --help'; + const output = execCmd(command, { ensureExitCode: 0 }).shellOutput.stdout; + expect(output).to.contain('app-id'); + expect(output).to.contain('app-name'); + expect(output).to.contain('template-id'); + }); +}); diff --git a/test/commands/orchestrator/app/upgrade.test.ts b/test/commands/orchestrator/app/upgrade.test.ts new file mode 100644 index 0000000..cef060e --- /dev/null +++ b/test/commands/orchestrator/app/upgrade.test.ts @@ -0,0 +1,118 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { TestContext } from '@salesforce/core/testSetup'; +import { expect } from 'chai'; +import { stubSfCommandUx } from '@salesforce/sf-plugins-core'; +import OrchestratorAppUpgrade from '../../../../src/commands/orchestrator/app/upgrade.js'; + +describe('orchestrator app upgrade', () => { + const $ = new TestContext(); + + beforeEach(() => { + stubSfCommandUx($.SANDBOX); + }); + + afterEach(() => { + $.restore(); + }); + + it('should have correct command flags', async () => { + expect(OrchestratorAppUpgrade.flags['target-org']).to.exist; + expect(OrchestratorAppUpgrade.flags['template-id']).to.exist; + expect(OrchestratorAppUpgrade.flags['app-id']).to.exist; + expect(OrchestratorAppUpgrade.flags['app-name']).to.exist; + expect(OrchestratorAppUpgrade.flags['template-values']).to.exist; + expect(OrchestratorAppUpgrade.flags['runtime-method']).to.exist; + expect(OrchestratorAppUpgrade.flags['log-level']).to.exist; + expect(OrchestratorAppUpgrade.flags['chain-name']).to.exist; + }); + + it('should have correct command properties', async () => { + expect(OrchestratorAppUpgrade.summary).to.be.a('string'); + expect(OrchestratorAppUpgrade.description).to.be.a('string'); + expect(OrchestratorAppUpgrade.examples).to.be.an('array'); + expect(OrchestratorAppUpgrade.state).to.equal('preview'); + }); + + it('should have required flags configured correctly', () => { + expect(OrchestratorAppUpgrade.flags['target-org'].required).to.be.true; + expect(OrchestratorAppUpgrade.flags['template-id'].required).to.be.true; + }); + + it('should have exclusive flags configured correctly', () => { + expect(OrchestratorAppUpgrade.flags['app-id'].exclusive).to.deep.equal(['app-name']); + expect(OrchestratorAppUpgrade.flags['app-name'].exclusive).to.deep.equal(['app-id']); + }); + + it('should have correct options for runtime-method flag', () => { + expect(OrchestratorAppUpgrade.flags['runtime-method'].options).to.deep.equal(['sync', 'async']); + }); + + it('should have correct options for log-level flag', () => { + expect(OrchestratorAppUpgrade.flags['log-level'].options).to.deep.equal(['debug', 'info', 'warn', 'error']); + }); + + it('should validate flags correctly', () => { + // Test validateRequiredFlags static method + expect(() => { + // @ts-expect-error - accessing private static method for testing + OrchestratorAppUpgrade.validateRequiredFlags({}); + }).to.throw('No app specified for upgrade'); + + expect(() => { + // @ts-expect-error - accessing private static method for testing + OrchestratorAppUpgrade.validateRequiredFlags({ 'app-id': 'test' }); + }).to.not.throw(); + }); + + it('should parse template values correctly', () => { + // @ts-expect-error - accessing private static method for testing + const result = OrchestratorAppUpgrade.parseTemplateValues('{"key": "value"}'); + expect(result).to.deep.equal({ key: 'value' }); + }); + + it('should handle invalid JSON template values', () => { + expect(() => { + // @ts-expect-error - accessing private static method for testing + OrchestratorAppUpgrade.parseTemplateValues('invalid-json'); + }).to.throw('Invalid template values JSON'); + }); + + it('should reject array template values', () => { + expect(() => { + // @ts-expect-error - accessing private static method for testing + OrchestratorAppUpgrade.parseTemplateValues('["array", "not", "object"]'); + }).to.throw('Template values must be a valid JSON object'); + }); + + it('should build update options correctly', () => { + const flags = { + 'template-id': 'test-template', + 'runtime-method': 'sync', + 'log-level': 'debug', + 'chain-name': 'test-chain', + }; + + // @ts-expect-error - accessing private static method for testing + const options = OrchestratorAppUpgrade.buildUpdateOptions(flags, { test: 'value' }); + + expect(options.templateSourceId).to.equal('test-template'); + expect(options.runtimeMethod).to.equal('sync'); + expect(options.logLevel).to.equal('debug'); + expect(options.chainName).to.equal('test-chain'); + expect(options.templateValues).to.deep.equal({ test: 'value' }); + }); +}); From 7025cbf3c813b256e4c4ba7b72a0d0a0f0dece80 Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Thu, 4 Dec 2025 23:54:09 -0700 Subject: [PATCH 2/7] feat: add template eval command to test JSON transformation rules --- command-snapshot.json | 20 + messages/orchestrator.template.eval.md | 99 +++++ package.json | 4 + src/commands/orchestrator/template/eval.ts | 406 +++++++++++++++++++ src/utils/template/localTemplateDetector.ts | 141 +++++++ test/commands/template/preview.test.ts | 30 ++ yarn.lock | 422 +++++++++++--------- 7 files changed, 938 insertions(+), 184 deletions(-) create mode 100644 messages/orchestrator.template.eval.md create mode 100644 src/commands/orchestrator/template/eval.ts create mode 100644 src/utils/template/localTemplateDetector.ts create mode 100644 test/commands/template/preview.test.ts diff --git a/command-snapshot.json b/command-snapshot.json index 1c65921..14d653b 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -95,6 +95,26 @@ "flags": ["api-version", "flags-dir", "json", "target-org", "template-id", "template-name"], "plugin": "@salesforce/plugin-orchestrator" }, + { + "alias": [], + "command": "orchestrator:template:eval", + "flagAliases": [], + "flagChars": ["d", "o", "p", "r", "t", "v"], + "flags": [ + "api-version", + "definition-file", + "document-file", + "flags-dir", + "json", + "no-prompt", + "project-dir", + "target-org", + "template-name", + "template-path", + "values-file" + ], + "plugin": "@salesforce/plugin-orchestrator" + }, { "alias": [], "command": "orchestrator:template:list", diff --git a/messages/orchestrator.template.eval.md b/messages/orchestrator.template.eval.md new file mode 100644 index 0000000..a780605 --- /dev/null +++ b/messages/orchestrator.template.eval.md @@ -0,0 +1,99 @@ +# summary + +Test JSON transformation rules using the jsonxform/transformation endpoint. + +# description + +Preview how transformation rules will modify JSON documents before deploying templates. This command uses a sample transformation to test the jsonxform/transformation endpoint with built-in User and Org context variables. + +# flags.target-org.summary + +Username or alias for the target org; overrides default target org. + +# flags.target-org.description + +The username or alias of the target org where the jsonxform/transformation endpoint will be called. This org provides the User and Org context variables used in the transformation. + +# flags.api-version.summary + +Override the api version used for api requests made by this command. + +# flags.api-version.description + +API version to use for the transformation request. Defaults to the org's configured API version. + +# flags.template-path.summary + +Path to a local template directory to test. + +# flags.template-path.description + +Full path to a local Analytics template directory containing template-info.json and other template files. Use this to test rules from a specific template. + +# flags.template-name.summary + +Name of a local template to test. + +# flags.template-name.description + +Name or label of a template found in the local project. The command will search for templates in standard SFDX project paths. + +# flags.project-dir.summary + +Path to SFDX project root directory. + +# flags.project-dir.description + +Root directory of the SFDX project to search for templates. Defaults to current working directory. + +# flags.no-prompt.summary + +Skip interactive template selection and use static example. + +# flags.no-prompt.description + +Use static example without prompting for template selection. Useful for scripting and CI environments. + +# flags.document-file.summary + +Path to JSON document file to transform. + +# flags.document-file.description + +Path to the JSON document file that will be transformed by the rules. + +# flags.values-file.summary + +Path to JSON values file for variables. + +# flags.values-file.description + +Path to JSON file containing variables used in transformations. + +# flags.definition-file.summary + +Path to JSON rules definition file. + +# flags.definition-file.description + +Path to JSON file containing transformation rules and definitions. + +# examples + +- Test JSON transformation with sample rules: + <%= config.bin %> <%= command.id %> --target-org myorg + +- Test with specific API version: + <%= config.bin %> <%= command.id %> --target-org myorg --api-version 60.0 + +- Test a specific local template by path: + <%= config.bin %> <%= command.id %> --template-path ./force-app/main/default/appTemplates/MyTemplate --target-org myorg + +- Test a local template by name: + <%= config.bin %> <%= command.id %> --template-name working_template_1 --target-org myorg + +- Test with custom project directory: + <%= config.bin %> <%= command.id %> --template-name MyTemplate --project-dir /path/to/project --target-org myorg + +- Skip interactive prompts (useful for CI/automation): + <%= config.bin %> <%= command.id %> --no-prompt --target-org myorg diff --git a/package.json b/package.json index dc9a179..a826555 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "author": "Salesforce", "bugs": "https://github.com/forcedotcom/cli/issues", "dependencies": { + "@inquirer/select": "^5.0.1", "@oclif/core": "^4", "@salesforce/core": "^8.23.0", "@salesforce/kit": "^3.2.1", @@ -63,6 +64,9 @@ }, "orchestrator:template": { "description": "Work with templates" + }, + "template": { + "description": "description for template" } }, "flexibleTaxonomy": true diff --git a/src/commands/orchestrator/template/eval.ts b/src/commands/orchestrator/template/eval.ts new file mode 100644 index 0000000..581aac8 --- /dev/null +++ b/src/commands/orchestrator/template/eval.ts @@ -0,0 +1,406 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as fs from 'node:fs/promises'; +import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; +import { Messages, Connection } from '@salesforce/core'; +import select from '@inquirer/select'; +import { LocalTemplateDetector, LocalTemplate } from '../../../utils/template/localTemplateDetector.js'; + +Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); +const messages = Messages.loadMessages('@salesforce/plugin-orchestrator', 'orchestrator.template.eval'); + +type TransformationPayload = { + document: { + user: { + firstName: string; + lastName: string; + userName: string; + id: string; + hello: string; + }; + company: { + id: string; + name: string; + namespace: string; + }; + }; + values: { + Variables: { + hello: string; + }; + }; + definition: { + rules: Array<{ + name: string; + actions: Array<{ + action: string; + description: string; + key: string; + path: string; + value: string; + }>; + }>; + }; +}; + +type TemplateInfo = { + name: string; + path: string; + source: 'static' | 'local'; +}; + +export type TemplatePreviewResult = { + status: 'success' | 'error'; + template?: TemplateInfo; + input?: TransformationPayload; + output?: unknown; + error?: string; + executionTime?: string; +}; + +export default class TemplateEval extends SfCommand { + public static readonly summary = messages.getMessage('summary'); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + + public static readonly flags = { + 'target-org': Flags.requiredOrg({ + summary: messages.getMessage('flags.target-org.summary'), + description: messages.getMessage('flags.target-org.description'), + required: true, + }), + 'api-version': Flags.orgApiVersion({ + summary: messages.getMessage('flags.api-version.summary'), + description: messages.getMessage('flags.api-version.description'), + }), + 'document-file': Flags.file({ + char: 'd', + summary: messages.getMessage('flags.document-file.summary'), + description: messages.getMessage('flags.document-file.description'), + exclusive: ['template-path', 'template-name', 'no-prompt'], + }), + 'values-file': Flags.file({ + char: 'v', + summary: messages.getMessage('flags.values-file.summary'), + description: messages.getMessage('flags.values-file.description'), + dependsOn: ['document-file'], + }), + 'definition-file': Flags.file({ + char: 'r', + summary: messages.getMessage('flags.definition-file.summary'), + description: messages.getMessage('flags.definition-file.description'), + dependsOn: ['document-file'], + }), + 'template-path': Flags.directory({ + char: 'p', + summary: messages.getMessage('flags.template-path.summary'), + description: messages.getMessage('flags.template-path.description'), + exclusive: ['template-name', 'document-file'], + }), + 'template-name': Flags.string({ + char: 't', + summary: messages.getMessage('flags.template-name.summary'), + description: messages.getMessage('flags.template-name.description'), + exclusive: ['template-path', 'document-file'], + }), + 'project-dir': Flags.directory({ + summary: messages.getMessage('flags.project-dir.summary'), + description: messages.getMessage('flags.project-dir.description'), + }), + 'no-prompt': Flags.boolean({ + summary: messages.getMessage('flags.no-prompt.summary'), + description: messages.getMessage('flags.no-prompt.description'), + exclusive: ['document-file'], + }), + }; + + private static getStaticPayload(): { + template: TemplateInfo; + payload: TransformationPayload; + } { + return { + template: { + name: 'Static Example', + path: 'built-in', + source: 'static', + }, + payload: { + document: { + user: { + firstName: '${User.FirstName}', + lastName: '${User.LastName}', + userName: '${User.UserName}', + id: '${User.Id}', + hello: '${Variables.hello}', + }, + company: { + id: '${Org.Id}', + name: '${Org.Name}', + namespace: '${Org.Namespace}', + }, + }, + values: { + Variables: { + hello: 'world', + }, + }, + definition: { + rules: [ + { + name: 'Example', + actions: [ + { + action: 'put', + description: 'add hobby to user', + key: 'hobby', + path: '$.user', + value: 'mountain biking', + }, + ], + }, + ], + }, + }, + }; + } + + public async run(): Promise { + const { flags } = await this.parse(TemplateEval); + + try { + type OrgType = { getConnection(apiVersion?: string): Connection }; + const connection = (flags['target-org'] as OrgType).getConnection(flags['api-version']); + + // Determine template source and payload + const templateResult = await this.getTemplatePayload(flags); + + this.log(`🔍 Testing transformation: ${templateResult.template.name}`); + this.log(`📁 Source: ${templateResult.template.source}`); + + if (templateResult.template.source === 'local') { + this.log(`📂 Path: ${templateResult.template.path}`); + } + + const startTime = Date.now(); + + // Make request to jsonxform/transformation endpoint + const apiPath = `/services/data/v${connection.getApiVersion()}/jsonxform/transformation`; + + const result = await connection.request({ + method: 'POST', + url: apiPath, + body: JSON.stringify(templateResult.payload), + headers: { + 'Content-Type': 'application/json', + }, + }); + + const executionTime = `${Date.now() - startTime}ms`; + + this.log('✅ Transformation completed successfully!'); + this.log('📊 Results:'); + this.log(JSON.stringify(result, null, 2)); + + return { + status: 'success', + template: templateResult.template, + input: templateResult.payload, + output: result, + executionTime, + }; + } catch (error) { + this.log(`❌ Transformation failed: ${(error as Error).message}`); + + return { + status: 'error', + error: (error as Error).message, + }; + } + } + + private async getTemplatePayload(flags: { + 'template-path'?: string; + 'template-name'?: string; + 'project-dir'?: string; + 'no-prompt'?: boolean; + 'document-file'?: string; + 'values-file'?: string; + 'definition-file'?: string; + }): Promise<{ + template: TemplateInfo; + payload: TransformationPayload; + }> { + // If direct file paths are provided, use them + if (flags['document-file']) { + return this.getDirectFilePayload(flags['document-file'], flags['values-file'], flags['definition-file']); + } + + // If no template flags provided, discover local templates and prompt for selection + if (!flags['template-path'] && !flags['template-name']) { + // If no-prompt flag is set, use static example + if (flags['no-prompt']) { + this.log('â„šī¸ Using static example (--no-prompt flag specified).'); + return TemplateEval.getStaticPayload(); + } + + const detector = new LocalTemplateDetector(); + const templates = await detector.discoverLocalTemplates(flags['project-dir']); + + if (templates.length === 0) { + this.log('â„šī¸ No local templates found. Using static example.'); + return TemplateEval.getStaticPayload(); + } + + return this.promptForTemplateSelection(templates); + } + + // If template path is provided directly + if (flags['template-path']) { + return this.getLocalTemplatePayload(flags['template-path']); + } + + // If template name is provided, search for it + if (flags['template-name']) { + const detector = new LocalTemplateDetector(); + const templates = await detector.discoverLocalTemplates(flags['project-dir']); + + const foundTemplate = templates.find( + (t) => t.name === flags['template-name'] || t.label === flags['template-name'] + ); + + if (!foundTemplate) { + throw new Error( + `Template '${flags['template-name']}' not found. Available templates: ${templates + .map((t) => t.name) + .join(', ')}` + ); + } + + return this.getLocalTemplatePayload(foundTemplate.path); + } + + return TemplateEval.getStaticPayload(); + } + + private async promptForTemplateSelection(templates: LocalTemplate[]): Promise<{ + template: TemplateInfo; + payload: TransformationPayload; + }> { + // Build choices for inquirer select + const choices = [ + ...templates.map((template) => { + const displayName = template.label ?? template.name; + const description = template.description ? ` - ${template.description}` : ''; + return { + name: `${displayName}${description}`, + value: template.path, + }; + }), + { + name: 'Static Example (built-in test data)', + value: 'static', + }, + ]; + + const selectedValue = await select({ + message: 'Select a template to preview:', + choices, + pageSize: 10, + }); + + if (selectedValue === 'static') { + this.log('✅ Selected: Static Example'); + return TemplateEval.getStaticPayload(); + } + + // Find the selected template + const selectedTemplate = templates.find((t) => t.path === selectedValue); + if (selectedTemplate) { + const displayName = selectedTemplate.label ?? selectedTemplate.name; + this.log(`✅ Selected: ${displayName}`); + return this.getLocalTemplatePayload(selectedTemplate.path); + } + + // Fallback (should not happen) + this.log('â„šī¸ Template not found. Using static example as fallback.'); + return TemplateEval.getStaticPayload(); + } + + private getLocalTemplatePayload(templatePath: string): { + template: TemplateInfo; + payload: TransformationPayload; + } { + // For now, return static payload but indicate it's from local template + // TODO: Parse actual template files + const templateName = templatePath.split('/').pop() ?? 'Unknown Template'; + + this.log(`âš ī¸ Local template parsing not yet implemented. Using static rules for: ${templateName}`); + + return { + template: { + name: templateName, + path: templatePath, + source: 'local', + }, + payload: TemplateEval.getStaticPayload().payload, + }; + } + + private async getDirectFilePayload( + documentFile: string, + valuesFile?: string, + definitionFile?: string + ): Promise<{ + template: TemplateInfo; + payload: TransformationPayload; + }> { + this.log(`📄 Loading document: ${documentFile}`); + + // Read and parse the document file + const documentContent = await fs.readFile(documentFile, 'utf8'); + const document = JSON.parse(documentContent) as unknown; + + // Read values file if provided, otherwise use empty object + let values = { Variables: { hello: 'world' } }; + if (valuesFile) { + this.log(`📊 Loading values: ${valuesFile}`); + const valuesContent = await fs.readFile(valuesFile, 'utf8'); + values = JSON.parse(valuesContent) as typeof values; + } + + // Read definition file if provided, otherwise use empty rules + let definition = { rules: [] }; + if (definitionFile) { + this.log(`âš™ī¸ Loading definition: ${definitionFile}`); + const definitionContent = await fs.readFile(definitionFile, 'utf8'); + definition = JSON.parse(definitionContent) as typeof definition; + } + + return { + template: { + name: 'Direct Files', + path: documentFile, + source: 'local' as const, + }, + payload: { + document: document as TransformationPayload['document'], + values: values as TransformationPayload['values'], + definition: definition as TransformationPayload['definition'], + }, + }; + } +} diff --git a/src/utils/template/localTemplateDetector.ts b/src/utils/template/localTemplateDetector.ts new file mode 100644 index 0000000..a0e9eda --- /dev/null +++ b/src/utils/template/localTemplateDetector.ts @@ -0,0 +1,141 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as fs from 'node:fs/promises'; +import * as path from 'node:path'; + +export type LocalTemplate = { + name: string; + label?: string; + description?: string; + path: string; + templateInfo?: TemplateInfo; +}; + +export type TemplateInfo = { + name: string; + label?: string; + description?: string; + templateType?: string; + variableDefinition?: string; + layoutDefinition?: string; + rules?: Array<{ + type: string; + file: string; + }>; + chainDefinitions?: Array<{ + type: string; + name?: string; + file: string; + }>; +}; + +export class LocalTemplateDetector { + private readonly TEMPLATE_PATHS = ['force-app/main/default/appTemplates', 'src/appTemplates']; + + /** + * Check if a path exists + */ + private static async pathExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } + } + + /** + * Read and parse template-info.json + */ + private static async readTemplateInfo(templateInfoPath: string): Promise { + try { + const exists = await LocalTemplateDetector.pathExists(templateInfoPath); + if (!exists) return null; + + const content = await fs.readFile(templateInfoPath, 'utf8'); + const parsed = JSON.parse(content) as TemplateInfo; + return parsed; + } catch (error) { + return null; + } + } + + /** + * Analyze a template directory to extract metadata + */ + private static async analyzeTemplate(templatePath: string, dirName: string): Promise { + try { + // Check if this is actually a directory + const stat = await fs.stat(templatePath); + if (!stat.isDirectory()) return null; + + // Look for template-info.json + const templateInfoPath = path.join(templatePath, 'template-info.json'); + const templateInfo = await LocalTemplateDetector.readTemplateInfo(templateInfoPath); + + return { + name: templateInfo?.name ?? dirName, + label: templateInfo?.label, + description: templateInfo?.description, + path: templatePath, + templateInfo: templateInfo ?? undefined, + }; + } catch (error) { + return null; + } + } + + /** + * Discover all local templates in standard SFDX project paths + */ + public async discoverLocalTemplates(projectRoot?: string): Promise { + const baseDir = projectRoot ?? process.cwd(); + + // Process all template paths concurrently + const pathPromises = this.TEMPLATE_PATHS.map(async (basePath) => { + const fullBasePath = path.join(baseDir, basePath); + + try { + const exists = await LocalTemplateDetector.pathExists(fullBasePath); + if (!exists) return []; + + const templateDirs = await fs.readdir(fullBasePath); + + // Analyze all templates in parallel + const templatePromises = templateDirs.map(async (templateDir) => { + const templatePath = path.join(fullBasePath, templateDir); + return LocalTemplateDetector.analyzeTemplate(templatePath, templateDir); + }); + + const templateResults = await Promise.all(templatePromises); + return templateResults.filter((template): template is LocalTemplate => template !== null); + } catch (error) { + // Silently skip inaccessible paths + return []; + } + }); + + const allTemplateResults = await Promise.all(pathPromises); + const templates = allTemplateResults.flat(); + + return templates.sort((a, b) => (a.label ?? a.name).localeCompare(b.label ?? b.name)); + } + + /** + * Read and parse template-info.json + */ +} diff --git a/test/commands/template/preview.test.ts b/test/commands/template/preview.test.ts new file mode 100644 index 0000000..5eee5a7 --- /dev/null +++ b/test/commands/template/preview.test.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { TestContext } from '@salesforce/core/testSetup'; +import { expect } from 'chai'; +import TemplateEval from '../../../src/commands/orchestrator/template/eval.js'; + +describe('template eval', () => { + const $$ = new TestContext(); + + afterEach(() => { + $$.restore(); + }); + + it('should exist and be importable', async () => { + expect(TemplateEval).to.exist; + }); +}); diff --git a/yarn.lock b/yarn.lock index dbf63a9..4a8e4c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -93,7 +93,7 @@ "@aws-sdk/client-cloudfront@^3.893.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.896.0.tgz#c6561a4951c98eb6c8be9df1bc1fe8b57b2883ed" + resolved "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.896.0.tgz" integrity sha512-IUSFVRXz1KiQ+WuBI1oJfbrhi+iBWIRU3U/Zt+ttQR8muB//vrcBNuUWOObPdBNh4X8xgnpfmxiyMzHvWzRIZA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -141,7 +141,7 @@ "@aws-sdk/client-s3@^3.888.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.893.0.tgz#f67643e9dbec34377f62b0159c81543b284d07f6" + resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.893.0.tgz" integrity sha512-/P74KDJhOijnIAQR93sq1DQn8vbU3WaPZDyy1XUMRJJIY6iEJnDo1toD9XY6AFDz5TRto8/8NbcXT30AMOUtJQ== dependencies: "@aws-crypto/sha1-browser" "5.2.0" @@ -205,7 +205,7 @@ "@aws-sdk/client-sso@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.893.0.tgz#9ce6e0f08e8c4efc7c2f286c4399d64cb968d1f0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.893.0.tgz" integrity sha512-0+qRGq7H8UNfxI0F02ObyOgOiYxkN4DSlFfwQUQMPfqENDNYOrL++2H9X3EInyc1lUM/+aK8TZqSbh473gdxcg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -249,7 +249,7 @@ "@aws-sdk/client-sso@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.896.0.tgz#a93eb9043e28156345676c5e35035365f67897d9" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.896.0.tgz" integrity sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -293,7 +293,7 @@ "@aws-sdk/core@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.893.0.tgz#afe486bb1ec905a6f73cff99004dd37543986d05" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.893.0.tgz" integrity sha512-E1NAWHOprBXIJ9CVb6oTsRD/tNOozrKBD/Sb4t7WZd3dpby6KpYfM6FaEGfRGcJBIcB4245hww8Rmg16qDMJWg== dependencies: "@aws-sdk/types" "3.893.0" @@ -314,7 +314,7 @@ "@aws-sdk/core@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.896.0.tgz#883360ca8035e0844372370501c62409c0c8ce12" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.896.0.tgz" integrity sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA== dependencies: "@aws-sdk/types" "3.893.0" @@ -333,7 +333,7 @@ "@aws-sdk/credential-provider-env@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.893.0.tgz#89931e281c5e9c08f6f107bbb89c86a79334d070" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.893.0.tgz" integrity sha512-h4sYNk1iDrSZQLqFfbuD1GWY6KoVCvourfqPl6JZCYj8Vmnox5y9+7taPxwlU2VVII0hiV8UUbO79P35oPBSyA== dependencies: "@aws-sdk/core" "3.893.0" @@ -344,7 +344,7 @@ "@aws-sdk/credential-provider-env@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.896.0.tgz#f385c8395fee16abdda5f73c391dee78dd326157" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.896.0.tgz" integrity sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg== dependencies: "@aws-sdk/core" "3.896.0" @@ -355,7 +355,7 @@ "@aws-sdk/credential-provider-http@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.893.0.tgz#b3c34d88203c0ae59b71a16435f471f9bbe81c5f" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.893.0.tgz" integrity sha512-xYoC7DRr++zWZ9jG7/hvd6YjCbGDQzsAu2fBHHf91RVmSETXUgdEaP9rOdfCM02iIK/MYlwiWEIVBcBxWY/GQw== dependencies: "@aws-sdk/core" "3.893.0" @@ -371,7 +371,7 @@ "@aws-sdk/credential-provider-http@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.896.0.tgz#4715b4205c42c4adf0b6efb3e228639f1e038802" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.896.0.tgz" integrity sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA== dependencies: "@aws-sdk/core" "3.896.0" @@ -387,7 +387,7 @@ "@aws-sdk/credential-provider-ini@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.893.0.tgz#617754f4c23e83baf8f1720e3824bfdc102a0f92" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.893.0.tgz" integrity sha512-ZQWOl4jdLhJHHrHsOfNRjgpP98A5kw4YzkMOUoK+TgSQVLi7wjb957V0htvwpi6KmGr3f2F8J06D6u2OtIc62w== dependencies: "@aws-sdk/core" "3.893.0" @@ -406,7 +406,7 @@ "@aws-sdk/credential-provider-ini@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.896.0.tgz#8e4eaa85ad10ce5988381ee19f6bf96d14cbcab0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.896.0.tgz" integrity sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA== dependencies: "@aws-sdk/core" "3.896.0" @@ -425,7 +425,7 @@ "@aws-sdk/credential-provider-node@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.893.0.tgz#e8d1bb203e8fb14dcac4f9d573db649320528631" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.893.0.tgz" integrity sha512-NjvDUXciC2+EaQnbL/u/ZuCXj9PZQ/9ciPhI62LGCoJ3ft91lI1Z58Dgut0OFPpV6i16GhpFxzmbuf40wTgDbA== dependencies: "@aws-sdk/credential-provider-env" "3.893.0" @@ -443,7 +443,7 @@ "@aws-sdk/credential-provider-node@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.896.0.tgz#6b25a92b18d051d04b88d31ed36ff5025cfe7c10" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.896.0.tgz" integrity sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw== dependencies: "@aws-sdk/credential-provider-env" "3.896.0" @@ -461,7 +461,7 @@ "@aws-sdk/credential-provider-process@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.893.0.tgz#83a09fcf58a917977e5d0d9765d09c9bbdeced9c" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.893.0.tgz" integrity sha512-5XitkZdiQhjWJV71qWqrH7hMXwuK/TvIRwiwKs7Pj0sapGSk3YgD3Ykdlolz7sQOleoKWYYqgoq73fIPpTTmFA== dependencies: "@aws-sdk/core" "3.893.0" @@ -473,7 +473,7 @@ "@aws-sdk/credential-provider-process@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.896.0.tgz#008a1e09f7d276336bead54a9b7572ab2a7b8b3e" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.896.0.tgz" integrity sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ== dependencies: "@aws-sdk/core" "3.896.0" @@ -485,7 +485,7 @@ "@aws-sdk/credential-provider-sso@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.893.0.tgz#738b6583512538a5c7db4636a2aa705bb48f50f1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.893.0.tgz" integrity sha512-ms8v13G1r0aHZh5PLcJu6AnQZPs23sRm3Ph0A7+GdqbPvWewP8M7jgZTKyTXi+oYXswdYECU1zPVur8zamhtLg== dependencies: "@aws-sdk/client-sso" "3.893.0" @@ -499,7 +499,7 @@ "@aws-sdk/credential-provider-sso@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.896.0.tgz#78609a50ed292675b691fef11f87281f4d844ad4" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.896.0.tgz" integrity sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA== dependencies: "@aws-sdk/client-sso" "3.896.0" @@ -513,7 +513,7 @@ "@aws-sdk/credential-provider-web-identity@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.893.0.tgz#3c0b00127755b6a760c87742fd2d3c22473fdae0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.893.0.tgz" integrity sha512-wWD8r2ot4jf/CoogdPTl13HbwNLW4UheGUCu6gW7n9GoHh1JImYyooPHK8K7kD42hihydIA7OW7iFAf7//JYTw== dependencies: "@aws-sdk/core" "3.893.0" @@ -526,7 +526,7 @@ "@aws-sdk/credential-provider-web-identity@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.896.0.tgz#b80271e417bd2f26f349bec5a718301a16af9772" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.896.0.tgz" integrity sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g== dependencies: "@aws-sdk/core" "3.896.0" @@ -539,7 +539,7 @@ "@aws-sdk/middleware-bucket-endpoint@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.893.0.tgz#cf1b55edd6eb48a5e02cae57eddb2e467bb8ecd5" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.893.0.tgz" integrity sha512-H+wMAoFC73T7M54OFIezdHXR9/lH8TZ3Cx1C3MEBb2ctlzQrVCd8LX8zmOtcGYC8plrRwV+8rNPe0FMqecLRew== dependencies: "@aws-sdk/types" "3.893.0" @@ -552,7 +552,7 @@ "@aws-sdk/middleware-expect-continue@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.893.0.tgz#af9e96f24d9323afe833db1e6c03a7791a24dd09" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.893.0.tgz" integrity sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA== dependencies: "@aws-sdk/types" "3.893.0" @@ -562,7 +562,7 @@ "@aws-sdk/middleware-flexible-checksums@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.893.0.tgz#5aedb154ddd9f9662b411d9d065895275b630670" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.893.0.tgz" integrity sha512-2swRPpyGK6xpZwIFmmFSFKp10iuyBLZEouhrt1ycBVA8iHGmPkuJSCim6Vb+JoRKqINp5tizWeQwdg9boIxJPw== dependencies: "@aws-crypto/crc32" "5.2.0" @@ -581,7 +581,7 @@ "@aws-sdk/middleware-host-header@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz#1a4b14c11cff158b383e2b859be5c468d2c2c162" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz" integrity sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ== dependencies: "@aws-sdk/types" "3.893.0" @@ -591,7 +591,7 @@ "@aws-sdk/middleware-location-constraint@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.893.0.tgz#4c032b7b4f7dab699ca78a47054551fd8e18dfb3" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.893.0.tgz" integrity sha512-MlbBc7Ttb1ekbeeeFBU4DeEZOLb5s0Vl4IokvO17g6yJdLk4dnvZro9zdXl3e7NXK+kFxHRBFZe55p/42mVgDA== dependencies: "@aws-sdk/types" "3.893.0" @@ -600,7 +600,7 @@ "@aws-sdk/middleware-logger@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz#4ecb20ee0771a2f3afdc07c1310b97251d3854e2" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz" integrity sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA== dependencies: "@aws-sdk/types" "3.893.0" @@ -609,7 +609,7 @@ "@aws-sdk/middleware-recursion-detection@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz#9fde6f10e72fcbd8ce4f0eea629c07ca64ce86ba" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz" integrity sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg== dependencies: "@aws-sdk/types" "3.893.0" @@ -620,7 +620,7 @@ "@aws-sdk/middleware-sdk-s3@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.893.0.tgz#2a49a828ddaad026348e40a0bd00b9959ebf81c1" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.893.0.tgz" integrity sha512-J2v7jOoSlE4o416yQiuka6+cVJzyrU7mbJEQA9VFCb+TYT2cG3xQB0bDzE24QoHeonpeBDghbg/zamYMnt+GsQ== dependencies: "@aws-sdk/core" "3.893.0" @@ -640,7 +640,7 @@ "@aws-sdk/middleware-ssec@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.893.0.tgz#34ebc4e834d6412a64ce85376d7712a996b2d4db" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.893.0.tgz" integrity sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg== dependencies: "@aws-sdk/types" "3.893.0" @@ -649,7 +649,7 @@ "@aws-sdk/middleware-user-agent@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.893.0.tgz#b6175e4df8d6bf85fb01fafab5b2794b345b32c8" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.893.0.tgz" integrity sha512-n1vHj7bdC4ycIAKkny0rmgvgvGOIgYnGBAqfPAFPR26WuGWmCxH2cT9nQTNA+li8ofxX9F9FIFBTKkW92Pc8iQ== dependencies: "@aws-sdk/core" "3.893.0" @@ -662,7 +662,7 @@ "@aws-sdk/middleware-user-agent@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.896.0.tgz#be459f4b652e200cfded484f87353ac69fbef69f" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.896.0.tgz" integrity sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ== dependencies: "@aws-sdk/core" "3.896.0" @@ -675,7 +675,7 @@ "@aws-sdk/nested-clients@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.893.0.tgz#96d469503c4bcbc41cda4e7a9f10b3096238ce26" + resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.893.0.tgz" integrity sha512-HIUCyNtWkxvc0BmaJPUj/A0/29OapT/dzBNxr2sjgKNZgO81JuDFp+aXCmnf7vQoA2D1RzCsAIgEtfTExNFZqA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -719,7 +719,7 @@ "@aws-sdk/nested-clients@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.896.0.tgz#5fb0f31ca8a4a26d92b812e946e068d9b3c63bc6" + resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.896.0.tgz" integrity sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" @@ -763,7 +763,7 @@ "@aws-sdk/region-config-resolver@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz#570dfd2314b3f71eb263557bb06fea36b5188cd6" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz" integrity sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q== dependencies: "@aws-sdk/types" "3.893.0" @@ -775,7 +775,7 @@ "@aws-sdk/signature-v4-multi-region@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.893.0.tgz#dc68ffa431db24791d4c1faf458b651093001de9" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.893.0.tgz" integrity sha512-pp4Bn8dL4i68P/mHgZ7sgkm8OSIpwjtGxP73oGseu9Cli0JRyJ1asTSsT60hUz3sbo+3oKk3hEobD6UxLUeGRA== dependencies: "@aws-sdk/middleware-sdk-s3" "3.893.0" @@ -787,7 +787,7 @@ "@aws-sdk/token-providers@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.893.0.tgz#f4e08f1837f3a103a60c3c2261a48a66103e19bb" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.893.0.tgz" integrity sha512-nkzuE910TxW4pnIwJ+9xDMx5m+A8iXGM16Oa838YKsds07cgkRp7sPnpH9B8NbGK2szskAAkXfj7t1f59EKd1Q== dependencies: "@aws-sdk/core" "3.893.0" @@ -800,7 +800,7 @@ "@aws-sdk/token-providers@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.896.0.tgz#760cdca947129cd422ca636218addefffa932420" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.896.0.tgz" integrity sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw== dependencies: "@aws-sdk/core" "3.896.0" @@ -813,7 +813,7 @@ "@aws-sdk/types@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.893.0.tgz#1afbdb9d62bf86caeac380e3cac11a051076400a" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.893.0.tgz" integrity sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg== dependencies: "@smithy/types" "^4.5.0" @@ -829,14 +829,14 @@ "@aws-sdk/util-arn-parser@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz#fcc9b792744b9da597662891c2422dda83881d8d" + resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz" integrity sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA== dependencies: tslib "^2.6.2" "@aws-sdk/util-endpoints@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.893.0.tgz#786874ece0b9daf3d75e2e0995de3830d56712ed" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.893.0.tgz" integrity sha512-xeMcL31jXHKyxRwB3oeNjs8YEpyvMnSYWr2OwLydgzgTr0G349AHlJHwYGCF9xiJ2C27kDxVvXV/Hpdp0p7TWw== dependencies: "@aws-sdk/types" "3.893.0" @@ -847,7 +847,7 @@ "@aws-sdk/util-endpoints@3.895.0": version "3.895.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz#d3881250cecc40fa9d721a33661c1aaa64aba643" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz" integrity sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg== dependencies: "@aws-sdk/types" "3.893.0" @@ -865,7 +865,7 @@ "@aws-sdk/util-user-agent-browser@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz#be0aac5c73a30c2a03aedb2e3501bb277bad79a1" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz" integrity sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w== dependencies: "@aws-sdk/types" "3.893.0" @@ -875,7 +875,7 @@ "@aws-sdk/util-user-agent-node@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.893.0.tgz#19c1660f92630611435cba42a199e7cf9598523e" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.893.0.tgz" integrity sha512-tTRkJo/fth9NPJ2AO/XLuJWVsOhbhejQRLyP0WXG3z0Waa5IWK5YBxBC1tWWATUCwsN748JQXU03C1aF9cRD9w== dependencies: "@aws-sdk/middleware-user-agent" "3.893.0" @@ -886,7 +886,7 @@ "@aws-sdk/util-user-agent-node@3.896.0": version "3.896.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.896.0.tgz#190a8aa7ffae3f8d29bacdd3835b901daf116195" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.896.0.tgz" integrity sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w== dependencies: "@aws-sdk/middleware-user-agent" "3.896.0" @@ -897,7 +897,7 @@ "@aws-sdk/xml-builder@3.893.0": version "3.893.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.893.0.tgz#6f91bd81462ad8a2ee1c563ba38b026b11414cd2" + resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.893.0.tgz" integrity sha512-qKkJ2E0hU60iq0o2+hBSIWS8sf34xhqiRRGw5nbRhwEnE2MsWsWBpRoysmr32uq9dHMWUzII0c/fS29+wOSdMA== dependencies: "@smithy/types" "^4.5.0" @@ -905,7 +905,7 @@ "@aws-sdk/xml-builder@3.894.0": version "3.894.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz#7110e86622345d3da220a2ed5259a30a91dec4bc" + resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz" integrity sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA== dependencies: "@smithy/types" "^4.5.0" @@ -914,7 +914,7 @@ "@aws/lambda-invoke-store@^0.0.1": version "0.0.1" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz#92d792a7dda250dfcb902e13228f37a81be57c8f" + resolved "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz" integrity sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": @@ -1342,12 +1342,17 @@ "@inquirer/ansi@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.0.tgz#29525c673caf36c12e719712830705b9c31f0462" + resolved "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz" integrity sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA== +"@inquirer/ansi@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.1.tgz" + integrity sha512-QAZUk6BBncv/XmSEZTscd8qazzjV3E0leUMrEPjxCd51QBgCKmprUGLex5DTsNtURm7LMzv+CLcd6S86xvBfYg== + "@inquirer/checkbox@^4.2.4": version "4.2.4" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.2.4.tgz#efa6f280477a0821c610e502b1c80f167f17ba2e" + resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz" integrity sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw== dependencies: "@inquirer/ansi" "^1.0.0" @@ -1366,7 +1371,7 @@ "@inquirer/confirm@^5.1.18": version "5.1.18" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.18.tgz#0b76e5082d834c0e3528023705b867fc1222d535" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz" integrity sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw== dependencies: "@inquirer/core" "^10.2.2" @@ -1374,7 +1379,7 @@ "@inquirer/core@^10.2.2": version "10.2.2" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.2.2.tgz#d31eb50ba0c76b26e7703c2c0d1d0518144c23ab" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz" integrity sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA== dependencies: "@inquirer/ansi" "^1.0.0" @@ -1386,6 +1391,19 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" +"@inquirer/core@^11.0.1": + version "11.0.1" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-11.0.1.tgz" + integrity sha512-Tpf49h50e4KYffVUCXzkx4gWMafUi3aDQDwfVAAGBNnVcXiwJIj4m2bKlZ7Kgyf6wjt1eyXH1wDGXcAokm4Ssw== + dependencies: + "@inquirer/ansi" "^2.0.1" + "@inquirer/figures" "^2.0.1" + "@inquirer/type" "^4.0.1" + cli-width "^4.1.0" + mute-stream "^3.0.0" + signal-exit "^4.1.0" + wrap-ansi "^9.0.2" + "@inquirer/core@^9.0.8", "@inquirer/core@^9.1.0": version "9.1.0" resolved "https://registry.npmjs.org/@inquirer/core/-/core-9.1.0.tgz" @@ -1407,7 +1425,7 @@ "@inquirer/editor@^4.2.20": version "4.2.20" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.20.tgz#25c3ceeaed91f62135832c3792c650b4d8102dc7" + resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz" integrity sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g== dependencies: "@inquirer/core" "^10.2.2" @@ -1416,7 +1434,7 @@ "@inquirer/expand@^4.0.20": version "4.0.20" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.20.tgz#7c2b542ccd0d0c85428263c6d56308b880b12cb2" + resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz" integrity sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow== dependencies: "@inquirer/core" "^10.2.2" @@ -1425,21 +1443,21 @@ "@inquirer/external-editor@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.2.tgz#dc16e7064c46c53be09918db639ff780718c071a" + resolved "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz" integrity sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ== dependencies: chardet "^2.1.0" iconv-lite "^0.7.0" -"@inquirer/figures@^1.0.13": +"@inquirer/figures@^1.0.13", "@inquirer/figures@^1.0.5": version "1.0.13" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.13.tgz#ad0afd62baab1c23175115a9b62f511b6a751e45" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz" integrity sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw== -"@inquirer/figures@^1.0.5": - version "1.0.11" - resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz" - integrity sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw== +"@inquirer/figures@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.1.tgz" + integrity sha512-KtMxyjLCuDFqAWHmCY9qMtsZ09HnjMsm8H3OvpSIpfhHdfw3/AiGWHNrfRwbyvHPtOJpumm8wGn5fkhtvkWRsg== "@inquirer/input@^2.2.4": version "2.2.7" @@ -1451,7 +1469,7 @@ "@inquirer/input@^4.2.4": version "4.2.4" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.2.4.tgz#8a8b79c9fe31cc036082404b26b601cca0cb6f30" + resolved "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz" integrity sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw== dependencies: "@inquirer/core" "^10.2.2" @@ -1459,7 +1477,7 @@ "@inquirer/number@^3.0.20": version "3.0.20" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.20.tgz#bfbc9cfd5f2730d86036ef124ec151fbd5ea669b" + resolved "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz" integrity sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg== dependencies: "@inquirer/core" "^10.2.2" @@ -1476,7 +1494,7 @@ "@inquirer/password@^4.0.20": version "4.0.20" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.20.tgz#931c2a321cc09a63d790199702d3930a3e864830" + resolved "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz" integrity sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug== dependencies: "@inquirer/ansi" "^1.0.0" @@ -1485,7 +1503,7 @@ "@inquirer/prompts@^7.8.4": version "7.8.6" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.8.6.tgz#697e411535ae3b37a25fb35774ecf4d53a0e9f92" + resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.6.tgz" integrity sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig== dependencies: "@inquirer/checkbox" "^4.2.4" @@ -1501,7 +1519,7 @@ "@inquirer/rawlist@^4.1.8": version "4.1.8" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.8.tgz#a254a385b715a133dcf42a31161aee8827846a53" + resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz" integrity sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg== dependencies: "@inquirer/core" "^10.2.2" @@ -1510,7 +1528,7 @@ "@inquirer/search@^3.1.3": version "3.1.3" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.1.3.tgz#3a4d725c596617ab9a516906fea9d8347ea5c28f" + resolved "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz" integrity sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q== dependencies: "@inquirer/core" "^10.2.2" @@ -1531,7 +1549,7 @@ "@inquirer/select@^4.3.4": version "4.3.4" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.3.4.tgz#e50e0c2539631ba93e26adc225a9e0e232883833" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz" integrity sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA== dependencies: "@inquirer/ansi" "^1.0.0" @@ -1540,6 +1558,16 @@ "@inquirer/type" "^3.0.8" yoctocolors-cjs "^2.1.2" +"@inquirer/select@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-5.0.1.tgz" + integrity sha512-gPByrgYoezGyKMq5KjV7Tuy1JU2ArIy6/sI8sprw0OpXope3VGQwP5FK1KD4eFFqEhKu470Dwe6/AyDPmGRA0Q== + dependencies: + "@inquirer/ansi" "^2.0.1" + "@inquirer/core" "^11.0.1" + "@inquirer/figures" "^2.0.1" + "@inquirer/type" "^4.0.1" + "@inquirer/type@^1.5.1", "@inquirer/type@^1.5.3": version "1.5.3" resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.5.3.tgz" @@ -1549,9 +1577,14 @@ "@inquirer/type@^3.0.8": version "3.0.8" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.8.tgz#efc293ba0ed91e90e6267f1aacc1c70d20b8b4e8" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz" integrity sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw== +"@inquirer/type@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-4.0.1.tgz" + integrity sha512-odO8YwoQAw/eVu/PSPsDDVPmqO77r/Mq7zcoF5VduVqIu2wSRWUgmYb5K9WH1no0SjLnOe8MDKtDL++z6mfo2g== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" @@ -1622,7 +1655,7 @@ "@jsforce/jsforce-node@^3.10.4": version "3.10.4" - resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.10.4.tgz#8241205d03993de8dc3266bda164c7898b17c86e" + resolved "https://registry.npmjs.org/@jsforce/jsforce-node/-/jsforce-node-3.10.4.tgz" integrity sha512-do5a2GfvlctifYL4q41WvHiLtVFfk/eUyVsJw0mkyX+mgSg9KXLOrsXK4zpZPcIa+HUJ+ccF6fDs/vwkXlZ3tQ== dependencies: "@sindresorhus/is" "^4" @@ -1638,22 +1671,22 @@ "@jsonjoy.com/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz" integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== "@jsonjoy.com/buffers@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz#ade6895b7d3883d70f87b5743efaa12c71dfef7a" + resolved "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz" integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q== "@jsonjoy.com/codegen@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" + resolved "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz" integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== "@jsonjoy.com/json-pack@^1.0.3": version "1.10.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.10.0.tgz#d098b0164512889f18269e373407c4b5a46f3ee2" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.10.0.tgz" integrity sha512-PMOU9Sh0baiLZEDewwR/YAHJBV2D8pPIzcFQSU7HQl/k/HNCDyVfO1OvkyDwBGp4dPtvZc7Hl9FFYWwTP1CbZw== dependencies: "@jsonjoy.com/base64" "^1.1.2" @@ -1666,14 +1699,14 @@ "@jsonjoy.com/json-pointer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.1.tgz#3b710158e8a212708a2886ea5e38d92e2ea4f4a0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.1.tgz" integrity sha512-tJpwQfuBuxqZlyoJOSZcqf7OUmiYQ6MiPNmOv4KbZdXE/DdvBSSAwhos0zIlJU/AXxC8XpuO8p08bh2fIl+RKA== dependencies: "@jsonjoy.com/util" "^1.3.0" "@jsonjoy.com/util@^1.3.0", "@jsonjoy.com/util@^1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" + resolved "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz" integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== dependencies: "@jsonjoy.com/buffers" "^1.0.0" @@ -1702,7 +1735,7 @@ "@oclif/core@^4", "@oclif/core@^4.0.27", "@oclif/core@^4.5.2", "@oclif/core@^4.5.3", "@oclif/core@^4.5.4": version "4.5.4" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.5.4.tgz#d82bf4516d1e8a210aab4ccde826a0ce6cadf514" + resolved "https://registry.npmjs.org/@oclif/core/-/core-4.5.4.tgz" integrity sha512-78YYJls8+KG96tReyUsesKKIKqC0qbFSY1peUSrt0P2uGsrgAuU9axQ0iBQdhAlIwZDcTyaj+XXVQkz2kl/O0w== dependencies: ansi-escapes "^4.3.2" @@ -1726,7 +1759,7 @@ "@oclif/plugin-command-snapshot@^5.3.6": version "5.3.6" - resolved "https://registry.yarnpkg.com/@oclif/plugin-command-snapshot/-/plugin-command-snapshot-5.3.6.tgz#fa9786279b532d8a0c6add51717dd8ea9fc520c9" + resolved "https://registry.npmjs.org/@oclif/plugin-command-snapshot/-/plugin-command-snapshot-5.3.6.tgz" integrity sha512-0uu1KoB5IvS79l7Ao92vUmVHh9eWqP5uWv4oD7aeNFmUnCQrTB8nhdclP2E6MqMoatB6C0Xv+TXWC/ISLqBu3A== dependencies: "@oclif/core" "^4" @@ -1741,14 +1774,14 @@ "@oclif/plugin-help@^6.2.32": version "6.2.32" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.32.tgz#b903d845b271737811383fed879cf6c379bf23fa" + resolved "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.32.tgz" integrity sha512-LrmMdo9EMJciOvF8UurdoTcTMymv5npKtxMAyonZvhSvGR8YwCKnuHIh00+SO2mNtGOYam7f4xHnUmj2qmanyA== dependencies: "@oclif/core" "^4" "@oclif/plugin-not-found@^3.2.68": version "3.2.68" - resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.68.tgz#a55beabf394c47dbbd0cc06f2b1317e816c61397" + resolved "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.68.tgz" integrity sha512-Uv0AiXESEwrIbfN1IA68lcw4/7/L+Z3nFHMHG03jjDXHTVOfpTZDaKyPx/6rf2AL/CIhQQxQF3foDvs6psS3tA== dependencies: "@inquirer/prompts" "^7.8.4" @@ -1758,7 +1791,7 @@ "@oclif/plugin-warn-if-update-available@^3.1.46": version "3.1.46" - resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.46.tgz#21593b68f3876021c26841993c17ac82aa18e179" + resolved "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.46.tgz" integrity sha512-YDlr//SHmC80eZrt+0wNFWSo1cOSU60RoWdhSkAoPB3pUGPSNHZDquXDpo7KniinzYPsj1rfetCYk7UVXwYu7A== dependencies: "@oclif/core" "^4" @@ -1770,7 +1803,7 @@ "@oclif/table@^0.4.12": version "0.4.12" - resolved "https://registry.yarnpkg.com/@oclif/table/-/table-0.4.12.tgz#070c6fc474d3f6b5cb6924c55931fe51ab79c69b" + resolved "https://registry.npmjs.org/@oclif/table/-/table-0.4.12.tgz" integrity sha512-CrdJBBmil38o6K5QY+vuOovfG3A6q9nFIAISpNOoOnSSiA81s/xfZ/T4E0z7coDvYnz6wJCTMc2ObqaxBZfbHg== dependencies: "@types/react" "^18.3.12" @@ -1811,7 +1844,7 @@ "@salesforce/cli-plugins-testkit@^5.3.41": version "5.3.41" - resolved "https://registry.yarnpkg.com/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.41.tgz#16acca933dcd64f0fd2c917c7b22529107f373e6" + resolved "https://registry.npmjs.org/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.41.tgz" integrity sha512-K6fZfvzJAb0WFJFlgyIHgLyWLXR7i2SKDZ069kvCmDN0QVfftp/OwYrtosIzxiXdpHOtcoAkt65M1UR1aw0XzA== dependencies: "@salesforce/core" "^8.8.0" @@ -1827,7 +1860,7 @@ "@salesforce/core@^8.18.7", "@salesforce/core@^8.19.1", "@salesforce/core@^8.22.0", "@salesforce/core@^8.23.0", "@salesforce/core@^8.5.1", "@salesforce/core@^8.8.0": version "8.23.1" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.23.1.tgz#89e04518d6d4033ef6a248380eb952328068797c" + resolved "https://registry.npmjs.org/@salesforce/core/-/core-8.23.1.tgz" integrity sha512-/mQMu6g0gmkKQsl+G93VkkU+yrLEjnBzdUu0sPlS0WY5jM4M9sxg97LmRXa6dchECU3c/ugamsXaP6j6QmEfsQ== dependencies: "@jsforce/jsforce-node" "^3.10.4" @@ -1857,7 +1890,7 @@ "@salesforce/dev-scripts@^11.0.2": version "11.0.2" - resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-11.0.2.tgz#1cf59516c7b24e44363daa5bf976909dc208d52b" + resolved "https://registry.npmjs.org/@salesforce/dev-scripts/-/dev-scripts-11.0.2.tgz" integrity sha512-+s/2B0ln4ZDwIuMUUHEmqYdvjjAnpVTSCkF1o2spJ+/a6zpLYIuCRfylz19OhwKXX6kxViziDlaB/+7b5ok6XA== dependencies: "@commitlint/cli" "^17.1.2" @@ -1889,14 +1922,14 @@ "@salesforce/kit@^3.2.1", "@salesforce/kit@^3.2.3", "@salesforce/kit@^3.2.4": version "3.2.4" - resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-3.2.4.tgz#69fb56974685e41d26ae5db30a7261acdc731bb6" + resolved "https://registry.npmjs.org/@salesforce/kit/-/kit-3.2.4.tgz" integrity sha512-9buqZ2puIGWqjUFWYNroSeNih4d1s9kdQAzZfutr/Re/JMl6xBct0ATO5LVb1ty5UhdBruJrVaiTg03PqVKU+Q== dependencies: "@salesforce/ts-types" "^2.0.12" "@salesforce/plugin-command-reference@^3.1.72": version "3.1.72" - resolved "https://registry.yarnpkg.com/@salesforce/plugin-command-reference/-/plugin-command-reference-3.1.72.tgz#cfd03311c2a0d1dc3083d1ebf59ce9b9175626c3" + resolved "https://registry.npmjs.org/@salesforce/plugin-command-reference/-/plugin-command-reference-3.1.72.tgz" integrity sha512-/i4F7u16M3IT4oh3w7uYQM6Lk6cGsHldtcz+sV+uNKdFoYK3ikcEt1dX/RSXhm9SHMFGzcbhvDwGFZpGrHvplw== dependencies: "@oclif/core" "^4" @@ -1915,7 +1948,7 @@ "@salesforce/schemas@^1.10.0": version "1.10.3" - resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.10.3.tgz#52c867fdd60679cf216110aa49542b7ad391f5d1" + resolved "https://registry.npmjs.org/@salesforce/schemas/-/schemas-1.10.3.tgz" integrity sha512-FKfvtrYTcvTXE9advzS25/DEY9yJhEyLvStm++eQFtnAaX1pe4G3oGHgiQ0q55BM5+0AlCh0+0CVtQv1t4oJRA== "@salesforce/sf-plugins-core@^11.3.12": @@ -1938,7 +1971,7 @@ "@salesforce/sf-plugins-core@^12": version "12.2.4" - resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-12.2.4.tgz#a89ddcbac6520870eb2e0aad2a2e78738441cedf" + resolved "https://registry.npmjs.org/@salesforce/sf-plugins-core/-/sf-plugins-core-12.2.4.tgz" integrity sha512-AwfhPxIJfzQUSZH8kiQOjRPOsfhO3CL+PKq0lfX+chdqwLOnXWviYCA1Z815MGG0ot/XMlsyj7CS+JxQ19Tn4A== dependencies: "@inquirer/confirm" "^3.1.22" @@ -2039,7 +2072,7 @@ "@smithy/abort-controller@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.1.1.tgz#9b3872ab6b2c061486175c281dadc0a853260533" + resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.1.tgz" integrity sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg== dependencies: "@smithy/types" "^4.5.0" @@ -2047,7 +2080,7 @@ "@smithy/chunked-blob-reader-native@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.1.0.tgz#4d814dd07ebb1f579daf51671945389f9772400f" + resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.1.0.tgz" integrity sha512-Bnv0B3nSlfB2mPO0WgM49I/prl7+kamF042rrf3ezJ3Z4C7csPYvyYgZfXTGXwXfj1mAwDWjE/ybIf49PzFzvA== dependencies: "@smithy/util-base64" "^4.1.0" @@ -2055,14 +2088,14 @@ "@smithy/chunked-blob-reader@^5.1.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.1.0.tgz#48fa62c85b146be2a06525f0457ce58a46d69ab0" + resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.1.0.tgz" integrity sha512-a36AtR7Q7XOhRPt6F/7HENmTWcB8kN7mDJcOFM/+FuKO6x88w8MQJfYCufMWh4fGyVkPjUh3Rrz/dnqFQdo6OQ== dependencies: tslib "^2.6.2" "@smithy/config-resolver@^4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.2.2.tgz#3f6a3c163f9b5b7f852d7d1817bc9e3b2136fa5f" + resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.2.tgz" integrity sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ== dependencies: "@smithy/node-config-provider" "^4.2.2" @@ -2073,7 +2106,7 @@ "@smithy/core@^3.11.1": version "3.11.1" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.11.1.tgz#670067d5c9e81f860b6d4d1494520ec518b38f43" + resolved "https://registry.npmjs.org/@smithy/core/-/core-3.11.1.tgz" integrity sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA== dependencies: "@smithy/middleware-serde" "^4.1.1" @@ -2090,7 +2123,7 @@ "@smithy/core@^3.12.0", "@smithy/core@^3.13.0": version "3.13.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.13.0.tgz#1abd89e801aa29367e4d9eaa73e74b48965ef045" + resolved "https://registry.npmjs.org/@smithy/core/-/core-3.13.0.tgz" integrity sha512-BI6ALLPOKnPOU1Cjkc+1TPhOlP3JXSR/UH14JmnaLq41t3ma+IjuXrKfhycVjr5IQ0XxRh2NnQo3olp+eCVrGg== dependencies: "@smithy/middleware-serde" "^4.1.1" @@ -2106,7 +2139,7 @@ "@smithy/credential-provider-imds@^4.1.2": version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz#68662c873dbe812c13159cb2be3c4ba8aeb52149" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz" integrity sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg== dependencies: "@smithy/node-config-provider" "^4.2.2" @@ -2117,7 +2150,7 @@ "@smithy/eventstream-codec@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.1.1.tgz#637eb4bceecc3ef588b86c28506439a9cdd7a41f" + resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.1.1.tgz" integrity sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw== dependencies: "@aws-crypto/crc32" "5.2.0" @@ -2127,7 +2160,7 @@ "@smithy/eventstream-serde-browser@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.1.1.tgz#f7df13ebd5a6028b12b496f12eecdd08c4c9b792" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.1.1.tgz" integrity sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA== dependencies: "@smithy/eventstream-serde-universal" "^4.1.1" @@ -2136,7 +2169,7 @@ "@smithy/eventstream-serde-config-resolver@^4.2.1": version "4.2.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.2.1.tgz#77333a110361bfe2749b685d31e01299ede87c40" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.2.1.tgz" integrity sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw== dependencies: "@smithy/types" "^4.5.0" @@ -2144,7 +2177,7 @@ "@smithy/eventstream-serde-node@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.1.1.tgz#635819a756cb8a69a7e3eb91ca9076284ea00939" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.1.1.tgz" integrity sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA== dependencies: "@smithy/eventstream-serde-universal" "^4.1.1" @@ -2153,7 +2186,7 @@ "@smithy/eventstream-serde-universal@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.1.1.tgz#803cdde6a17ac501cc700ce38400caf70715ecb1" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.1.1.tgz" integrity sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA== dependencies: "@smithy/eventstream-codec" "^4.1.1" @@ -2162,7 +2195,7 @@ "@smithy/fetch-http-handler@^5.2.1": version "5.2.1" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz#fe284a00f1b3a35edf9fba454d287b7f74ef20af" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz" integrity sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng== dependencies: "@smithy/protocol-http" "^5.2.1" @@ -2173,7 +2206,7 @@ "@smithy/hash-blob-browser@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.1.1.tgz#fbcab0008b973ccf370c698cd11ec8d9584607c8" + resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.1.1.tgz" integrity sha512-avAtk++s1e/1VODf+rg7c9R2pB5G9y8yaJaGY4lPZI2+UIqVyuSDMikWjeWfBVmFZ3O7NpDxBbUCyGhThVUKWQ== dependencies: "@smithy/chunked-blob-reader" "^5.1.0" @@ -2183,7 +2216,7 @@ "@smithy/hash-node@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.1.1.tgz#86ceca92487492267e944e4f4507106b731e7971" + resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.1.tgz" integrity sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA== dependencies: "@smithy/types" "^4.5.0" @@ -2193,7 +2226,7 @@ "@smithy/hash-stream-node@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.1.1.tgz#1d8e4485fa15c458d7a8248a50d0f5f91705cced" + resolved "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.1.1.tgz" integrity sha512-3ztT4pV0Moazs3JAYFdfKk11kYFDo4b/3R3+xVjIm6wY9YpJf+xfz+ocEnNKcWAdcmSMqi168i2EMaKmJHbJMA== dependencies: "@smithy/types" "^4.5.0" @@ -2202,7 +2235,7 @@ "@smithy/invalid-dependency@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz#2511335ff889944701c7d2a3b1e4a4d6fe9ddfab" + resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz" integrity sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg== dependencies: "@smithy/types" "^4.5.0" @@ -2217,14 +2250,14 @@ "@smithy/is-array-buffer@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz#d18a2f22280e7173633cb91a9bdb6f3d8a6560b8" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz" integrity sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ== dependencies: tslib "^2.6.2" "@smithy/md5-js@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.1.1.tgz#df81396bef83eb17bce531c871af935df986bdfc" + resolved "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.1.1.tgz" integrity sha512-MvWXKK743BuHjr/hnWuT6uStdKEaoqxHAQUvbKJPPZM5ZojTNFI5D+47BoQfBE5RgGlRRty05EbWA+NXDv+hIA== dependencies: "@smithy/types" "^4.5.0" @@ -2233,7 +2266,7 @@ "@smithy/middleware-content-length@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz#eaea7bd14c7a0b64aef87b8c372c2a04d7b9cb72" + resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz" integrity sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w== dependencies: "@smithy/protocol-http" "^5.2.1" @@ -2242,7 +2275,7 @@ "@smithy/middleware-endpoint@^4.2.3": version "4.2.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.3.tgz#6d64026923420971f2da937d6ea642011471f7a5" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.3.tgz" integrity sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg== dependencies: "@smithy/core" "^3.11.1" @@ -2256,7 +2289,7 @@ "@smithy/middleware-endpoint@^4.2.4", "@smithy/middleware-endpoint@^4.2.5": version "4.2.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.5.tgz#6609d3c0f0d20c01dee95971527bf87d9d14c8cc" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.5.tgz" integrity sha512-DdOIpssQ5LFev7hV6GX9TMBW5ChTsQBxqgNW1ZGtJNSAi5ksd5klwPwwMY0ejejfEzwXXGqxgVO3cpaod4veiA== dependencies: "@smithy/core" "^3.13.0" @@ -2270,7 +2303,7 @@ "@smithy/middleware-retry@^4.2.4": version "4.2.4" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.2.4.tgz#16334bf0f5b588a404255f5c827c79bb39888104" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.4.tgz" integrity sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg== dependencies: "@smithy/node-config-provider" "^4.2.2" @@ -2286,7 +2319,7 @@ "@smithy/middleware-retry@^4.3.0": version "4.3.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.3.1.tgz#c879352d1c17188527a9378419cf6d9efbb38405" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.3.1.tgz" integrity sha512-aH2bD1bzb6FB04XBhXA5mgedEZPKx3tD/qBuYCAKt5iieWvWO1Y2j++J9uLqOndXb9Pf/83Xka/YjSnMbcPchA== dependencies: "@smithy/node-config-provider" "^4.2.2" @@ -2301,7 +2334,7 @@ "@smithy/middleware-serde@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz#cfb99f53c744d7730928235cbe66cc7ff8a8a9b2" + resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz" integrity sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg== dependencies: "@smithy/protocol-http" "^5.2.1" @@ -2310,7 +2343,7 @@ "@smithy/middleware-stack@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz#1d533fde4ccbb62d7fc0f0b8ac518b7e4791e311" + resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz" integrity sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A== dependencies: "@smithy/types" "^4.5.0" @@ -2318,7 +2351,7 @@ "@smithy/node-config-provider@^4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz#ede9ac2f689cfdf26815a53fadf139e6aa77bdbb" + resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz" integrity sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A== dependencies: "@smithy/property-provider" "^4.1.1" @@ -2328,7 +2361,7 @@ "@smithy/node-http-handler@^4.2.1": version "4.2.1" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz#d7ab8e31659030d3d5a68f0982f15c00b1e67a0c" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz" integrity sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw== dependencies: "@smithy/abort-controller" "^4.1.1" @@ -2339,7 +2372,7 @@ "@smithy/property-provider@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.1.1.tgz#6e11ae6729840314afed05fd6ab48f62c654116b" + resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.1.tgz" integrity sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg== dependencies: "@smithy/types" "^4.5.0" @@ -2347,7 +2380,7 @@ "@smithy/protocol-http@^5.2.1": version "5.2.1" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.2.1.tgz#33f2b8e4e1082c3ae0372d1322577e6fa71d7824" + resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.1.tgz" integrity sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw== dependencies: "@smithy/types" "^4.5.0" @@ -2355,7 +2388,7 @@ "@smithy/querystring-builder@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz#4d35c1735de8214055424045a117fa5d1d5cdec1" + resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz" integrity sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA== dependencies: "@smithy/types" "^4.5.0" @@ -2364,7 +2397,7 @@ "@smithy/querystring-parser@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz#21b861439b2db16abeb0a6789b126705fa25eea1" + resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz" integrity sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng== dependencies: "@smithy/types" "^4.5.0" @@ -2372,14 +2405,14 @@ "@smithy/service-error-classification@^4.1.2": version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.1.2.tgz#06839c332f4620a4b80c78a0c32377732dc6697a" + resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.2.tgz" integrity sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ== dependencies: "@smithy/types" "^4.5.0" "@smithy/shared-ini-file-loader@^4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz#e4717242686bf611bd1a5d6f79870abe480c1c99" + resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz" integrity sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw== dependencies: "@smithy/types" "^4.5.0" @@ -2387,7 +2420,7 @@ "@smithy/signature-v4@^5.2.1": version "5.2.1" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.2.1.tgz#0048489d2f1b3c888382595a085edd31967498f8" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.1.tgz" integrity sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA== dependencies: "@smithy/is-array-buffer" "^4.1.0" @@ -2401,7 +2434,7 @@ "@smithy/smithy-client@^4.6.3": version "4.6.3" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.6.3.tgz#5ec0c2c993371c246e061ac29550ab4f63db99bc" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.3.tgz" integrity sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw== dependencies: "@smithy/core" "^3.11.1" @@ -2414,7 +2447,7 @@ "@smithy/smithy-client@^4.6.4", "@smithy/smithy-client@^4.6.5": version "4.6.5" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.6.5.tgz#703e58c4036ae3c383d6969440d94fda09939403" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.5.tgz" integrity sha512-6J2hhuWu7EjnvLBIGltPCqzNswL1cW/AkaZx6i56qLsQ0ix17IAhmDD9aMmL+6CN9nCJODOXpBTCQS6iKAA7/g== dependencies: "@smithy/core" "^3.13.0" @@ -2434,14 +2467,14 @@ "@smithy/types@^4.5.0": version "4.5.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.5.0.tgz#850e334662a1ef1286c35814940c80880400a370" + resolved "https://registry.npmjs.org/@smithy/types/-/types-4.5.0.tgz" integrity sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg== dependencies: tslib "^2.6.2" "@smithy/url-parser@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.1.1.tgz#0e9a5e72b3cf9d7ab7305f9093af5528d9debaf6" + resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.1.tgz" integrity sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg== dependencies: "@smithy/querystring-parser" "^4.1.1" @@ -2450,7 +2483,7 @@ "@smithy/util-base64@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.1.0.tgz#5965026081d9aef4a8246f5702807570abe538b2" + resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.1.0.tgz" integrity sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ== dependencies: "@smithy/util-buffer-from" "^4.1.0" @@ -2459,14 +2492,14 @@ "@smithy/util-body-length-browser@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz#636bdf4bc878c546627dab4b9b0e4db31b475be7" + resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz" integrity sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ== dependencies: tslib "^2.6.2" "@smithy/util-body-length-node@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz#646750e4af58f97254a5d5cfeaba7d992f0152ec" + resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz" integrity sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ== dependencies: tslib "^2.6.2" @@ -2481,7 +2514,7 @@ "@smithy/util-buffer-from@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz#21f9e644a0eb41226d92e4eff763f76a7db7e9cc" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz" integrity sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw== dependencies: "@smithy/is-array-buffer" "^4.1.0" @@ -2489,14 +2522,14 @@ "@smithy/util-config-provider@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz#6a07d73446c1e9a46d7a3c125f2a9301060bc957" + resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz" integrity sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ== dependencies: tslib "^2.6.2" "@smithy/util-defaults-mode-browser@^4.1.3": version "4.1.3" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.3.tgz#889e0999c6b1536e434c2814a97bb9e7a9febc60" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.3.tgz" integrity sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg== dependencies: "@smithy/property-provider" "^4.1.1" @@ -2507,7 +2540,7 @@ "@smithy/util-defaults-mode-browser@^4.1.4": version "4.1.5" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.5.tgz#12b88fc97198a8ec25b501722b25f0afd2bbb1d2" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.5.tgz" integrity sha512-FGBhlmFZVSRto816l6IwrmDcQ9pUYX6ikdR1mmAhdtSS1m77FgADukbQg7F7gurXfAvloxE/pgsrb7SGja6FQA== dependencies: "@smithy/property-provider" "^4.1.1" @@ -2518,7 +2551,7 @@ "@smithy/util-defaults-mode-node@^4.1.3": version "4.1.3" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.3.tgz#7cc46d336dce27f716280a1979c51ca2bf5839ff" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.3.tgz" integrity sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA== dependencies: "@smithy/config-resolver" "^4.2.2" @@ -2531,7 +2564,7 @@ "@smithy/util-defaults-mode-node@^4.1.4": version "4.1.5" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.5.tgz#752745054ebd38e91f1a40b4ca90bdc6766c31b1" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.5.tgz" integrity sha512-Gwj8KLgJ/+MHYjVubJF0EELEh9/Ir7z7DFqyYlwgmp4J37KE+5vz6b3pWUnSt53tIe5FjDfVjDmHGYKjwIvW0Q== dependencies: "@smithy/config-resolver" "^4.2.2" @@ -2544,7 +2577,7 @@ "@smithy/util-endpoints@^3.1.2": version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz#be4005c8616923d453347048ef26a439267b2782" + resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz" integrity sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q== dependencies: "@smithy/node-config-provider" "^4.2.2" @@ -2553,14 +2586,14 @@ "@smithy/util-hex-encoding@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz#9b27cf0c25d0de2c8ebfe75cc20df84e5014ccc9" + resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz" integrity sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w== dependencies: tslib "^2.6.2" "@smithy/util-middleware@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.1.1.tgz#e19749a127499c9bdada713a8afd807d92d846e2" + resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.1.tgz" integrity sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg== dependencies: "@smithy/types" "^4.5.0" @@ -2568,7 +2601,7 @@ "@smithy/util-retry@^4.1.2": version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.1.2.tgz#8d28c27cf69643e173c75cc18ff0186deb7cefed" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.2.tgz" integrity sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA== dependencies: "@smithy/service-error-classification" "^4.1.2" @@ -2577,7 +2610,7 @@ "@smithy/util-stream@^4.3.2": version "4.3.2" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.3.2.tgz#7ce40c266b1e828d73c27e545959cda4f42fd61f" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.2.tgz" integrity sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g== dependencies: "@smithy/fetch-http-handler" "^5.2.1" @@ -2591,7 +2624,7 @@ "@smithy/util-uri-escape@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz#ed4a5c498f1da07122ca1e3df4ca3e2c67c6c18a" + resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz" integrity sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg== dependencies: tslib "^2.6.2" @@ -2606,7 +2639,7 @@ "@smithy/util-utf8@^4.1.0": version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.1.0.tgz#912c33c1a06913f39daa53da79cb8f7ab740d97b" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.1.0.tgz" integrity sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ== dependencies: "@smithy/util-buffer-from" "^4.1.0" @@ -2614,7 +2647,7 @@ "@smithy/util-waiter@^4.1.1": version "4.1.1" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.1.1.tgz#5b74429ca9e37f61838800b919d0063b1a865bef" + resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.1.1.tgz" integrity sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ== dependencies: "@smithy/abort-controller" "^4.1.1" @@ -2623,7 +2656,7 @@ "@smithy/uuid@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.0.0.tgz#a0fd3aa879d57e2f2fd6a7308deee864a412e1cf" + resolved "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.0.0.tgz" integrity sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ== dependencies: tslib "^2.6.2" @@ -2776,7 +2809,7 @@ "@types/uuid@^9.0.1": version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== "@types/wrap-ansi@^3.0.0": @@ -3024,9 +3057,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.2.2" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^3.2.1: version "3.2.1" @@ -3341,7 +3374,7 @@ caching-transform@^4.0.0: call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -3434,7 +3467,7 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: chalk@^5.0.0, chalk@^5.3.0, chalk@^5.6.2: version "5.6.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== change-case@^4, change-case@^4.1.2: @@ -3462,7 +3495,7 @@ change-case@^5.4.4: chardet@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.0.tgz#1007f441a1ae9f9199a4a67f6e978fb0aa9aa3fe" + resolved "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz" integrity sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA== check-error@^1.0.3: @@ -3778,7 +3811,7 @@ dateformat@^4.6.3: debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" @@ -3949,7 +3982,7 @@ dot-prop@^5.1.0: dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -3981,9 +4014,9 @@ electron-to-chromium@^1.5.4: integrity sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA== emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + version "10.6.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^8.0.0: version "8.0.0" @@ -4066,17 +4099,17 @@ es-abstract@^1.22.1: es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" @@ -4092,7 +4125,7 @@ es-set-tostringtag@^2.0.1: es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -4158,7 +4191,7 @@ eslint-config-salesforce-license@^0.2.0: eslint-config-salesforce-license@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce-license/-/eslint-config-salesforce-license-1.0.1.tgz#405283d55da648e7f356271bc11a5d647b0ad4bf" + resolved "https://registry.npmjs.org/eslint-config-salesforce-license/-/eslint-config-salesforce-license-1.0.1.tgz" integrity sha512-se/AlatOmkSOXQUcdDT7dR1MQxqE5AdtSroaVoby4Y1uMPUr1WSrspcX1zPYkToioqCF6VGIgrBquS63VkH+OA== eslint-config-salesforce-typescript@^3.4.0: @@ -4243,7 +4276,7 @@ eslint-plugin-jsdoc@^46.10.1: eslint-plugin-sf-plugin@^1.20.31: version "1.20.31" - resolved "https://registry.yarnpkg.com/eslint-plugin-sf-plugin/-/eslint-plugin-sf-plugin-1.20.31.tgz#d655ea3bf2f41376021d93612ee1e99c28415b3d" + resolved "https://registry.npmjs.org/eslint-plugin-sf-plugin/-/eslint-plugin-sf-plugin-1.20.31.tgz" integrity sha512-vFVhmiUVbiqvbD6wa/+O0xNHNhP+zlNMlDEHDNelKwNzEKnI8lrL5CzJKsKOw1r9aa0iEEUuaaHplRUeanflGQ== dependencies: "@salesforce/core" "^8.19.1" @@ -4466,7 +4499,7 @@ fast-uri@^3.0.1: fast-xml-parser@5.2.5: version "5.2.5" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz" integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== dependencies: strnum "^2.1.0" @@ -4492,7 +4525,7 @@ faye-websocket@>=0.9.1: faye@^1.4.0, faye@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/faye/-/faye-1.4.1.tgz#fd2f84e21d62b1cced1bd34968925b466d44a381" + resolved "https://registry.npmjs.org/faye/-/faye-1.4.1.tgz" integrity sha512-Cg/khikhqlvumHO3efwx2tps2ZgQRjUMrO24G0quz7MMzRYYaEjU224YFXOeuPIvanRegIchVxj6pmHK1W0ikA== dependencies: asap "*" @@ -4608,7 +4641,7 @@ form-data-encoder@^2.1.2: form-data@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" @@ -4712,7 +4745,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ get-intrinsic@^1.2.6: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -4733,7 +4766,7 @@ get-package-type@^0.1.0: get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -4892,7 +4925,7 @@ gopd@^1.0.1: gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^13: @@ -4978,7 +5011,7 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0: @@ -4990,7 +5023,7 @@ has-tostringtag@^1.0.0: has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" @@ -5019,7 +5052,7 @@ hasown@^2.0.0: hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -5139,12 +5172,12 @@ husky@^7.0.4: hyperdyperid@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + resolved "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== iconv-lite@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.0.tgz#c50cd80e6746ca8115eb98743afa81aa0e147a3e" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz" integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -6035,7 +6068,7 @@ marked@^13.0.0: math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mdurl@^2.0.0: @@ -6045,7 +6078,7 @@ mdurl@^2.0.0: memfs@^4.30.1: version "4.36.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.36.0.tgz#b9fa8d97ddda3cb8c06908bceec956560c33d979" + resolved "https://registry.npmjs.org/memfs/-/memfs-4.36.0.tgz" integrity sha512-mfBfzGUdoEw5AZwG8E965ej3BbvW2F9LxEWj4uLxF6BEh1dO2N9eS3AGu9S6vfenuQYrVjsbUOOZK7y3vz4vyQ== dependencies: "@jsonjoy.com/json-pack" "^1.0.3" @@ -6231,6 +6264,11 @@ mute-stream@^2.0.0: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz" integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== +mute-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz" + integrity sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -6430,7 +6468,7 @@ object.values@^1.1.7: oclif@^4.22.24: version "4.22.24" - resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.22.24.tgz#b39eed871dee8abb54485cdd3e5f7bfdbcb40964" + resolved "https://registry.npmjs.org/oclif/-/oclif-4.22.24.tgz" integrity sha512-AvF96mcrJllHebAFWGeRP0fcfoN++ofNn2q4mFHLt+uTjr2gSrDhfaLEuaI1b7NqYLFhKtqzO2SftvYhBLTf6g== dependencies: "@aws-sdk/client-cloudfront" "^3.893.0" @@ -7131,7 +7169,7 @@ safe-stable-stringify@^2.3.1, safe-stable-stringify@^2.4.3: "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@>=0.6.0: @@ -7539,13 +7577,20 @@ strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1, strip-ansi@^7.1.0: +strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" +strip-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -7575,7 +7620,7 @@ strip-json-comments@^3.1.1: strnum@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab" + resolved "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz" integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== supports-color@^5.3.0: @@ -7641,7 +7686,7 @@ text-table@^0.2.0: thingies@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" + resolved "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz" integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== thread-stream@^3.0.0: @@ -7705,7 +7750,7 @@ tr46@~0.0.3: tree-dump@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.3.tgz#2f0e42e77354714418ed7ab44291e435ccdb0f80" + resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz" integrity sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg== trim-newlines@^3.0.0: @@ -7767,7 +7812,7 @@ tsconfig-paths@^3.15.0: tslib@^2.0.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tslib@^2.0.3, tslib@^2.5.0, tslib@^2.6.2: @@ -8103,7 +8148,7 @@ widest-line@^5.0.0: wireit@^0.14.12: version "0.14.12" - resolved "https://registry.yarnpkg.com/wireit/-/wireit-0.14.12.tgz#c35788b4be4a796a8d05d204ec7d3f5c4b355d71" + resolved "https://registry.npmjs.org/wireit/-/wireit-0.14.12.tgz" integrity sha512-gNSd+nZmMo6cuICezYXRIayu6TSOeCSCDzjSF0q6g8FKDsRbdqrONrSZYzdk/uBISmRcv4vZtsno6GyGvdXwGA== dependencies: brace-expansion "^4.0.0" @@ -8167,6 +8212,15 @@ wrap-ansi@^9.0.0: string-width "^7.0.0" strip-ansi "^7.1.0" +wrap-ansi@^9.0.2: + version "9.0.2" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" From 216b2e49ecd0222185dab4fdf29a381e3b00b56e Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Fri, 5 Dec 2025 00:13:51 -0700 Subject: [PATCH 3/7] fix: resolve TypeScript compilation errors after merge - Add @types/node to resolve Buffer type conflicts - Update yarn.lock with compatible package versions --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index dcba4b0..6659a61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2386,7 +2386,7 @@ dependencies: "@types/node" "*" -"@types/node@*": +"@types/node@*", "@types/node@^24.10.1": version "24.10.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.1.tgz#91e92182c93db8bd6224fca031e2370cef9a8f01" integrity sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ== From cefd7a1ac8603045567e20dc2fe7cc4b483651f7 Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Fri, 5 Dec 2025 00:28:16 -0700 Subject: [PATCH 4/7] style: remove emoji icons from log messages - Remove all emoji prefixes from console output - Maintain clear and professional log messaging --- src/commands/orchestrator/template/eval.ts | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/commands/orchestrator/template/eval.ts b/src/commands/orchestrator/template/eval.ts index 581aac8..b12a3ea 100644 --- a/src/commands/orchestrator/template/eval.ts +++ b/src/commands/orchestrator/template/eval.ts @@ -188,11 +188,11 @@ export default class TemplateEval extends SfCommand { // Determine template source and payload const templateResult = await this.getTemplatePayload(flags); - this.log(`🔍 Testing transformation: ${templateResult.template.name}`); - this.log(`📁 Source: ${templateResult.template.source}`); + this.log(`Testing transformation: ${templateResult.template.name}`); + this.log(`Source: ${templateResult.template.source}`); if (templateResult.template.source === 'local') { - this.log(`📂 Path: ${templateResult.template.path}`); + this.log(`Path: ${templateResult.template.path}`); } const startTime = Date.now(); @@ -211,8 +211,8 @@ export default class TemplateEval extends SfCommand { const executionTime = `${Date.now() - startTime}ms`; - this.log('✅ Transformation completed successfully!'); - this.log('📊 Results:'); + this.log('Transformation completed successfully!'); + this.log('Results:'); this.log(JSON.stringify(result, null, 2)); return { @@ -223,7 +223,7 @@ export default class TemplateEval extends SfCommand { executionTime, }; } catch (error) { - this.log(`❌ Transformation failed: ${(error as Error).message}`); + this.log(`Transformation failed: ${(error as Error).message}`); return { status: 'error', @@ -253,7 +253,7 @@ export default class TemplateEval extends SfCommand { if (!flags['template-path'] && !flags['template-name']) { // If no-prompt flag is set, use static example if (flags['no-prompt']) { - this.log('â„šī¸ Using static example (--no-prompt flag specified).'); + this.log('Using static example (--no-prompt flag specified).'); return TemplateEval.getStaticPayload(); } @@ -261,7 +261,7 @@ export default class TemplateEval extends SfCommand { const templates = await detector.discoverLocalTemplates(flags['project-dir']); if (templates.length === 0) { - this.log('â„šī¸ No local templates found. Using static example.'); + this.log('No local templates found. Using static example.'); return TemplateEval.getStaticPayload(); } @@ -323,7 +323,7 @@ export default class TemplateEval extends SfCommand { }); if (selectedValue === 'static') { - this.log('✅ Selected: Static Example'); + this.log('Selected: Static Example'); return TemplateEval.getStaticPayload(); } @@ -331,12 +331,12 @@ export default class TemplateEval extends SfCommand { const selectedTemplate = templates.find((t) => t.path === selectedValue); if (selectedTemplate) { const displayName = selectedTemplate.label ?? selectedTemplate.name; - this.log(`✅ Selected: ${displayName}`); + this.log(`Selected: ${displayName}`); return this.getLocalTemplatePayload(selectedTemplate.path); } // Fallback (should not happen) - this.log('â„šī¸ Template not found. Using static example as fallback.'); + this.log('Template not found. Using static example as fallback.'); return TemplateEval.getStaticPayload(); } @@ -348,7 +348,7 @@ export default class TemplateEval extends SfCommand { // TODO: Parse actual template files const templateName = templatePath.split('/').pop() ?? 'Unknown Template'; - this.log(`âš ī¸ Local template parsing not yet implemented. Using static rules for: ${templateName}`); + this.log(`Local template parsing not yet implemented. Using static rules for: ${templateName}`); return { template: { @@ -368,7 +368,7 @@ export default class TemplateEval extends SfCommand { template: TemplateInfo; payload: TransformationPayload; }> { - this.log(`📄 Loading document: ${documentFile}`); + this.log(`Loading document: ${documentFile}`); // Read and parse the document file const documentContent = await fs.readFile(documentFile, 'utf8'); @@ -377,7 +377,7 @@ export default class TemplateEval extends SfCommand { // Read values file if provided, otherwise use empty object let values = { Variables: { hello: 'world' } }; if (valuesFile) { - this.log(`📊 Loading values: ${valuesFile}`); + this.log(`Loading values: ${valuesFile}`); const valuesContent = await fs.readFile(valuesFile, 'utf8'); values = JSON.parse(valuesContent) as typeof values; } @@ -385,7 +385,7 @@ export default class TemplateEval extends SfCommand { // Read definition file if provided, otherwise use empty rules let definition = { rules: [] }; if (definitionFile) { - this.log(`âš™ī¸ Loading definition: ${definitionFile}`); + this.log(`Loading definition: ${definitionFile}`); const definitionContent = await fs.readFile(definitionFile, 'utf8'); definition = JSON.parse(definitionContent) as typeof definition; } From 5d43c7d45371ea719a3f11195bed94f8973d88dc Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Fri, 5 Dec 2025 00:41:27 -0700 Subject: [PATCH 5/7] refactor: remove static payload functionality - Remove getStaticPayload() method and all static example logic - Require users to specify actual templates or files via flags - Update --no-prompt to require template specification instead of using static data - Remove static example option from interactive template selection - Update documentation to reflect new requirements - Use minimal empty payload structure for local template parsing placeholder --- messages/orchestrator.template.eval.md | 11 +- src/commands/orchestrator/template/eval.ts | 113 +++++++-------------- 2 files changed, 42 insertions(+), 82 deletions(-) diff --git a/messages/orchestrator.template.eval.md b/messages/orchestrator.template.eval.md index a780605..747c6da 100644 --- a/messages/orchestrator.template.eval.md +++ b/messages/orchestrator.template.eval.md @@ -48,11 +48,11 @@ Root directory of the SFDX project to search for templates. Defaults to current # flags.no-prompt.summary -Skip interactive template selection and use static example. +Skip interactive template selection. # flags.no-prompt.description -Use static example without prompting for template selection. Useful for scripting and CI environments. +Skip interactive template selection. Requires --template-path, --template-name, or --document-file to be specified. Useful for scripting and CI environments. # flags.document-file.summary @@ -95,5 +95,8 @@ Path to JSON file containing transformation rules and definitions. - Test with custom project directory: <%= config.bin %> <%= command.id %> --template-name MyTemplate --project-dir /path/to/project --target-org myorg -- Skip interactive prompts (useful for CI/automation): - <%= config.bin %> <%= command.id %> --no-prompt --target-org myorg +- Skip interactive prompts with specific template (useful for CI/automation): + <%= config.bin %> <%= command.id %> --no-prompt --template-name MyTemplate --target-org myorg + +- Test with direct file paths (useful for CI/automation): + <%= config.bin %> <%= command.id %> --document-file ./document.json --values-file ./values.json --definition-file ./rules.json --target-org myorg diff --git a/src/commands/orchestrator/template/eval.ts b/src/commands/orchestrator/template/eval.ts index b12a3ea..3bdf5f5 100644 --- a/src/commands/orchestrator/template/eval.ts +++ b/src/commands/orchestrator/template/eval.ts @@ -128,56 +128,6 @@ export default class TemplateEval extends SfCommand { }), }; - private static getStaticPayload(): { - template: TemplateInfo; - payload: TransformationPayload; - } { - return { - template: { - name: 'Static Example', - path: 'built-in', - source: 'static', - }, - payload: { - document: { - user: { - firstName: '${User.FirstName}', - lastName: '${User.LastName}', - userName: '${User.UserName}', - id: '${User.Id}', - hello: '${Variables.hello}', - }, - company: { - id: '${Org.Id}', - name: '${Org.Name}', - namespace: '${Org.Namespace}', - }, - }, - values: { - Variables: { - hello: 'world', - }, - }, - definition: { - rules: [ - { - name: 'Example', - actions: [ - { - action: 'put', - description: 'add hobby to user', - key: 'hobby', - path: '$.user', - value: 'mountain biking', - }, - ], - }, - ], - }, - }, - }; - } - public async run(): Promise { const { flags } = await this.parse(TemplateEval); @@ -251,18 +201,20 @@ export default class TemplateEval extends SfCommand { // If no template flags provided, discover local templates and prompt for selection if (!flags['template-path'] && !flags['template-name']) { - // If no-prompt flag is set, use static example + // If no-prompt flag is set, require template specification if (flags['no-prompt']) { - this.log('Using static example (--no-prompt flag specified).'); - return TemplateEval.getStaticPayload(); + throw new Error( + 'No template specified. Use --template-path, --template-name, or --document-file when using --no-prompt.' + ); } const detector = new LocalTemplateDetector(); const templates = await detector.discoverLocalTemplates(flags['project-dir']); if (templates.length === 0) { - this.log('No local templates found. Using static example.'); - return TemplateEval.getStaticPayload(); + throw new Error( + 'No local templates found. Use --template-path or --document-file to specify template files directly.' + ); } return this.promptForTemplateSelection(templates); @@ -293,7 +245,7 @@ export default class TemplateEval extends SfCommand { return this.getLocalTemplatePayload(foundTemplate.path); } - return TemplateEval.getStaticPayload(); + throw new Error('No template specified. Use --template-path, --template-name, or --document-file.'); } private async promptForTemplateSelection(templates: LocalTemplate[]): Promise<{ @@ -301,20 +253,14 @@ export default class TemplateEval extends SfCommand { payload: TransformationPayload; }> { // Build choices for inquirer select - const choices = [ - ...templates.map((template) => { - const displayName = template.label ?? template.name; - const description = template.description ? ` - ${template.description}` : ''; - return { - name: `${displayName}${description}`, - value: template.path, - }; - }), - { - name: 'Static Example (built-in test data)', - value: 'static', - }, - ]; + const choices = templates.map((template) => { + const displayName = template.label ?? template.name; + const description = template.description ? ` - ${template.description}` : ''; + return { + name: `${displayName}${description}`, + value: template.path, + }; + }); const selectedValue = await select({ message: 'Select a template to preview:', @@ -322,11 +268,6 @@ export default class TemplateEval extends SfCommand { pageSize: 10, }); - if (selectedValue === 'static') { - this.log('Selected: Static Example'); - return TemplateEval.getStaticPayload(); - } - // Find the selected template const selectedTemplate = templates.find((t) => t.path === selectedValue); if (selectedTemplate) { @@ -336,8 +277,7 @@ export default class TemplateEval extends SfCommand { } // Fallback (should not happen) - this.log('Template not found. Using static example as fallback.'); - return TemplateEval.getStaticPayload(); + throw new Error('Selected template not found.'); } private getLocalTemplatePayload(templatePath: string): { @@ -356,7 +296,24 @@ export default class TemplateEval extends SfCommand { path: templatePath, source: 'local', }, - payload: TemplateEval.getStaticPayload().payload, + payload: { + document: { + user: { + firstName: '', + lastName: '', + userName: '', + id: '', + hello: '', + }, + company: { + id: '', + name: '', + namespace: '', + }, + }, + values: { Variables: { hello: '' } }, + definition: { rules: [] }, + }, }; } From 40d4ae59469e8598c960bf4b1a37421b3765fe78 Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Fri, 5 Dec 2025 00:44:48 -0700 Subject: [PATCH 6/7] refactor: simplify to direct file paths only - Remove local template detection functionality and LocalTemplateDetector utility - Remove template-path, template-name, project-dir, and no-prompt flags - Make document-file flag required - users must specify file paths directly - Remove interactive template selection and inquirer dependency - Simplify getTemplatePayload to only handle direct file paths - Update documentation and examples to reflect direct file usage only --- .gitignore | 12 ++ command-snapshot.json | 16 +- messages/orchestrator.template.eval.md | 56 +------ src/commands/orchestrator/template/eval.ts | 153 +------------------- src/utils/template/localTemplateDetector.ts | 141 ------------------ test/commands/template/preview.nut.ts | 36 +++++ 6 files changed, 59 insertions(+), 355 deletions(-) delete mode 100644 src/utils/template/localTemplateDetector.ts create mode 100644 test/commands/template/preview.nut.ts diff --git a/.gitignore b/.gitignore index 2fbeb2c..4a3cab4 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,15 @@ node_modules # os specific files .DS_Store .idea + +# Claude Code and MCP config files (local development only) +.claude/ +.mcp.json +mcp-config-examples.json + +# Local documentation files +APP_FRAMEWORK_QUICK_REFERENCE.md +ISV_TESTING_PLAN.md + +# Temporary test files +*hi.txt diff --git a/command-snapshot.json b/command-snapshot.json index 14d653b..ccffbea 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -99,20 +99,8 @@ "alias": [], "command": "orchestrator:template:eval", "flagAliases": [], - "flagChars": ["d", "o", "p", "r", "t", "v"], - "flags": [ - "api-version", - "definition-file", - "document-file", - "flags-dir", - "json", - "no-prompt", - "project-dir", - "target-org", - "template-name", - "template-path", - "values-file" - ], + "flagChars": ["d", "o", "r", "v"], + "flags": ["api-version", "definition-file", "document-file", "flags-dir", "json", "target-org", "values-file"], "plugin": "@salesforce/plugin-orchestrator" }, { diff --git a/messages/orchestrator.template.eval.md b/messages/orchestrator.template.eval.md index 747c6da..bc185f3 100644 --- a/messages/orchestrator.template.eval.md +++ b/messages/orchestrator.template.eval.md @@ -22,38 +22,6 @@ Override the api version used for api requests made by this command. API version to use for the transformation request. Defaults to the org's configured API version. -# flags.template-path.summary - -Path to a local template directory to test. - -# flags.template-path.description - -Full path to a local Analytics template directory containing template-info.json and other template files. Use this to test rules from a specific template. - -# flags.template-name.summary - -Name of a local template to test. - -# flags.template-name.description - -Name or label of a template found in the local project. The command will search for templates in standard SFDX project paths. - -# flags.project-dir.summary - -Path to SFDX project root directory. - -# flags.project-dir.description - -Root directory of the SFDX project to search for templates. Defaults to current working directory. - -# flags.no-prompt.summary - -Skip interactive template selection. - -# flags.no-prompt.description - -Skip interactive template selection. Requires --template-path, --template-name, or --document-file to be specified. Useful for scripting and CI environments. - # flags.document-file.summary Path to JSON document file to transform. @@ -80,23 +48,11 @@ Path to JSON file containing transformation rules and definitions. # examples -- Test JSON transformation with sample rules: - <%= config.bin %> <%= command.id %> --target-org myorg - -- Test with specific API version: - <%= config.bin %> <%= command.id %> --target-org myorg --api-version 60.0 - -- Test a specific local template by path: - <%= config.bin %> <%= command.id %> --template-path ./force-app/main/default/appTemplates/MyTemplate --target-org myorg - -- Test a local template by name: - <%= config.bin %> <%= command.id %> --template-name working_template_1 --target-org myorg - -- Test with custom project directory: - <%= config.bin %> <%= command.id %> --template-name MyTemplate --project-dir /path/to/project --target-org myorg +- Test JSON transformation with document file only: + <%= config.bin %> <%= command.id %> --document-file ./document.json --target-org myorg -- Skip interactive prompts with specific template (useful for CI/automation): - <%= config.bin %> <%= command.id %> --no-prompt --template-name MyTemplate --target-org myorg - -- Test with direct file paths (useful for CI/automation): +- Test with document, values, and rules files: <%= config.bin %> <%= command.id %> --document-file ./document.json --values-file ./values.json --definition-file ./rules.json --target-org myorg + +- Test with specific API version: + <%= config.bin %> <%= command.id %> --document-file ./document.json --target-org myorg --api-version 60.0 diff --git a/src/commands/orchestrator/template/eval.ts b/src/commands/orchestrator/template/eval.ts index 3bdf5f5..9bb32c4 100644 --- a/src/commands/orchestrator/template/eval.ts +++ b/src/commands/orchestrator/template/eval.ts @@ -17,8 +17,6 @@ import * as fs from 'node:fs/promises'; import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; import { Messages, Connection } from '@salesforce/core'; -import select from '@inquirer/select'; -import { LocalTemplateDetector, LocalTemplate } from '../../../utils/template/localTemplateDetector.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-orchestrator', 'orchestrator.template.eval'); @@ -91,7 +89,7 @@ export default class TemplateEval extends SfCommand { char: 'd', summary: messages.getMessage('flags.document-file.summary'), description: messages.getMessage('flags.document-file.description'), - exclusive: ['template-path', 'template-name', 'no-prompt'], + required: true, }), 'values-file': Flags.file({ char: 'v', @@ -105,27 +103,6 @@ export default class TemplateEval extends SfCommand { description: messages.getMessage('flags.definition-file.description'), dependsOn: ['document-file'], }), - 'template-path': Flags.directory({ - char: 'p', - summary: messages.getMessage('flags.template-path.summary'), - description: messages.getMessage('flags.template-path.description'), - exclusive: ['template-name', 'document-file'], - }), - 'template-name': Flags.string({ - char: 't', - summary: messages.getMessage('flags.template-name.summary'), - description: messages.getMessage('flags.template-name.description'), - exclusive: ['template-path', 'document-file'], - }), - 'project-dir': Flags.directory({ - summary: messages.getMessage('flags.project-dir.summary'), - description: messages.getMessage('flags.project-dir.description'), - }), - 'no-prompt': Flags.boolean({ - summary: messages.getMessage('flags.no-prompt.summary'), - description: messages.getMessage('flags.no-prompt.description'), - exclusive: ['document-file'], - }), }; public async run(): Promise { @@ -183,138 +160,14 @@ export default class TemplateEval extends SfCommand { } private async getTemplatePayload(flags: { - 'template-path'?: string; - 'template-name'?: string; - 'project-dir'?: string; - 'no-prompt'?: boolean; - 'document-file'?: string; + 'document-file': string; 'values-file'?: string; 'definition-file'?: string; }): Promise<{ template: TemplateInfo; payload: TransformationPayload; }> { - // If direct file paths are provided, use them - if (flags['document-file']) { - return this.getDirectFilePayload(flags['document-file'], flags['values-file'], flags['definition-file']); - } - - // If no template flags provided, discover local templates and prompt for selection - if (!flags['template-path'] && !flags['template-name']) { - // If no-prompt flag is set, require template specification - if (flags['no-prompt']) { - throw new Error( - 'No template specified. Use --template-path, --template-name, or --document-file when using --no-prompt.' - ); - } - - const detector = new LocalTemplateDetector(); - const templates = await detector.discoverLocalTemplates(flags['project-dir']); - - if (templates.length === 0) { - throw new Error( - 'No local templates found. Use --template-path or --document-file to specify template files directly.' - ); - } - - return this.promptForTemplateSelection(templates); - } - - // If template path is provided directly - if (flags['template-path']) { - return this.getLocalTemplatePayload(flags['template-path']); - } - - // If template name is provided, search for it - if (flags['template-name']) { - const detector = new LocalTemplateDetector(); - const templates = await detector.discoverLocalTemplates(flags['project-dir']); - - const foundTemplate = templates.find( - (t) => t.name === flags['template-name'] || t.label === flags['template-name'] - ); - - if (!foundTemplate) { - throw new Error( - `Template '${flags['template-name']}' not found. Available templates: ${templates - .map((t) => t.name) - .join(', ')}` - ); - } - - return this.getLocalTemplatePayload(foundTemplate.path); - } - - throw new Error('No template specified. Use --template-path, --template-name, or --document-file.'); - } - - private async promptForTemplateSelection(templates: LocalTemplate[]): Promise<{ - template: TemplateInfo; - payload: TransformationPayload; - }> { - // Build choices for inquirer select - const choices = templates.map((template) => { - const displayName = template.label ?? template.name; - const description = template.description ? ` - ${template.description}` : ''; - return { - name: `${displayName}${description}`, - value: template.path, - }; - }); - - const selectedValue = await select({ - message: 'Select a template to preview:', - choices, - pageSize: 10, - }); - - // Find the selected template - const selectedTemplate = templates.find((t) => t.path === selectedValue); - if (selectedTemplate) { - const displayName = selectedTemplate.label ?? selectedTemplate.name; - this.log(`Selected: ${displayName}`); - return this.getLocalTemplatePayload(selectedTemplate.path); - } - - // Fallback (should not happen) - throw new Error('Selected template not found.'); - } - - private getLocalTemplatePayload(templatePath: string): { - template: TemplateInfo; - payload: TransformationPayload; - } { - // For now, return static payload but indicate it's from local template - // TODO: Parse actual template files - const templateName = templatePath.split('/').pop() ?? 'Unknown Template'; - - this.log(`Local template parsing not yet implemented. Using static rules for: ${templateName}`); - - return { - template: { - name: templateName, - path: templatePath, - source: 'local', - }, - payload: { - document: { - user: { - firstName: '', - lastName: '', - userName: '', - id: '', - hello: '', - }, - company: { - id: '', - name: '', - namespace: '', - }, - }, - values: { Variables: { hello: '' } }, - definition: { rules: [] }, - }, - }; + return this.getDirectFilePayload(flags['document-file'], flags['values-file'], flags['definition-file']); } private async getDirectFilePayload( diff --git a/src/utils/template/localTemplateDetector.ts b/src/utils/template/localTemplateDetector.ts deleted file mode 100644 index a0e9eda..0000000 --- a/src/utils/template/localTemplateDetector.ts +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2025, Salesforce, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as fs from 'node:fs/promises'; -import * as path from 'node:path'; - -export type LocalTemplate = { - name: string; - label?: string; - description?: string; - path: string; - templateInfo?: TemplateInfo; -}; - -export type TemplateInfo = { - name: string; - label?: string; - description?: string; - templateType?: string; - variableDefinition?: string; - layoutDefinition?: string; - rules?: Array<{ - type: string; - file: string; - }>; - chainDefinitions?: Array<{ - type: string; - name?: string; - file: string; - }>; -}; - -export class LocalTemplateDetector { - private readonly TEMPLATE_PATHS = ['force-app/main/default/appTemplates', 'src/appTemplates']; - - /** - * Check if a path exists - */ - private static async pathExists(filePath: string): Promise { - try { - await fs.access(filePath); - return true; - } catch { - return false; - } - } - - /** - * Read and parse template-info.json - */ - private static async readTemplateInfo(templateInfoPath: string): Promise { - try { - const exists = await LocalTemplateDetector.pathExists(templateInfoPath); - if (!exists) return null; - - const content = await fs.readFile(templateInfoPath, 'utf8'); - const parsed = JSON.parse(content) as TemplateInfo; - return parsed; - } catch (error) { - return null; - } - } - - /** - * Analyze a template directory to extract metadata - */ - private static async analyzeTemplate(templatePath: string, dirName: string): Promise { - try { - // Check if this is actually a directory - const stat = await fs.stat(templatePath); - if (!stat.isDirectory()) return null; - - // Look for template-info.json - const templateInfoPath = path.join(templatePath, 'template-info.json'); - const templateInfo = await LocalTemplateDetector.readTemplateInfo(templateInfoPath); - - return { - name: templateInfo?.name ?? dirName, - label: templateInfo?.label, - description: templateInfo?.description, - path: templatePath, - templateInfo: templateInfo ?? undefined, - }; - } catch (error) { - return null; - } - } - - /** - * Discover all local templates in standard SFDX project paths - */ - public async discoverLocalTemplates(projectRoot?: string): Promise { - const baseDir = projectRoot ?? process.cwd(); - - // Process all template paths concurrently - const pathPromises = this.TEMPLATE_PATHS.map(async (basePath) => { - const fullBasePath = path.join(baseDir, basePath); - - try { - const exists = await LocalTemplateDetector.pathExists(fullBasePath); - if (!exists) return []; - - const templateDirs = await fs.readdir(fullBasePath); - - // Analyze all templates in parallel - const templatePromises = templateDirs.map(async (templateDir) => { - const templatePath = path.join(fullBasePath, templateDir); - return LocalTemplateDetector.analyzeTemplate(templatePath, templateDir); - }); - - const templateResults = await Promise.all(templatePromises); - return templateResults.filter((template): template is LocalTemplate => template !== null); - } catch (error) { - // Silently skip inaccessible paths - return []; - } - }); - - const allTemplateResults = await Promise.all(pathPromises); - const templates = allTemplateResults.flat(); - - return templates.sort((a, b) => (a.label ?? a.name).localeCompare(b.label ?? b.name)); - } - - /** - * Read and parse template-info.json - */ -} diff --git a/test/commands/template/preview.nut.ts b/test/commands/template/preview.nut.ts new file mode 100644 index 0000000..9389bca --- /dev/null +++ b/test/commands/template/preview.nut.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { execCmd, TestSession } from '@salesforce/cli-plugins-testkit'; +import { expect } from 'chai'; + +describe('template preview NUTs', () => { + let session: TestSession; + + before(async () => { + session = await TestSession.create({ devhubAuthStrategy: 'NONE' }); + }); + + after(async () => { + await session?.clean(); + }); + + it('should display provided name', () => { + const name = 'World'; + const command = `template preview --name ${name}`; + const output = execCmd(command, { ensureExitCode: 0 }).shellOutput.stdout; + expect(output).to.contain(name); + }); +}); From f6b9c0333c2e1fae5a2207e8389d5e9aaf1a5af8 Mon Sep 17 00:00:00 2001 From: Ricardo Viera Date: Fri, 5 Dec 2025 00:47:56 -0700 Subject: [PATCH 7/7] revert: remove unnecessary .gitignore entries - Remove local development file entries from .gitignore - These files should not be tracked in the repository --- .gitignore | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.gitignore b/.gitignore index 4a3cab4..2fbeb2c 100644 --- a/.gitignore +++ b/.gitignore @@ -47,15 +47,3 @@ node_modules # os specific files .DS_Store .idea - -# Claude Code and MCP config files (local development only) -.claude/ -.mcp.json -mcp-config-examples.json - -# Local documentation files -APP_FRAMEWORK_QUICK_REFERENCE.md -ISV_TESTING_PLAN.md - -# Temporary test files -*hi.txt