From ada3a1884169a3bb2b9915eca37bcd79d4272f3f Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Thu, 30 Apr 2026 17:58:39 +0530 Subject: [PATCH 1/9] CL-1753 | + Anuja | + venky | feat: add rollback command for previous deployments with GraphQL integration Co-authored-by: Venkatesh Co-authored-by: anujachordiya-contentstack --- src/commands/launch/rollback.ts | 335 ++++++++++++++++++++++++++++++++ src/graphql/mutation.ts | 16 ++ src/graphql/queries.ts | 4 + 3 files changed, 355 insertions(+) create mode 100644 src/commands/launch/rollback.ts diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts new file mode 100644 index 00000000..4b6a89a --- /dev/null +++ b/src/commands/launch/rollback.ts @@ -0,0 +1,335 @@ +import chalk from 'chalk'; +import map from 'lodash/map'; +import find from 'lodash/find'; +import filter from 'lodash/filter'; +import isEmpty from 'lodash/isEmpty'; +import { FlagInput, Flags, cliux as ux } from '@contentstack/cli-utilities'; + +import { BaseCommand } from '../../base-command'; +import { + environmentsQuery, + latestLiveDeploymentQuery, + rollbackDeploymentMutation, +} from '../../graphql'; +import { Logger, selectOrg, selectProject } from '../../util'; + +export default class Rollback extends BaseCommand { + static description = 'Roll back to previous deployment'; + + static examples = [ + '$ <%= config.bin %> <%= command.id %>', + '$ <%= config.bin %> <%= command.id %> -d "current working directory"', + '$ <%= config.bin %> <%= command.id %> -c "path to the local config file"', + // eslint-disable-next-line max-len + '$ <%= config.bin %> <%= command.id %> -e "environment number or uid" --deployment= --org= --project= --reason="restoring previous build"', + ]; + + static flags: FlagInput = { + org: Flags.string({ + description: '[Optional] Provide the organization UID', + }), + project: Flags.string({ + description: '[Optional] Provide the project UID', + }), + environment: Flags.string({ + char: 'e', + description: 'Environment name or UID', + }), + deployment: Flags.string({ + description: '[Optional] Deployment UID to roll back to', + }), + reason: Flags.string({ + description: '[Optional] Reason for the rollback (saved to audit log)', + }), + }; + + async run(): Promise { + this.logger = new Logger(this.sharedConfig); + this.log = this.logger.log.bind(this.logger); + + if (!this.flags.environment) { + await this.getConfig(); + } + + await this.prepareApiClients(); + + if (!this.sharedConfig.currentConfig?.uid) { + await selectOrg({ + log: this.log, + flags: this.flags, + config: this.sharedConfig, + managementSdk: this.managementSdk, + }); + await this.prepareApiClients(); // NOTE update org-id in header + await selectProject({ + log: this.log, + flags: this.flags, + config: this.sharedConfig, + apolloClient: this.apolloClient, + }); + await this.prepareApiClients(); // NOTE update project-id in header + } + + await this.rollbackDeployment(); + } + + /** + * @method rollbackDeployment - resolve env, run select + review steps, fire mutation + * + * @memberof Rollback + */ + async rollbackDeployment(): Promise { + const environment = await this.resolveEnvironment(); + const currentLive = await this.fetchCurrentLiveDeployment(environment.uid); + const eligibleSorted = this.getEligibleSorted(environment, currentLive?.uid); + + if (isEmpty(eligibleSorted)) { + this.log('No rollback-eligible deployments are available for this environment.', 'error'); + process.exit(1); + } + + this.printSelectStep(environment, currentLive, eligibleSorted); + const target = await this.selectDeployment(eligibleSorted); + + this.printReviewStep(currentLive, target, eligibleSorted); + const reason = await this.promptReason(); + const confirmed = await ux.inquire({ + type: 'confirm', + name: 'confirm', + message: 'Confirm & Rollback?', + }); + + if (!confirmed) { + ux.print(chalk.yellow('Rollback aborted.')); + return; + } + + await this.apolloClient + .mutate({ + mutation: rollbackDeploymentMutation, + variables: { + input: { + deployment: target.uid, + environment: environment.uid, + ...(reason ? { reason } : {}), + }, + }, + }) + .then(({ data: { deployment: rolledBack } }) => { + ux.print(''); + ux.print(chalk.green('✔ Instant rollback to a previous deployment is successful.')); + ux.print(` New deployment: ${chalk.cyan(rolledBack.uid)} status: ${chalk.cyan(rolledBack.status)}`); + ux.print(''); + }) + .catch((error) => { + const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; + this.log(`Rollback failed. Please try again. (${code})`, 'error'); + process.exit(1); + }); + } + + /** + * @method resolveEnvironment - resolve environment via flag, config, or prompt + * + * @memberof Rollback + */ + async resolveEnvironment(): Promise { + const environments = await this.apolloClient + .query({ query: environmentsQuery }) + .then(({ data: { Environments } }) => map(Environments.edges, 'node')) + .catch((error) => { + this.log(error?.message, 'error'); + process.exit(1); + }); + + let environment = find( + environments, + ({ uid, name }) => + uid === this.flags.environment || + name === this.flags.environment || + uid === this.sharedConfig.currentConfig?.environments?.[0]?.uid, + ); + + if (isEmpty(environment) && (this.flags.environment || this.sharedConfig.currentConfig?.environments?.[0]?.uid)) { + this.log('Environment(s) not found!', 'error'); + process.exit(1); + } else if (isEmpty(environment)) { + environment = await ux + .inquire({ + type: 'search-list', + name: 'Environment', + choices: map(environments, (row) => ({ ...row, value: row.name })), + message: 'Choose an environment', + }) + .then((name: any) => find(environments, { name }) as Record); + } + + this.sharedConfig.environment = environment; + return environment; + } + + /** + * @method fetchCurrentLiveDeployment - fetch the currently live deployment for the environment + * + * @memberof Rollback + */ + async fetchCurrentLiveDeployment(environmentUid: string): Promise { + return this.apolloClient + .query({ + query: latestLiveDeploymentQuery, + variables: { query: { environment: environmentUid } }, + }) + .then(({ data }) => data?.latestLiveDeployment) + .catch(() => undefined); + } + + /** + * @method getEligibleSorted - eligible deployments excluding current live, sorted by number desc + * + * @memberof Rollback + */ + getEligibleSorted(environment: any, currentLiveUid?: string): any[] { + const deployments = map(environment?.deployments?.edges, 'node'); + const eligible = filter( + deployments, + (d) => d.isRollbackEligible && d.uid !== currentLiveUid, + ); + return [...eligible].sort((a, b) => (b.deploymentNumber || 0) - (a.deploymentNumber || 0)); + } + + /** + * @method selectDeployment - resolve target via --deployment flag or interactive picker + * + * @memberof Rollback + */ + async selectDeployment(eligibleSorted: any[]): Promise { + if (this.flags.deployment) { + const match = find(eligibleSorted, ({ uid }) => uid === this.flags.deployment); + if (isEmpty(match)) { + this.log('Provided deployment UID is not rollback-eligible or does not exist.', 'error'); + process.exit(1); + } + return match; + } + + const choices = map(eligibleSorted, (d) => ({ + ...d, + name: `#${d.deploymentNumber} | ${sourceLabel(d) || '—'} | ${d.createdAt}`, + value: d.uid, + })); + + const selectedUid = await ux.inquire({ + type: 'search-list', + name: 'Deployment', + choices, + message: 'Select a version to restore', + }); + + return find(eligibleSorted, { uid: selectedUid }) as Record; + } + + /** + * @method promptReason - prompt for rollback reason unless provided via --reason flag + * + * @memberof Rollback + */ + async promptReason(): Promise { + if (this.flags.reason) { + return this.flags.reason.trim() || undefined; + } + const input = await ux.inquire({ + type: 'input', + name: 'reason', + message: 'Reason (saved to audit log) — press enter to skip:', + }); + const trimmed = (input || '').trim(); + return trimmed ? trimmed : undefined; + } + + /** + * @method printSelectStep - mirror the UI "select" step heading and table + * + * @memberof Rollback + */ + printSelectStep(environment: any, currentLive: any, eligibleSorted: any[]): void { + ux.print(''); + ux.print(chalk.bold.underline('Roll back to previous deployment')); + ux.print(`${chalk.dim('Environment:')} ${chalk.cyan(environment.name)}`); + ux.print(''); + ux.print(chalk.bold('Currently live')); + ux.print(` ${formatDeployment(currentLive)}`); + ux.print(''); + ux.print(chalk.bold('Select a version to restore')); + ux.print(chalk.dim('Choose a previously successful deployment to ensure stability.')); + const count = eligibleSorted.length; + ux.print(chalk.dim(`(${count} eligible deployment${count === 1 ? '' : 's'} available)`)); + ux.print(''); + } + + /** + * @method printReviewStep - mirror the UI "review" step warnings, skips info, and summary + * + * @memberof Rollback + */ + printReviewStep(currentLive: any, target: any, eligibleSorted: any[]): void { + ux.print(''); + ux.print(chalk.bold.underline('Review rollback')); + ux.print(''); + ux.print('You are about to replace your live site with the version below.'); + ux.print('This build will be pushed to the edge immediately.'); + ux.print(''); + ux.print( + `${chalk.yellow.bold('Note:')} The rolled back instance will use the environment variables`, + ); + ux.print(' associated with the selected deployment.'); + + const targetIndex = eligibleSorted.findIndex((d) => d.uid === target.uid); + const skipped = targetIndex > 0 ? eligibleSorted.slice(0, targetIndex) : []; + if (skipped.length > 0) { + const list = skipped.map((d) => `#${d.deploymentNumber}`).join(', '); + const noun = skipped.length === 1 ? 'good deployment' : 'good deployments'; + const verb = skipped.length === 1 ? 'stays' : 'stay'; + ux.print(''); + ux.print( + `${chalk.blue('ⓘ')} Selecting #${target.deploymentNumber} skips ${skipped.length} ${noun} — ${list}`, + ); + ux.print(` ${verb} in history and can be restored later.`); + } + + ux.print(''); + ux.print(` ${chalk.bold('Current Live')} ${formatDeployment(currentLive)}`); + ux.print(` ${chalk.bold('Roll back to')} ${formatDeployment(target)}`); + ux.print(''); + ux.print( + chalk.dim('A new deployment may be initiated if any automations/commits/webhooks are triggered.'), + ); + ux.print(''); + } +} + +function shortHash(hash?: string): string { + return hash ? hash.substring(0, 7) : ''; +} + +function sourceLabel(deployment?: any): string { + if (!deployment) { + return ''; + } + const hash = shortHash(deployment.commitHash); + if (deployment.gitBranch && hash) { + return `${deployment.gitBranch} - ${hash}`; + } + return deployment.gitBranch || hash || ''; +} + +function formatDeployment(deployment?: any): string { + if (!deployment) { + return chalk.dim('(none)'); + } + const number = deployment.deploymentNumber ? `#${deployment.deploymentNumber}` : deployment.uid; + const source = sourceLabel(deployment); + const createdAt = deployment.createdAt || ''; + const numberCol = chalk.green(number.padEnd(6)); + const sourceCol = source ? chalk.cyan(source.padEnd(28)) : ''.padEnd(28); + return `${numberCol} ${sourceCol} ${chalk.dim(createdAt)}`; +} diff --git a/src/graphql/mutation.ts b/src/graphql/mutation.ts index 97bc3f6..fac8510 100755 --- a/src/graphql/mutation.ts +++ b/src/graphql/mutation.ts @@ -76,8 +76,24 @@ const importProjectMutation: DocumentNode = gql` } `; +const rollbackDeploymentMutation: DocumentNode = gql` + mutation RollbackDeployment($input: RollbackDeploymentInput!) { + deployment: rollbackDeployment(input: $input) { + uid + status + createdAt + updatedAt + commitHash + commitMessage + deploymentUrl + deploymentNumber + } + } +`; + export { importProjectMutation, createDeploymentMutation, + rollbackDeploymentMutation, createSignedUploadUrlMutation, }; diff --git a/src/graphql/queries.ts b/src/graphql/queries.ts index c27debe..a4a7e7c 100755 --- a/src/graphql/queries.ts +++ b/src/graphql/queries.ts @@ -161,10 +161,14 @@ const environmentsQuery: DocumentNode = gql` edges { node { uid + status + gitBranch + commitHash createdAt commitMessage deploymentUrl deploymentNumber + isRollbackEligible } } } From 99804546071bb3e6970e0082af6fe5bf0df4935a Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Thu, 30 Apr 2026 19:21:52 +0530 Subject: [PATCH 2/9] CL-1753 | enhance rollback command with deployment status polling and improved error handling --- src/commands/launch/rollback.ts | 85 ++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 13 deletions(-) diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts index 4b6a89a..1b4f7c9 100644 --- a/src/commands/launch/rollback.ts +++ b/src/commands/launch/rollback.ts @@ -7,6 +7,7 @@ import { FlagInput, Flags, cliux as ux } from '@contentstack/cli-utilities'; import { BaseCommand } from '../../base-command'; import { + deploymentQuery, environmentsQuery, latestLiveDeploymentQuery, rollbackDeploymentMutation, @@ -104,8 +105,9 @@ export default class Rollback extends BaseCommand { return; } - await this.apolloClient - .mutate({ + let rolledBack: any; + try { + const { data } = await this.apolloClient.mutate({ mutation: rollbackDeploymentMutation, variables: { input: { @@ -114,18 +116,75 @@ export default class Rollback extends BaseCommand { ...(reason ? { reason } : {}), }, }, - }) - .then(({ data: { deployment: rolledBack } }) => { - ux.print(''); - ux.print(chalk.green('✔ Instant rollback to a previous deployment is successful.')); - ux.print(` New deployment: ${chalk.cyan(rolledBack.uid)} status: ${chalk.cyan(rolledBack.status)}`); - ux.print(''); - }) - .catch((error) => { - const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; - this.log(`Rollback failed. Please try again. (${code})`, 'error'); - process.exit(1); }); + rolledBack = data?.deployment; + } catch (error: any) { + const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; + this.log(`Rollback failed. Please try again. (${code})`, 'error'); + process.exit(1); + } + + ux.print(''); + ux.print( + `Promoting deployment ${chalk.cyan(`#${rolledBack.deploymentNumber}`)} ` + + chalk.dim(`(${rolledBack.uid})`) + '…', + ); + + const finalStatus = await this.pollDeploymentStatus(environment.uid, target.uid); + + ux.print(''); + if (finalStatus === 'LIVE') { + ux.print(chalk.green('✔ Instant rollback to a previous deployment is successful.')); + const label = `${chalk.cyan(`#${rolledBack.deploymentNumber}`)} ${chalk.dim(`(${rolledBack.uid})`)}`; + ux.print(` Deployment ${label} is now ${chalk.green('LIVE')}.`); + } else if (finalStatus === 'FAILED' || finalStatus === 'CANCELLED') { + ux.print(chalk.red(`✘ Rollback ended with status: ${finalStatus}.`)); + process.exit(1); + } else { + ux.print(chalk.yellow(`Rollback is still in progress (status: ${finalStatus}).`)); + ux.print(chalk.dim(' Check the Launch dashboard for the final status.')); + } + ux.print(''); + } + + /** + * @method pollDeploymentStatus - poll the target deployment until it goes LIVE or terminal/timeout + * + * @memberof Rollback + */ + async pollDeploymentStatus(environmentUid: string, deploymentUid: string): Promise { + const intervalMs = 3000; + const timeoutMs = 90000; + const start = Date.now(); + const terminal = new Set(['LIVE', 'FAILED', 'CANCELLED']); + + while (Date.now() - start < timeoutMs) { + try { + const { data } = await this.apolloClient.query({ + query: deploymentQuery, + variables: { query: { environment: environmentUid, uid: deploymentUid } }, + fetchPolicy: 'no-cache', + }); + const status = data?.Deployment?.status; + if (status && terminal.has(status)) { + return status; + } + } catch (error: any) { + this.log(`Failed to fetch deployment status: ${error?.message}`, 'warn'); + } + await new Promise((resolve) => setTimeout(resolve, intervalMs)); + } + + try { + const { data } = await this.apolloClient.query({ + query: deploymentQuery, + variables: { query: { environment: environmentUid, uid: deploymentUid } }, + fetchPolicy: 'no-cache', + }); + return data?.Deployment?.status || 'UNKNOWN'; + } catch { + return 'UNKNOWN'; + } } /** From 189764d6d56059b46925101d832b84fc1a4aab73 Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Thu, 30 Apr 2026 21:22:12 +0530 Subject: [PATCH 3/9] CL-1753 | add unit tests for rollback command and enhance environment resolution logic --- .talismanrc | 2 + src/commands/launch/rollback.test.ts | 233 +++++++++++++++++++++++++++ src/commands/launch/rollback.ts | 67 ++++---- src/graphql/queries.ts | 15 +- 4 files changed, 282 insertions(+), 35 deletions(-) create mode 100644 src/commands/launch/rollback.test.ts diff --git a/.talismanrc b/.talismanrc index fb07040..70638de 100644 --- a/.talismanrc +++ b/.talismanrc @@ -6,4 +6,6 @@ fileignoreconfig: checksum: 9db6c02ad35a0367343cd753b916dd64db4a9efd24838201d2e1113ed19c9b62 - filename: package-lock.json checksum: 43c0eecc2192095c8fb5bc524b7dafa33a6141ddd3923d41ffb15ec025bea9a9 +- filename: src/commands/launch/rollback.test.ts + checksum: 561d709dfaa046af3afaf73e8570211d1b63ca8fdf23d3a6ffec0fff7587eacd version: "1.0" \ No newline at end of file diff --git a/src/commands/launch/rollback.test.ts b/src/commands/launch/rollback.test.ts new file mode 100644 index 00000000..0c1081d --- /dev/null +++ b/src/commands/launch/rollback.test.ts @@ -0,0 +1,233 @@ +import Rollback from './rollback'; +import { Logger } from '../../util'; +import { cliux } from '@contentstack/cli-utilities'; + +jest.mock('../../util', () => { + const actual = jest.requireActual('../../util'); + return { + ...actual, + Logger: jest.fn(), + selectOrg: jest.fn(), + selectProject: jest.fn(), + }; +}); + +jest.mock('@contentstack/cli-utilities', () => { + const actual = jest.requireActual('@contentstack/cli-utilities'); + return { + ...actual, + configHandler: { + get: jest.fn((key) => { + if (key === 'authtoken') return 'dummy-token'; + if (key === 'authorisationType') return 'OAuth'; + if (key === 'oauthAccessToken') return 'dummy-oauth-token'; + return undefined; + }), + }, + cliux: { + ...actual.cliux, + inquire: jest.fn(), + print: jest.fn(), + }, + }; +}); + +const targetDeployment = { + uid: 'target-uid', + status: 'ARCHIVED', + gitBranch: 'main', + commitHash: 'abcdef1', + createdAt: '2026-04-29T00:00:00Z', + commitMessage: 'previous good build', + deploymentUrl: 'https://example.com', + deploymentNumber: 2, + isRollbackEligible: true, +}; + +const liveDeployment = { + ...targetDeployment, + uid: 'live-uid', + status: 'LIVE', + deploymentNumber: 3, +}; + +const environmentsResponse = { + data: { + Environments: { + edges: [ + { + node: { + uid: 'env-uid', + name: 'Default', + deployments: { + edges: [ + { node: liveDeployment }, + { node: targetDeployment }, + ], + }, + }, + }, + ], + }, + }, +}; + +const buildCommand = (flags: Record = {}, queryImpl?: jest.Mock, mutateImpl?: jest.Mock) => { + const cmd = new Rollback([], {} as any); + (cmd as any).flags = flags; + (cmd as any).log = jest.fn(); + (cmd as any).logger = { log: jest.fn() }; + (cmd as any).sharedConfig = { currentConfig: { uid: 'project-uid' } }; + (cmd as any).apolloClient = { + query: queryImpl || jest.fn(), + mutate: mutateImpl || jest.fn(), + }; + return cmd; +}; + +describe('Rollback Command', () => { + let exitMock: jest.SpyInstance; + + beforeEach(() => { + (Logger as jest.Mock).mockImplementation(() => ({ log: jest.fn() })); + exitMock = jest.spyOn(process, 'exit').mockImplementation(((code?: number) => { + throw new Error(`process.exit:${code}`); + }) as any); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('exits when no rollback-eligible deployments are available', async () => { + const noEligibleResponse = { + data: { + Environments: { + edges: [ + { + node: { + uid: 'env-uid', + name: 'Default', + deployments: { edges: [{ node: liveDeployment }] }, + }, + }, + ], + }, + }, + }; + const query = jest.fn().mockResolvedValueOnce(noEligibleResponse); + const mutate = jest.fn(); + const cmd = buildCommand({ environment: 'Default' }, query, mutate); + jest + .spyOn(cmd as any, 'fetchCurrentLiveDeployment') + .mockResolvedValueOnce(liveDeployment); + + await expect((cmd as any).rollbackDeployment()).rejects.toThrow('process.exit:1'); + + expect(mutate).not.toHaveBeenCalled(); + expect(exitMock).toHaveBeenCalledWith(1); + expect((cmd as any).log).toHaveBeenCalledWith( + 'No rollback-eligible deployments are available for this environment.', + 'error', + ); + }); + + it('exits when --deployment flag does not match an eligible deployment', async () => { + const query = jest.fn().mockResolvedValueOnce(environmentsResponse); + const mutate = jest.fn(); + const cmd = buildCommand( + { environment: 'Default', deployment: 'unknown-uid' }, + query, + mutate, + ); + jest + .spyOn(cmd as any, 'fetchCurrentLiveDeployment') + .mockResolvedValueOnce(liveDeployment); + + await expect((cmd as any).rollbackDeployment()).rejects.toThrow('process.exit:1'); + + expect(mutate).not.toHaveBeenCalled(); + expect(exitMock).toHaveBeenCalledWith(1); + expect((cmd as any).log).toHaveBeenCalledWith( + 'Provided deployment UID is not rollback-eligible or does not exist.', + 'error', + ); + }); + + it('skips the mutation when the user does not confirm', async () => { + const query = jest.fn().mockResolvedValueOnce(environmentsResponse); + const mutate = jest.fn(); + const cmd = buildCommand( + { environment: 'Default', deployment: 'target-uid', reason: 'audit' }, + query, + mutate, + ); + jest + .spyOn(cmd as any, 'fetchCurrentLiveDeployment') + .mockResolvedValueOnce(liveDeployment); + (cliux.inquire as jest.Mock).mockResolvedValueOnce(false); // confirm prompt + + await (cmd as any).rollbackDeployment(); + + expect(mutate).not.toHaveBeenCalled(); + }); + + it('fires the rollback mutation and polls until LIVE on success', async () => { + const query = jest.fn().mockResolvedValueOnce(environmentsResponse); + const mutate = jest.fn().mockResolvedValueOnce({ + data: { deployment: { ...targetDeployment, status: 'QUEUED' } }, + }); + const cmd = buildCommand( + { environment: 'Default', deployment: 'target-uid', reason: 'restoring' }, + query, + mutate, + ); + jest + .spyOn(cmd as any, 'fetchCurrentLiveDeployment') + .mockResolvedValueOnce(liveDeployment); + jest.spyOn(cmd as any, 'pollDeploymentStatus').mockResolvedValueOnce('LIVE'); + (cliux.inquire as jest.Mock).mockResolvedValueOnce(true); + + await (cmd as any).rollbackDeployment(); + + expect(mutate).toHaveBeenCalledTimes(1); + const variables = mutate.mock.calls[0][0].variables; + expect(variables).toEqual({ + input: { + deployment: 'target-uid', + environment: 'env-uid', + reason: 'restoring', + }, + }); + expect((cmd as any).pollDeploymentStatus).toHaveBeenCalledWith('env-uid', 'target-uid'); + expect(exitMock).not.toHaveBeenCalled(); + }); + + it('logs an error and exits when the rollback mutation fails', async () => { + const query = jest.fn().mockResolvedValueOnce(environmentsResponse); + const error = Object.assign(new Error('boom'), { + graphQLErrors: [{ extensions: { exception: { name: 'DeploymentRollbackFailed' } } }], + }); + const mutate = jest.fn().mockRejectedValueOnce(error); + const cmd = buildCommand( + { environment: 'Default', deployment: 'target-uid' }, + query, + mutate, + ); + jest + .spyOn(cmd as any, 'fetchCurrentLiveDeployment') + .mockResolvedValueOnce(liveDeployment); + (cliux.inquire as jest.Mock) + .mockResolvedValueOnce('') // reason + .mockResolvedValueOnce(true); // confirm + + await expect((cmd as any).rollbackDeployment()).rejects.toThrow('process.exit:1'); + + expect(mutate).toHaveBeenCalledTimes(1); + expect(exitMock).toHaveBeenCalledWith(1); + expect((cmd as any).log).toHaveBeenCalledWith( + 'Rollback failed. Please try again. (DeploymentRollbackFailed)', + 'error', + ); + }); +}); diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts index 1b4f7c9..29aa5f0 100644 --- a/src/commands/launch/rollback.ts +++ b/src/commands/launch/rollback.ts @@ -194,37 +194,37 @@ export default class Rollback extends BaseCommand { */ async resolveEnvironment(): Promise { const environments = await this.apolloClient - .query({ query: environmentsQuery }) + .query({ + query: environmentsQuery, + variables: { skipRollbackData: false }, + }) .then(({ data: { Environments } }) => map(Environments.edges, 'node')) .catch((error) => { this.log(error?.message, 'error'); process.exit(1); }); - let environment = find( - environments, - ({ uid, name }) => - uid === this.flags.environment || - name === this.flags.environment || - uid === this.sharedConfig.currentConfig?.environments?.[0]?.uid, - ); - - if (isEmpty(environment) && (this.flags.environment || this.sharedConfig.currentConfig?.environments?.[0]?.uid)) { - this.log('Environment(s) not found!', 'error'); - process.exit(1); - } else if (isEmpty(environment)) { - environment = await ux - .inquire({ - type: 'search-list', - name: 'Environment', - choices: map(environments, (row) => ({ ...row, value: row.name })), - message: 'Choose an environment', - }) - .then((name: any) => find(environments, { name }) as Record); + if (this.flags.environment) { + const environment = find( + environments, + ({ uid, name }) => uid === this.flags.environment || name === this.flags.environment, + ); + if (isEmpty(environment)) { + this.log('Environment(s) not found!', 'error'); + process.exit(1); + } + return environment; } - this.sharedConfig.environment = environment; - return environment; + // NOTE: rollback is destructive; never auto-select from saved config — always prompt. + return ux + .inquire({ + type: 'search-list', + name: 'Environment', + choices: map(environments, (row) => ({ ...row, value: row.name })), + message: 'Choose an environment', + }) + .then((name: any) => find(environments, { name }) as Record); } /** @@ -271,11 +271,15 @@ export default class Rollback extends BaseCommand { return match; } - const choices = map(eligibleSorted, (d) => ({ - ...d, - name: `#${d.deploymentNumber} | ${sourceLabel(d) || '—'} | ${d.createdAt}`, - value: d.uid, - })); + const choices = map(eligibleSorted, (d) => { + const message = (d.commitMessage || '').split('\n')[0].trim() || '—'; + const truncated = message.length > 60 ? `${message.slice(0, 57)}…` : message; + return { + ...d, + name: `#${d.deploymentNumber} | ${sourceLabel(d) || '—'} | ${truncated} | ${d.createdAt}`, + value: d.uid, + }; + }); const selectedUid = await ux.inquire({ type: 'search-list', @@ -387,8 +391,11 @@ function formatDeployment(deployment?: any): string { } const number = deployment.deploymentNumber ? `#${deployment.deploymentNumber}` : deployment.uid; const source = sourceLabel(deployment); + const message = ((deployment.commitMessage || '').split('\n')[0] || '').trim(); + const truncated = message.length > 40 ? `${message.slice(0, 37)}…` : message; const createdAt = deployment.createdAt || ''; const numberCol = chalk.green(number.padEnd(6)); - const sourceCol = source ? chalk.cyan(source.padEnd(28)) : ''.padEnd(28); - return `${numberCol} ${sourceCol} ${chalk.dim(createdAt)}`; + const sourceCol = source ? chalk.cyan(source.padEnd(22)) : ''.padEnd(22); + const messageCol = truncated || chalk.dim('—'); + return `${numberCol} ${sourceCol} ${messageCol} ${chalk.dim(createdAt)}`; } diff --git a/src/graphql/queries.ts b/src/graphql/queries.ts index a4a7e7c..1cb0e81 100755 --- a/src/graphql/queries.ts +++ b/src/graphql/queries.ts @@ -145,12 +145,17 @@ const latestLiveDeploymentQuery: DocumentNode = gql` environment deploymentNumber deploymentUrl + status + gitBranch + commitHash + commitMessage + createdAt } } `; const environmentsQuery: DocumentNode = gql` - query Environments { + query Environments($skipRollbackData: Boolean = true) { Environments { edges { node { @@ -161,14 +166,14 @@ const environmentsQuery: DocumentNode = gql` edges { node { uid - status - gitBranch - commitHash createdAt commitMessage deploymentUrl deploymentNumber - isRollbackEligible + status @skip(if: $skipRollbackData) + gitBranch @skip(if: $skipRollbackData) + commitHash @skip(if: $skipRollbackData) + isRollbackEligible @skip(if: $skipRollbackData) } } } From 3b9750a47c634d123ced14aa00d8dc270b1a213a Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Mon, 4 May 2026 12:07:00 +0530 Subject: [PATCH 4/9] CL-1753 | refactor rollback command: rename init method, enhance error handling, and update method names for clarity --- src/commands/launch/rollback.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts index 29aa5f0..da447ab 100644 --- a/src/commands/launch/rollback.ts +++ b/src/commands/launch/rollback.ts @@ -44,16 +44,18 @@ export default class Rollback extends BaseCommand { }), }; - async run(): Promise { + async init(): Promise { + await super.init(); this.logger = new Logger(this.sharedConfig); this.log = this.logger.log.bind(this.logger); + await this.prepareApiClients(); + } + async run(): Promise { if (!this.flags.environment) { await this.getConfig(); } - await this.prepareApiClients(); - if (!this.sharedConfig.currentConfig?.uid) { await selectOrg({ log: this.log, @@ -82,7 +84,7 @@ export default class Rollback extends BaseCommand { async rollbackDeployment(): Promise { const environment = await this.resolveEnvironment(); const currentLive = await this.fetchCurrentLiveDeployment(environment.uid); - const eligibleSorted = this.getEligibleSorted(environment, currentLive?.uid); + const eligibleSorted = this.getEligibleSortedDeployments(environment, currentLive?.uid); if (isEmpty(eligibleSorted)) { this.log('No rollback-eligible deployments are available for this environment.', 'error'); @@ -105,7 +107,7 @@ export default class Rollback extends BaseCommand { return; } - let rolledBack: any; + let rolledBack: { deploymentNumber: number; uid: string }; try { const { data } = await this.apolloClient.mutate({ mutation: rollbackDeploymentMutation, @@ -118,8 +120,9 @@ export default class Rollback extends BaseCommand { }, }); rolledBack = data?.deployment; - } catch (error: any) { - const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; + } catch (error: unknown) { + const err = error as { graphQLErrors?: { extensions?: { exception?: { name?: string } } }[]; message?: string }; + const code = err?.graphQLErrors?.[0]?.extensions?.exception?.name || err?.message; this.log(`Rollback failed. Please try again. (${code})`, 'error'); process.exit(1); } @@ -243,11 +246,11 @@ export default class Rollback extends BaseCommand { } /** - * @method getEligibleSorted - eligible deployments excluding current live, sorted by number desc + * @method getEligibleSortedDeployments - eligible deployments excluding current live, sorted by number desc * * @memberof Rollback */ - getEligibleSorted(environment: any, currentLiveUid?: string): any[] { + getEligibleSortedDeployments(environment: any, currentLiveUid?: string): any[] { const deployments = map(environment?.deployments?.edges, 'node'); const eligible = filter( deployments, From b3aa64dc117f2269ee4a6abc876da98c85a2ab18 Mon Sep 17 00:00:00 2001 From: SakshiKoli-CS Date: Tue, 12 May 2026 15:33:37 +0530 Subject: [PATCH 5/9] chore: upgrade @contentstack/cli-command and cli-utilities version and remove axios override --- package-lock.json | 1517 +++++++++++++++++++-------------------------- package.json | 5 +- 2 files changed, 648 insertions(+), 874 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0cafd9..a88ff95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "MIT", "dependencies": { "@apollo/client": "^3.14.0", - "@contentstack/cli-command": "^1.8.1", - "@contentstack/cli-utilities": "^1.18.2", + "@contentstack/cli-command": "^1.8.2", + "@contentstack/cli-utilities": "^1.18.3", "@oclif/core": "^4.2.7", "@oclif/plugin-help": "^6.2.25", "@rollup/plugin-commonjs": "^28.0.2", @@ -150,33 +150,6 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", @@ -207,33 +180,6 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", @@ -285,33 +231,6 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", @@ -447,23 +366,24 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.974.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.2.tgz", - "integrity": "sha512-oav5AOAz+1XkwUfp6SrEm42UPDpUP5D4jNYXkDwFR1VfWqYX62+jpytdfzURmJ9McSoJIQwi0OJlC4oCi6t0VQ==", + "version": "3.974.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.8.tgz", + "integrity": "sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", - "@aws-sdk/xml-builder": "^3.972.18", - "@smithy/core": "^3.23.15", + "@aws-sdk/xml-builder": "^3.972.22", + "@smithy/core": "^3.23.17", "@smithy/node-config-provider": "^4.3.14", "@smithy/property-provider": "^4.2.14", "@smithy/protocol-http": "^5.3.14", "@smithy/signature-v4": "^5.3.14", - "@smithy/smithy-client": "^4.12.11", + "@smithy/smithy-client": "^4.12.13", "@smithy/types": "^4.14.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.6", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -486,13 +406,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.28.tgz", - "integrity": "sha512-87GdRJ2OR0qR4VkMjXN/SZi66DZsunW2qQCbtw9rKw3Y7JurFi6tQWYKOSLY/gOADrU6OxGqFmdw3hKzZqDZOQ==", + "version": "3.972.34", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz", + "integrity": "sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/types": "^3.973.8", "@smithy/property-provider": "^4.2.14", "@smithy/types": "^4.14.1", @@ -503,21 +423,21 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.30", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.30.tgz", - "integrity": "sha512-6quozmW2PKwBJTUQLb+lk1q8w5Pm45qaqhx4Tld9EIqYYQOVGj+MT0a8NRVS7QgWJj7rzGlB7rQu3KYBFHemJw==", + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz", + "integrity": "sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/types": "^3.973.8", "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/node-http-handler": "^4.5.3", + "@smithy/node-http-handler": "^4.6.1", "@smithy/property-provider": "^4.2.14", "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.11", + "@smithy/smithy-client": "^4.12.13", "@smithy/types": "^4.14.1", - "@smithy/util-stream": "^4.5.23", + "@smithy/util-stream": "^4.5.25", "tslib": "^2.6.2" }, "engines": { @@ -525,20 +445,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.32", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.32.tgz", - "integrity": "sha512-Nkr+UKtczZlocUjc6g96WzQadZSIZO/HVXPki4qbfaVOZYSbfLQKWKfADtJ0kGYsCvSYOZrO66tSc9dkboUt/w==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz", + "integrity": "sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", - "@aws-sdk/credential-provider-env": "^3.972.28", - "@aws-sdk/credential-provider-http": "^3.972.30", - "@aws-sdk/credential-provider-login": "^3.972.32", - "@aws-sdk/credential-provider-process": "^3.972.28", - "@aws-sdk/credential-provider-sso": "^3.972.32", - "@aws-sdk/credential-provider-web-identity": "^3.972.32", - "@aws-sdk/nested-clients": "^3.997.0", + "@aws-sdk/core": "^3.974.8", + "@aws-sdk/credential-provider-env": "^3.972.34", + "@aws-sdk/credential-provider-http": "^3.972.36", + "@aws-sdk/credential-provider-login": "^3.972.38", + "@aws-sdk/credential-provider-process": "^3.972.34", + "@aws-sdk/credential-provider-sso": "^3.972.38", + "@aws-sdk/credential-provider-web-identity": "^3.972.38", + "@aws-sdk/nested-clients": "^3.997.6", "@aws-sdk/types": "^3.973.8", "@smithy/credential-provider-imds": "^4.2.14", "@smithy/property-provider": "^4.2.14", @@ -551,14 +471,14 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.32", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.32.tgz", - "integrity": "sha512-UxgwT1HmZz1QPXuBy5ZUPJNFXOSlhwdQL61eGhWRthF0xRrT02BCOVJ1p5Ejg5AXfnESTWoKPJ7v/sCkNUtB9g==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz", + "integrity": "sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", - "@aws-sdk/nested-clients": "^3.997.0", + "@aws-sdk/core": "^3.974.8", + "@aws-sdk/nested-clients": "^3.997.6", "@aws-sdk/types": "^3.973.8", "@smithy/property-provider": "^4.2.14", "@smithy/protocol-http": "^5.3.14", @@ -571,18 +491,18 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.33", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.33.tgz", - "integrity": "sha512-6pGQnEdSeRvBViTQh/FwaRKB38a3Th+W2mVxuvqAd2Z1Ayo3e6eJ5QqJoZwEMwR6xoxkl3wz3qAfiB1xRhMC+w==", + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz", + "integrity": "sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.28", - "@aws-sdk/credential-provider-http": "^3.972.30", - "@aws-sdk/credential-provider-ini": "^3.972.32", - "@aws-sdk/credential-provider-process": "^3.972.28", - "@aws-sdk/credential-provider-sso": "^3.972.32", - "@aws-sdk/credential-provider-web-identity": "^3.972.32", + "@aws-sdk/credential-provider-env": "^3.972.34", + "@aws-sdk/credential-provider-http": "^3.972.36", + "@aws-sdk/credential-provider-ini": "^3.972.38", + "@aws-sdk/credential-provider-process": "^3.972.34", + "@aws-sdk/credential-provider-sso": "^3.972.38", + "@aws-sdk/credential-provider-web-identity": "^3.972.38", "@aws-sdk/types": "^3.973.8", "@smithy/credential-provider-imds": "^4.2.14", "@smithy/property-provider": "^4.2.14", @@ -595,13 +515,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.28.tgz", - "integrity": "sha512-CRAlD8u6oNBhjnX/3ekVGocarD+lFmEn/qeDzytgIdmwrmwMJGFPqS9lGwEfhOTihZKrQ0xSp3z6paX+iXJJhA==", + "version": "3.972.34", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz", + "integrity": "sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/types": "^3.973.8", "@smithy/property-provider": "^4.2.14", "@smithy/shared-ini-file-loader": "^4.4.9", @@ -613,15 +533,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.32", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.32.tgz", - "integrity": "sha512-whhmQghRYOt9mJxFyVMhX7eB8n0oA25OCvqoR7dzFAZjmioCkf7WVB22Bc6llM5cFpBXFX7s4Jv+xVq32VPGWg==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz", + "integrity": "sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", - "@aws-sdk/nested-clients": "^3.997.0", - "@aws-sdk/token-providers": "3.1033.0", + "@aws-sdk/core": "^3.974.8", + "@aws-sdk/nested-clients": "^3.997.6", + "@aws-sdk/token-providers": "3.1041.0", "@aws-sdk/types": "^3.973.8", "@smithy/property-provider": "^4.2.14", "@smithy/shared-ini-file-loader": "^4.4.9", @@ -633,14 +553,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.32", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.32.tgz", - "integrity": "sha512-Z0Y0LDaqyQDznlmr9gv6n4+eWKKWNgmi9j5L6RENr6wyOCguhO8FRPmqDbVLSw0DPdMqICKnA3PurJiS8bD6Cw==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz", + "integrity": "sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", - "@aws-sdk/nested-clients": "^3.997.0", + "@aws-sdk/core": "^3.974.8", + "@aws-sdk/nested-clients": "^3.997.6", "@aws-sdk/types": "^3.973.8", "@smithy/property-provider": "^4.2.14", "@smithy/shared-ini-file-loader": "^4.4.9", @@ -687,16 +607,16 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.974.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.10.tgz", - "integrity": "sha512-R9oqyD1hR7aF2UQaYBo90/ILNn8Sq7gl/2Y4WkDDvsaqklqPomso++sFbgYgNmN/Kfx6gqvJwcjSkxJHEBK1tQ==", + "version": "3.974.16", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.16.tgz", + "integrity": "sha512-6ru8doI0/XzszqLIPXf0E/V7HhAw1Pu94010XCKYtBUfD0LxF0BuOzrUf8OQGR6j2o6wgKTHUniOmndQycHwCA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/crc64-nvme": "^3.972.7", "@aws-sdk/types": "^3.973.8", "@smithy/is-array-buffer": "^4.2.2", @@ -704,7 +624,7 @@ "@smithy/protocol-http": "^5.3.14", "@smithy/types": "^4.14.1", "@smithy/util-middleware": "^4.2.14", - "@smithy/util-stream": "^4.5.23", + "@smithy/util-stream": "^4.5.25", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -776,24 +696,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.31", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.31.tgz", - "integrity": "sha512-5hS08Fp0Rm+59uGCmkWhZmveXiA7OUV7Wa+IARejdzf9JTZ1qAVeIOE9JoBpsLPvUgEjmsGNHBuFbtGmYyqiqQ==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz", + "integrity": "sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/types": "^3.973.8", "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.15", + "@smithy/core": "^3.23.17", "@smithy/node-config-provider": "^4.3.14", "@smithy/protocol-http": "^5.3.14", "@smithy/signature-v4": "^5.3.14", - "@smithy/smithy-client": "^4.12.11", + "@smithy/smithy-client": "^4.12.13", "@smithy/types": "^4.14.1", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-middleware": "^4.2.14", - "@smithy/util-stream": "^4.5.23", + "@smithy/util-stream": "^4.5.25", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -817,19 +737,19 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.32", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.32.tgz", - "integrity": "sha512-HQ0x9DDKqLZOGhDiL2eicYXXkYT5dogE4mw0lAfHCpJ6t7MM0PNIsJl2TZzWKU9SpBzOMXHRa7K6ZLKUJu1y0w==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.38.tgz", + "integrity": "sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.7", - "@smithy/core": "^3.23.15", + "@aws-sdk/util-endpoints": "^3.996.8", + "@smithy/core": "^3.23.17", "@smithy/protocol-http": "^5.3.14", "@smithy/types": "^4.14.1", - "@smithy/util-retry": "^4.3.2", + "@smithy/util-retry": "^4.3.6", "tslib": "^2.6.2" }, "engines": { @@ -837,49 +757,49 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.0.tgz", - "integrity": "sha512-4bI5GHjUiY5R8N6PtchpG6tW2Dl8I2IcZNg3JwqwxHRXjfvQlPoo4VMknG4qkd5W0t3Y20rQ6C7pSR561YG5JQ==", + "version": "3.997.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz", + "integrity": "sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.2", + "@aws-sdk/core": "^3.974.8", "@aws-sdk/middleware-host-header": "^3.972.10", "@aws-sdk/middleware-logger": "^3.972.10", "@aws-sdk/middleware-recursion-detection": "^3.972.11", - "@aws-sdk/middleware-user-agent": "^3.972.32", - "@aws-sdk/region-config-resolver": "^3.972.12", - "@aws-sdk/signature-v4-multi-region": "^3.996.19", + "@aws-sdk/middleware-user-agent": "^3.972.38", + "@aws-sdk/region-config-resolver": "^3.972.13", + "@aws-sdk/signature-v4-multi-region": "^3.996.25", "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.7", + "@aws-sdk/util-endpoints": "^3.996.8", "@aws-sdk/util-user-agent-browser": "^3.972.10", - "@aws-sdk/util-user-agent-node": "^3.973.18", - "@smithy/config-resolver": "^4.4.16", - "@smithy/core": "^3.23.15", + "@aws-sdk/util-user-agent-node": "^3.973.24", + "@smithy/config-resolver": "^4.4.17", + "@smithy/core": "^3.23.17", "@smithy/fetch-http-handler": "^5.3.17", "@smithy/hash-node": "^4.2.14", "@smithy/invalid-dependency": "^4.2.14", "@smithy/middleware-content-length": "^4.2.14", - "@smithy/middleware-endpoint": "^4.4.30", - "@smithy/middleware-retry": "^4.5.3", - "@smithy/middleware-serde": "^4.2.18", + "@smithy/middleware-endpoint": "^4.4.32", + "@smithy/middleware-retry": "^4.5.7", + "@smithy/middleware-serde": "^4.2.20", "@smithy/middleware-stack": "^4.2.14", "@smithy/node-config-provider": "^4.3.14", - "@smithy/node-http-handler": "^4.5.3", + "@smithy/node-http-handler": "^4.6.1", "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.11", + "@smithy/smithy-client": "^4.12.13", "@smithy/types": "^4.14.1", "@smithy/url-parser": "^4.2.14", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.47", - "@smithy/util-defaults-mode-node": "^4.2.52", - "@smithy/util-endpoints": "^3.4.1", + "@smithy/util-defaults-mode-browser": "^4.3.49", + "@smithy/util-defaults-mode-node": "^4.2.54", + "@smithy/util-endpoints": "^3.4.2", "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.2", + "@smithy/util-retry": "^4.3.6", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -888,14 +808,14 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.12", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.12.tgz", - "integrity": "sha512-QQI43Mxd53nBij0pm8HXC+t4IOC6gnhhZfzxE0OATQyO6QfPV4e+aTIRRuAJKA6Nig/cR8eLwPryqYTX9ZrjAQ==", + "version": "3.972.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz", + "integrity": "sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", - "@smithy/config-resolver": "^4.4.16", + "@smithy/config-resolver": "^4.4.17", "@smithy/node-config-provider": "^4.3.14", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" @@ -905,13 +825,13 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.19", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.19.tgz", - "integrity": "sha512-7Sy8+GhfwUi06NQNLplxuJuXMKJURDsNQfK8yTW6E9wN2J1B+8S5dWZG7vg3InvPPhaXqkcYTr8pzeE+dLjMbQ==", + "version": "3.996.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz", + "integrity": "sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.31", + "@aws-sdk/middleware-sdk-s3": "^3.972.37", "@aws-sdk/types": "^3.973.8", "@smithy/protocol-http": "^5.3.14", "@smithy/signature-v4": "^5.3.14", @@ -923,14 +843,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1033.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1033.0.tgz", - "integrity": "sha512-/TsXhqjyRAFb0xVgmbFAha3cJfZdWjnyn6ohJ3AB4E3peLgxNcmKfYr45hruHymyJAydiHoXC3N1a8qgl41cog==", + "version": "3.1041.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz", + "integrity": "sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.2", - "@aws-sdk/nested-clients": "^3.997.0", + "@aws-sdk/core": "^3.974.8", + "@aws-sdk/nested-clients": "^3.997.6", "@aws-sdk/types": "^3.973.8", "@smithy/property-provider": "^4.2.14", "@smithy/shared-ini-file-loader": "^4.4.9", @@ -969,16 +889,16 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.7.tgz", - "integrity": "sha512-ty4LQxN1QC+YhUP28NfEgZDEGXkyqOQy+BDriBozqHsrYO4JMgiPhfizqOGF7P+euBTZ5Ez6SKlLAMCLo8tzmw==", + "version": "3.996.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.8.tgz", + "integrity": "sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", "@smithy/types": "^4.14.1", "@smithy/url-parser": "^4.2.14", - "@smithy/util-endpoints": "^3.4.1", + "@smithy/util-endpoints": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1012,13 +932,13 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.18.tgz", - "integrity": "sha512-Nh4YvAL0Mzv5jBvzXLFL0tLf7WPrRMnYZQ5jlFuyS0xiVJQsObMUKAkbYjmt/e04wpQqUaa+Is7k+mBr89A9yA==", + "version": "3.973.24", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.24.tgz", + "integrity": "sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.32", + "@aws-sdk/middleware-user-agent": "^3.972.38", "@aws-sdk/types": "^3.973.8", "@smithy/node-config-provider": "^4.3.14", "@smithy/types": "^4.14.1", @@ -1038,14 +958,15 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.18.tgz", - "integrity": "sha512-BMDNVG1ETXRhl1tnisQiYBef3RShJ1kfZA7x7afivTFMLirfHNTb6U71K569HNXhSXbQZsweHvSDZ6euBw8hPA==", + "version": "3.972.22", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz", + "integrity": "sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@nodable/entities": "2.1.0", "@smithy/types": "^4.14.1", - "fast-xml-parser": "5.5.8", + "fast-xml-parser": "5.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1078,9 +999,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -1269,9 +1190,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { @@ -1588,14 +1509,13 @@ } }, "node_modules/@contentstack/cli-command": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@contentstack/cli-command/-/cli-command-1.8.1.tgz", - "integrity": "sha512-yEmBAYNMkKxhaNhtfkOakF2FASRi5pEQns/k3fCJQxrFlBAlMwZNPSggw8GCz1lft2+n0Bjy3eLCl6iqWV5wtQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@contentstack/cli-command/-/cli-command-1.8.2.tgz", + "integrity": "sha512-vwadTZkJjfS3Cay9r6Rno01tYxhkMeyfB/jAvQmNmvrdfxnpG0kxwmZItjaQI+aq8jnuNitBmivGCT+EqgMVlQ==", "license": "MIT", "dependencies": { - "@contentstack/cli-utilities": "~1.18.2", + "@contentstack/cli-utilities": "~1.18.3", "@oclif/core": "^4.10.5", - "@oclif/plugin-help": "^6.2.28", "contentstack": "^3.27.0" }, "engines": { @@ -1603,15 +1523,15 @@ } }, "node_modules/@contentstack/cli-utilities": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.18.2.tgz", - "integrity": "sha512-FgfIXgpFTOePa9V6obnKJDhJcpcn4Jr1wCz5n3owsnzkxiMpR3BPyXQBh1CCatcdj5a/HICEmppDqfPbFkEikw==", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.18.3.tgz", + "integrity": "sha512-qrkfODXP+SSVNQyoGe2OQ73VmORUcSjqhk2MafothAZiac7vNsyZ4E/rMvskDmJjH6azjjQI99/Ejao78YrCyw==", "license": "MIT", "dependencies": { "@contentstack/management": "~1.30.1", "@contentstack/marketplace-sdk": "^1.5.1", "@oclif/core": "^4.10.5", - "axios": "^1.15.1", + "axios": "^1.15.2", "chalk": "^4.1.2", "cli-cursor": "^3.1.0", "cli-progress": "^3.12.0", @@ -1631,18 +1551,19 @@ "papaparse": "^5.5.3", "recheck": "~4.4.5", "rxjs": "^6.6.7", + "short-uuid": "^6.0.0", "traverse": "^0.6.11", "tty-table": "^4.2.3", "unique-string": "^2.0.0", - "uuid": "^9.0.1", + "uuid": "^14.0.0", "winston": "^3.19.0", "xdg-basedir": "^4.0.0" } }, "node_modules/@contentstack/management": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.30.1.tgz", - "integrity": "sha512-rwceQJ78/yRORDwlq+vO5ge5C02YIfiHvCPxpJXA/UJwHTuwehkMH6wQzFdBHnWItQU+ymT4oN9lX1uA31V52A==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.30.2.tgz", + "integrity": "sha512-DPr/4N35dbclU/PAugB3PGom5MSxYOqicIgP7TPnOlO6TY7r76VIPiycu8yXck71RH+Dmeni1+cMwMlIfzrYOQ==", "license": "MIT", "dependencies": { "@contentstack/utils": "^1.9.1", @@ -1661,13 +1582,13 @@ } }, "node_modules/@contentstack/marketplace-sdk": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@contentstack/marketplace-sdk/-/marketplace-sdk-1.5.1.tgz", - "integrity": "sha512-XoQODTWZ4cQeo7iIAcYcYLX9bSHvgeF1J230GTM2dVhN3w9aTylZ35zZttvsa76fDZWgRmZBO5AE99dVVq7xyA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@contentstack/marketplace-sdk/-/marketplace-sdk-1.5.2.tgz", + "integrity": "sha512-BAjHLuAkKw+tcF/nE6UrD5QzIm+xFQrk/2vnWajJF3XJ9W/Ovg/5H9BLMpD+AfkwoRaWh8vAqLdt4nVQyr5e+g==", "license": "MIT", "dependencies": { "@contentstack/utils": "^1.9.1", - "axios": "^1.15.0" + "axios": "^1.15.2" } }, "node_modules/@contentstack/utils": { @@ -1991,9 +1912,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -4024,6 +3945,19 @@ "@tybys/wasm-util": "^0.10.0" } }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@nolyfill/is-core-module": { "version": "1.0.39", "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", @@ -4035,9 +3969,9 @@ } }, "node_modules/@oclif/core": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.5.tgz", - "integrity": "sha512-qcdCF7NrdWPfme6Kr34wwljRCXbCVpL1WVxiNy0Ep6vbWKjxAjFQwuhqkoyL0yjI+KdwtLcOCGn5z2yzdijc8w==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.11.2.tgz", + "integrity": "sha512-LWDalCgy+hYyAkLa9sMIXMXk6ws5RzQhVnkmfXtVIIyEEYigbXQ/9/x+s76p53MiXxNc6SJB7lfwkPF+SdzfMQ==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", @@ -4051,7 +3985,7 @@ "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.5", - "semver": "^7.7.3", + "semver": "^7.8.0", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", @@ -4064,9 +3998,9 @@ } }, "node_modules/@oclif/plugin-help": { - "version": "6.2.44", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.44.tgz", - "integrity": "sha512-x03Se2LtlOOlGfTuuubt5C4Z8NHeR4zKXtVnfycuLU+2VOMu2WpsGy9nbs3nYuInuvsIY1BizjVaTjUz060Sig==", + "version": "6.2.48", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.48.tgz", + "integrity": "sha512-nvGLBtUZUWrHfoAEDRsRZUHKVwptyZ6F+MErdVRLQBo3dja0GCZH8DE33dA7mBux2KOmbxGqop15gyud9HZYhQ==", "license": "MIT", "dependencies": { "@oclif/core": "^4" @@ -4076,14 +4010,14 @@ } }, "node_modules/@oclif/plugin-not-found": { - "version": "3.2.80", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.80.tgz", - "integrity": "sha512-yTLjWvR1r/Rd/cO2LxHdMCDoL5sQhBYRUcOMCmxZtWVWhx4rAZ8KVUPDVsb+SvjJDV5ADTDBgt1H52fFx7YWqg==", + "version": "3.2.85", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.85.tgz", + "integrity": "sha512-Si18rRKWknlvQ5anmFbQz9oKBae5/l/Npreuf05xdoNWfOV1J97Z7cpzqBlHbldmxCIiDRgmDKuCBBi4XN6ACA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/prompts": "^7.10.1", - "@oclif/core": "^4.10.5", + "@oclif/core": "^4.11.2", "ansis": "^3.17.0", "fast-levenshtein": "^3.0.0" }, @@ -4092,9 +4026,9 @@ } }, "node_modules/@oclif/plugin-warn-if-update-available": { - "version": "3.1.60", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.60.tgz", - "integrity": "sha512-cRKBZm14IuA6G8W84dfd3iXj3BTAoxQ5o3pUE8DKEQ4n/tVha20t5nkVeD+ISC68e0Fuw5koTMvRwXb1lJSnzg==", + "version": "3.1.64", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.64.tgz", + "integrity": "sha512-+BauVC7jeMRs6NPvFFO1KHdSIVL10ruz6W3laKdN0i7PjSo14clmQe+DUJVTADI5Z3eYFYnsISwdDbOU/2pnYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4351,9 +4285,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", + "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", "cpu": [ "arm" ], @@ -4364,9 +4298,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", + "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", "cpu": [ "arm64" ], @@ -4377,9 +4311,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", + "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", "cpu": [ "arm64" ], @@ -4390,9 +4324,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", + "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", "cpu": [ "x64" ], @@ -4403,9 +4337,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", + "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", "cpu": [ "arm64" ], @@ -4416,9 +4350,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", + "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", "cpu": [ "x64" ], @@ -4429,9 +4363,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", + "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", "cpu": [ "arm" ], @@ -4442,9 +4376,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", + "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", "cpu": [ "arm" ], @@ -4455,9 +4389,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", + "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", "cpu": [ "arm64" ], @@ -4468,9 +4402,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", + "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", "cpu": [ "arm64" ], @@ -4481,9 +4415,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", + "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", "cpu": [ "loong64" ], @@ -4494,9 +4428,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", + "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", "cpu": [ "loong64" ], @@ -4507,9 +4441,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", + "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", "cpu": [ "ppc64" ], @@ -4520,9 +4454,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", + "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", "cpu": [ "ppc64" ], @@ -4533,9 +4467,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", + "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", "cpu": [ "riscv64" ], @@ -4546,9 +4480,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", + "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", "cpu": [ "riscv64" ], @@ -4559,9 +4493,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", + "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", "cpu": [ "s390x" ], @@ -4572,9 +4506,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", + "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", "cpu": [ "x64" ], @@ -4585,9 +4519,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", + "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", "cpu": [ "x64" ], @@ -4598,9 +4532,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", + "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", "cpu": [ "x64" ], @@ -4611,9 +4545,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", + "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", "cpu": [ "arm64" ], @@ -4624,9 +4558,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", + "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", "cpu": [ "arm64" ], @@ -4637,9 +4571,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", + "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", "cpu": [ "ia32" ], @@ -4650,9 +4584,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", + "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", "cpu": [ "x64" ], @@ -4663,9 +4597,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", + "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", "cpu": [ "x64" ], @@ -4743,45 +4677,14 @@ "type-detect": "^4.1.0" } }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", - "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", - "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@smithy/config-resolver": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.17.tgz", - "integrity": "sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.5.1.tgz", + "integrity": "sha512-abXk3LhODsvRHsk0ZS9ztrg/fZatTa9Z/z4pgx65YSLR+rY6kvUG/1IgcDKEUciR8MfdnkT5oPeHJTy/HhzDIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.14", - "@smithy/types": "^4.14.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.4.2", - "@smithy/util-middleware": "^4.2.14", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4789,21 +4692,14 @@ } }, "node_modules/@smithy/core": { - "version": "3.23.16", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.16.tgz", - "integrity": "sha512-JStomOrINQA1VqNEopLsgcdgwd42au7mykKqVr30XFw89wLt9sDxJDi4djVPRwQmmzyTGy/uOvTc2ultMpFi1w==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.1.tgz", + "integrity": "sha512-3mT7o4qQyUWttYnVK3A0Z/u3Xha3E81tXn32Tz6vjZiUXhBrkEivpw1hBYfh84iFF9CSzkBU9Y1DJ3Q6RQ231g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.14", + "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-stream": "^4.5.24", - "@smithy/util-utf8": "^4.2.2", - "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, "engines": { @@ -4811,32 +4707,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz", - "integrity": "sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.14", - "@smithy/property-provider": "^4.2.14", - "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz", - "integrity": "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.1.tgz", + "integrity": "sha512-0S/acwHnqX4WrjXzhdiDRxsG2s9SC0cpPIK9nZ1R6UOHd+j7uL28+4bHu22urbLk2TVw3fkp6na/+fkUt/pLNQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -4844,14 +4722,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.14.tgz", - "integrity": "sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.3.1.tgz", + "integrity": "sha512-X7MyI1fu8M84IPKk49kO4kb27Mqp6un9/0o/MsA1ngZ5OxxWKGUxPS3S/AJ9q1cPVTSGmRcbaGNfGUSsflTJkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.14", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4859,13 +4736,13 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.14.tgz", - "integrity": "sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.4.1.tgz", + "integrity": "sha512-JZGbSXaBk7JY8VPzsh66ksJ0nTWXbApduFDkA/pEl3aTm2EoAiUZE1Iltp6c+X1bB8kxPQW0mHDfVdYCpWTOzg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4873,29 +4750,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.14.tgz", - "integrity": "sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.14", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.14.tgz", - "integrity": "sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.3.1.tgz", + "integrity": "sha512-6Cn4xTNVxn9PWTHSbvf8zmcDhQW8lrLE1Xq5CJgmX6wEvdjS2S0KuE79Aiznv/jx51jpFJ98OuWyE+Bt+oG1MQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.14", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4903,16 +4764,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.17", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz", - "integrity": "sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.1.tgz", + "integrity": "sha512-r7bN6spQ+caZC8AnyvSxkRUb57zt2jhhRw3Z+2Ez8hjq6coIikDBFUUI/+CQ1xx9K6eX1Gx6wUKo4ylU66TIqw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.14", - "@smithy/querystring-builder": "^4.2.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4920,15 +4779,13 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.15.tgz", - "integrity": "sha512-0PJ4Al3fg2nM4qKrAIxyNcApgqHAXcBkN8FeizOz69z0rb26uZ6lMESYtxegaTlXB5Hj84JfwMPavMrwDMjucA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.3.1.tgz", + "integrity": "sha512-2fbltQVQYmGd0OzPv2oDMRF0pxkzeIx8cbpx2x6W3UJWGaEyUzVPxF4d0sDXZ/r2obg+RbTyhTidXWlPDsKRKw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.2", - "@smithy/chunked-blob-reader-native": "^4.2.3", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4936,15 +4793,13 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.14.tgz", - "integrity": "sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.3.1.tgz", + "integrity": "sha512-u0/zo11mg7yNneoYgTkH4sXwSmcBpbl49o4UNCtQ7hYsXxynsN25KYHmXzqi7TPk5HQL5klGnpU5koOY0O+9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4952,14 +4807,13 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.14.tgz", - "integrity": "sha512-tw4GANWkZPb6+BdD4Fgucqzey2+r73Z/GRo9zklsCdwrnxxumUV83ZIaBDdudV4Ylazw3EPTiJZhpX42105ruQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.3.1.tgz", + "integrity": "sha512-4NOnngIoXngbJw9By3u8KXRgqt4vYATpAobNBnNWxOREP7JY3kB0bUmbBNhZ7dtZV/b4auO1eFMD4cLj9OauVg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", - "@smithy/util-utf8": "^4.2.2", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4967,13 +4821,13 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.14.tgz", - "integrity": "sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.3.1.tgz", + "integrity": "sha512-cLmwtDoulyZvRepAfyV+3rx5oMvuh51dbE+6En3vGC09j3uVSRt1U4oguNu32ub3soGX0oYtBs8E7S2Q4SxTqg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4981,12 +4835,13 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", - "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.3.1.tgz", + "integrity": "sha512-9aVG6VjOFVFHC6Z4hGAzIIrsVWpp1QOO4ERQ2k1S19VrgCamUGIBE2ilAnMWCfr+mlowHlLRXBStsTk/2c5HfA==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -4994,14 +4849,13 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.14.tgz", - "integrity": "sha512-V2v0vx+h0iUSNG1Alt+GNBMSLGCrl9iVsdd+Ap67HPM9PN479x12V8LkuMoKImNZxn3MXeuyUjls+/7ZACZghA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.3.1.tgz", + "integrity": "sha512-98NalujRdzv6ggVQNYPWpL2K57UKeUB8roIr61u6+JiHd7KUlMQ+sn/vk6IG4XxEjw2vlC7eu/xjYXshUE4XXg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", - "@smithy/util-utf8": "^4.2.2", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5009,14 +4863,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz", - "integrity": "sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.3.1.tgz", + "integrity": "sha512-l4BUIP+wljW/Ar+0/QcGdmElI9lalrywfzNijXMBG34Z510FRzPyrDLx/blNTZOAm0C4Mvx5t/bf760CZo1ajg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.14", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5024,19 +4877,13 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.31", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.31.tgz", - "integrity": "sha512-KJPdCIN2kOE2aGmqZd7eUTr4WQwOGgtLWgUkswGJggs7rBcQYQjcZMEDa3C0DwbOiXS9L8/wDoQHkfxBYLfiLw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.5.1.tgz", + "integrity": "sha512-qtqu5TS+8Y18ZDkJoiXN5AMW1G4JAg1+xytzpsUvIR5a4EUsgd5HQg12lekEHWpm2TDUmOgg+hBaHK7dvyWdkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.16", - "@smithy/middleware-serde": "^4.2.19", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/shared-ini-file-loader": "^4.4.9", - "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-middleware": "^4.2.14", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5044,21 +4891,13 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.4.tgz", - "integrity": "sha512-/z7nIFK+ZRW3Ie/l3NEVGdy34LvmEOzBrtBAvgWZ/4PrKX0xP3kWm8pkfcwUk523SqxZhdbQP9JSXgjF77Uhpw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.6.1.tgz", + "integrity": "sha512-eTaQhxs0rfUuAkL2MSKrH8DTO7YCeAgrdN0B2/RAeuHmXQ+x52dk5qUBsi/jtcqe5LxItgq5AG5tI6Cp8c0sow==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.16", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/protocol-http": "^5.3.14", - "@smithy/service-error-classification": "^4.3.0", - "@smithy/smithy-client": "^4.12.12", - "@smithy/types": "^4.14.1", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.3", - "@smithy/uuid": "^1.1.2", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5066,15 +4905,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.19.tgz", - "integrity": "sha512-Q6y+W9h3iYVMCKWDoVge+OC1LKFqbEKaq8SIWG2X2bWJRpd/6dDLyICcNLT6PbjH3Rr6bmg/SeDB25XFOFfeEw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.3.1.tgz", + "integrity": "sha512-t7YtUe076zWVypVmy1rX91oKi2TFJCkpfFpfMhJFpEIRPP0iL9JxjeSyFQ+1bF45JUfDzOzslUJa150WcSrBug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.16", - "@smithy/protocol-http": "^5.3.14", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5082,13 +4919,13 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.14.tgz", - "integrity": "sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.3.1.tgz", + "integrity": "sha512-1jKwiKZxCMQNqmp4uVPYA6r+MLGjEtH07gnOUdPgbnjuOIrl/0JY/ICdpQtFgeBsQ/Up01gnSv8GYEL0fb8yvg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5096,15 +4933,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.14.tgz", - "integrity": "sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.4.1.tgz", + "integrity": "sha512-q7tDJEJXcaSG/8TVpu2f2l9bzxTzDM9geWmltbzsY6Hfh3yiuXXTpLIO8+zwYASPPVFaTJpdKwjSSjdoDoccgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5112,14 +4947,13 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.6.0.tgz", - "integrity": "sha512-P734cAoTFtuGfWa/R3jgBnGlURt2w9bYEBwQNMKf58sRM9RShirB2mKwLsVP+jlG/wxpCu8abv8NxdUts8tdLA==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.1.tgz", + "integrity": "sha512-BdEYko85f/ldp68uH8XEyIvo810xFk6eyPH81SRggTOApYHWA+Xu7B2EzLuHbe37WVLaUA7F1fWR3/zBeme2WA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.14", - "@smithy/querystring-builder": "^4.2.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -5128,13 +4962,13 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.14.tgz", - "integrity": "sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.3.1.tgz", + "integrity": "sha512-3NHoqVBhzpY2b4YBx9AqyKC4C8nnEjl5FyKuxrCjvnjinG0ODj+yg1xX360nNahT6wghYjSw1SooCt3kIdnqIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5142,69 +4976,27 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.14.tgz", - "integrity": "sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz", - "integrity": "sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.14.1", - "@smithy/util-uri-escape": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz", - "integrity": "sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.4.1.tgz", + "integrity": "sha512-8irPNCQgYxcSFp1aGcnDNFkTwSA+xPUaFq9V/v1+JXWu8sKr5b3cFmg2kBTkjkvypDmGeNffuNu0x5iqw1NoAw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/service-error-classification": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.3.0.tgz", - "integrity": "sha512-9jKsBYQRPR0xBLgc2415RsA5PIcP2sis4oBdN9s0D13cg1B1284mNTjx9Yc+BEERXzuPm5ObktI96OxsKh8E9A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.14.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.9.tgz", - "integrity": "sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.5.1.tgz", + "integrity": "sha512-FKoKxVzdFPhyynFI+SPTWrgOP60fZ4l1UwukWYj4eyhpSmEI7MJ6p58hawIIt9bwp+aek9NEm8Zika7E+GEoeg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5212,19 +5004,14 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.14.tgz", - "integrity": "sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.1.tgz", + "integrity": "sha512-728lZZEWYWubBESrfntNslZQYDKRlJDY4dcDnYbL50+gu35pGPLblu4S0/RH/RDLF6me1M87ECHsHELGL7dA/Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-uri-escape": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -5232,18 +5019,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.12.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.12.tgz", - "integrity": "sha512-daO7SJn4eM6ArbmrEs+/BTbH7af8AEbSL3OMQdcRvvn8tuUcR5rU2n6DgxIV53aXMS42uwK8NgKKCh5XgqYOPQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.13.1.tgz", + "integrity": "sha512-IcznNM8Qd9u1X3oflp12tkzyOB4HbT+sfYWlWiyEysgNzSHoWcHUUsTT4y1jjDjtVuuVVQbYks+g1kVd7u1eGQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.16", - "@smithy/middleware-endpoint": "^4.4.31", - "@smithy/middleware-stack": "^4.2.14", - "@smithy/protocol-http": "^5.3.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-stream": "^4.5.24", "tslib": "^2.6.2" }, "engines": { @@ -5264,14 +5047,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.14.tgz", - "integrity": "sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.3.1.tgz", + "integrity": "sha512-tuelFlF2PZR/wogFC58NIrPOv+Zna4N1+3kA161/33D1Gbwvl6Nh4WsAsW05ZyPp0O6CMGsdbb0S2b/qVjRMCw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.14", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5279,14 +5061,13 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", - "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.4.1.tgz", + "integrity": "sha512-fTHiwW2xbiRiWzfSk4IGAr3gNZCH4fuRYqt8+IuarsP/YON35576iVdePraZ6yJlFxlCL0eMec3/F7xYqoKzlg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5294,12 +5075,13 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", - "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.3.1.tgz", + "integrity": "sha512-1scg5t4nV3hV7CZs996/XHb80aDZ5YotH4NcvkW/w/rHj+cSz0aCIzwz8aUNKB4nCDPSHRCbrKoj+TvycYefmw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5307,12 +5089,13 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", - "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.3.1.tgz", + "integrity": "sha512-VRC8MKVPKrgUYThTA7ughcKMfjW6/X92H0wXGJoda0Apw4O5xbXL0GMLz40DTWlsb5hh2iItk6+XL72uJdxYcw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5320,89 +5103,82 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", - "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", - "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", + "node_modules/@smithy/util-buffer-from/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.48", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.48.tgz", - "integrity": "sha512-hxVRVPYaRDWa6YQdse1aWX1qrksmLsvNyGBKdc32q4jFzSjxYVNWfstknAfR228TnzS4tzgswXRuYIbhXBuXFQ==", + "node_modules/@smithy/util-config-provider": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.3.1.tgz", + "integrity": "sha512-lw6L5GF5+W19vO6o3fZwRT2cXEG+8b2LH0b9ppjDT6nIxjUgmljEQGninx5XorylwKZZ4XLVABeroJ8oaF9RmQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.14", - "@smithy/smithy-client": "^4.12.12", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.53", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.53.tgz", - "integrity": "sha512-ybgCk+9JdBq8pYC8Y6U5fjyS8e4sboyAShetxPNL0rRBtaVl56GSFAxsolVBIea1tXR4LPIzL8i6xqmcf0+DCQ==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.4.1.tgz", + "integrity": "sha512-1rA7w+LjK1WJClsffC81Z/ZtjFt22QsKhBjUYEnZsGVS2nOTfOENKBzdg4SxhdwFvBCjcbpjscUfXOPwE3UHWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.17", - "@smithy/credential-provider-imds": "^4.2.14", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/property-provider": "^4.2.14", - "@smithy/smithy-client": "^4.12.12", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.4.2.tgz", - "integrity": "sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.3.1.tgz", + "integrity": "sha512-1fk1wfQHBenQD5NitVKOFgW0wsISYAFPIXGyStJWAeCtMyRhgHYvtJxBk2rwGWA0L5QX6oM6yeHSLKPFMk59ww==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.14", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", - "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", + "node_modules/@smithy/util-endpoints": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.5.1.tgz", + "integrity": "sha512-yORYzJD5zoGbSDkAACr0dIjDiSEA3X8h8lggDENl1dkKpCG0TQIoItPBqtvuJHzFFjRXumcoH+/09xIuixGyCw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5410,13 +5186,13 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.14.tgz", - "integrity": "sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.3.1.tgz", + "integrity": "sha512-SRRMDcIgVXVhVbxviBaSZbuWuVW3jD08wv4ESV0V2oiw0Mki8TPVQ5IxwD3MvSTPg52QYsRP+JoMw5WdUdeWAg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5424,14 +5200,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.3.tgz", - "integrity": "sha512-idjUvd4M9Jj6rXkhqw4H4reHoweuK4ZxYWyOrEp4N2rOF5VtaOlQGLDQJva/8WanNXk9ScQtsAb7o5UHGvFm4A==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.4.1.tgz", + "integrity": "sha512-qkgWgwn1xw0GoY9Ea/B6FrYSPfHA0zyOtJkokwxZuvucRf2+2lfTut6adi4e4Y7LEAaxsFG7r6i05mtDCxbHKA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.3.0", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5439,32 +5214,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.24", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.24.tgz", - "integrity": "sha512-na5vv2mBSDzXewLEEoWGI7LQQkfpmFEomBsmOpzLFjqGctm0iMwXY5lAwesY9pIaErkccW0qzEOUcYP+WKneXg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/node-http-handler": "^4.6.0", - "@smithy/types": "^4.14.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.6.1.tgz", + "integrity": "sha512-GjZfEft0M0V3n2YM/LGkr5LeLd8gxHUIzW0rUz6VtTtlAq245GxHlJghvoPEjJHKTj255iHFAiA4IsIdK40Ueg==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5472,13 +5228,13 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.3.1.tgz", + "integrity": "sha512-FtRrSnriXtOs4+J8/y9SbQ1xmN71hrOsN/YJr5PQQj5nR1l7YNkGS/TEk4gr0WN7gyrUqw8/RFaYVjI18732ZA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5486,26 +5242,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.16.tgz", - "integrity": "sha512-GtclrKoZ3Lt7jPQ7aTIYKfjY92OgceScftVnkTsG8e1KV8rkvZgN+ny6YSRhd9hxB8rZtwVbmln7NTvE5O3GmQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.4.1.tgz", + "integrity": "sha512-G/gWDykZNL0NVcd1qXkoKm45jxJECp6q53DSomM5QKMsyAMEsGksVq+HwgonqYxfFJEzzHi6ljtWKXVS1pl0/Q==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.1", "tslib": "^2.6.2" }, "engines": { @@ -5584,9 +5327,9 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "dev": true, "license": "MIT", "optional": true, @@ -5676,9 +5419,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, "node_modules/@types/express": { @@ -5818,9 +5561,9 @@ } }, "node_modules/@types/node": { - "version": "22.19.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", - "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -5834,9 +5577,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -5936,17 +5679,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", - "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/type-utils": "8.59.0", - "@typescript-eslint/utils": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -5959,7 +5702,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.0", + "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -5975,16 +5718,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", - "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3" }, "engines": { @@ -6000,14 +5743,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", - "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.0", - "@typescript-eslint/types": "^8.59.0", + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" }, "engines": { @@ -6022,14 +5765,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", - "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6040,9 +5783,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", - "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "dev": true, "license": "MIT", "engines": { @@ -6057,15 +5800,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", - "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -6082,9 +5825,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", - "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, "license": "MIT", "engines": { @@ -6096,16 +5839,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", - "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.0", - "@typescript-eslint/tsconfig-utils": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -6124,16 +5867,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", - "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0" + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6148,13 +5891,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", - "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -6578,9 +6321,9 @@ } }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -6658,6 +6401,12 @@ "node": ">=14" } }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -6932,12 +6681,12 @@ } }, "node_modules/axios": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.1.tgz", - "integrity": "sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } @@ -7098,9 +6847,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz", - "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==", + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7146,9 +6895,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -7159,7 +6908,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -7192,9 +6941,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -7514,9 +7263,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001788", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", - "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true, "funding": [ { @@ -8661,9 +8410,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz", - "integrity": "sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==", + "version": "1.5.353", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz", + "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==", "dev": true, "license": "ISC" }, @@ -8702,14 +8451,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "version": "5.21.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", + "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -9006,9 +8755,9 @@ } }, "node_modules/eslint-config-oclif": { - "version": "6.0.159", - "resolved": "https://registry.npmjs.org/eslint-config-oclif/-/eslint-config-oclif-6.0.159.tgz", - "integrity": "sha512-tzfcFO1kYLJeuSgM4QOVW/GJROeAcd5Nwzx5dwonK4FECoKAArjZQ5ZY7Z+uK/nAABIym5ihxWgdkSrgqbJARg==", + "version": "6.0.164", + "resolved": "https://registry.npmjs.org/eslint-config-oclif/-/eslint-config-oclif-6.0.164.tgz", + "integrity": "sha512-LEJRa/q7FAIH8zeZJ16E3RghSU/kZEa6oBV8kxTSE57djsgSNcwf92NbhcPj6RaQ/eANIva8nWJ9h+FeeWUlew==", "dev": true, "license": "MIT", "dependencies": { @@ -9028,7 +8777,7 @@ "eslint-plugin-n": "^17.24.0", "eslint-plugin-perfectionist": "^4", "eslint-plugin-unicorn": "^56.0.1", - "typescript-eslint": "^8.58.2" + "typescript-eslint": "^8.59.2" }, "engines": { "node": ">=18.18.0" @@ -9750,9 +9499,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -9955,14 +9704,14 @@ } }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -9981,7 +9730,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -10059,9 +9808,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", @@ -10075,9 +9824,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", - "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", "dev": true, "funding": [ { @@ -10087,13 +9836,14 @@ ], "license": "MIT", "dependencies": { - "path-expression-matcher": "^1.1.3" + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" } }, "node_modules/fast-xml-parser": { - "version": "5.5.8", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz", - "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", "dev": true, "funding": [ { @@ -10103,9 +9853,10 @@ ], "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.2.0", - "strnum": "^2.2.0" + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" @@ -10622,9 +10373,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -10917,9 +10668,9 @@ "license": "MIT" }, "node_modules/graphql": { - "version": "16.13.2", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", - "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.0.tgz", + "integrity": "sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -12021,12 +11772,12 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -12555,16 +12306,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -14520,9 +14261,9 @@ } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", - "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14621,9 +14362,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", "dev": true, "license": "MIT" }, @@ -16486,9 +16227,9 @@ } }, "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", + "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -16501,34 +16242,40 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", + "@rollup/rollup-android-arm-eabi": "4.60.3", + "@rollup/rollup-android-arm64": "4.60.3", + "@rollup/rollup-darwin-arm64": "4.60.3", + "@rollup/rollup-darwin-x64": "4.60.3", + "@rollup/rollup-freebsd-arm64": "4.60.3", + "@rollup/rollup-freebsd-x64": "4.60.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", + "@rollup/rollup-linux-arm-musleabihf": "4.60.3", + "@rollup/rollup-linux-arm64-gnu": "4.60.3", + "@rollup/rollup-linux-arm64-musl": "4.60.3", + "@rollup/rollup-linux-loong64-gnu": "4.60.3", + "@rollup/rollup-linux-loong64-musl": "4.60.3", + "@rollup/rollup-linux-ppc64-gnu": "4.60.3", + "@rollup/rollup-linux-ppc64-musl": "4.60.3", + "@rollup/rollup-linux-riscv64-gnu": "4.60.3", + "@rollup/rollup-linux-riscv64-musl": "4.60.3", + "@rollup/rollup-linux-s390x-gnu": "4.60.3", + "@rollup/rollup-linux-x64-gnu": "4.60.3", + "@rollup/rollup-linux-x64-musl": "4.60.3", + "@rollup/rollup-openbsd-x64": "4.60.3", + "@rollup/rollup-openharmony-arm64": "4.60.3", + "@rollup/rollup-win32-arm64-msvc": "4.60.3", + "@rollup/rollup-win32-ia32-msvc": "4.60.3", + "@rollup/rollup-win32-x64-gnu": "4.60.3", + "@rollup/rollup-win32-x64-msvc": "4.60.3", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -16657,9 +16404,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -16843,6 +16590,18 @@ "node": ">=4" } }, + "node_modules/short-uuid": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-6.0.3.tgz", + "integrity": "sha512-UMZ3rYOoid307EqWsPTnoBUSOB51Fi28vUMPigUsSCmbaSvslyf/SlXZWOn4btj8tokhBTBkPFKVKKlIolEG1w==", + "license": "MIT", + "dependencies": { + "any-base": "^1.1.0" + }, + "engines": { + "node": ">=14.17.0" + } + }, "node_modules/shx": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", @@ -17650,9 +17409,9 @@ } }, "node_modules/strnum": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", - "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", "dev": true, "funding": [ { @@ -17699,9 +17458,9 @@ } }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -18292,16 +18051,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz", - "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.0", - "@typescript-eslint/parser": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/utils": "8.59.0" + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -18509,16 +18268,16 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { @@ -18863,6 +18622,22 @@ "node": ">=8" } }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -18880,9 +18655,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { diff --git a/package.json b/package.json index ea79b2a..19fb83e 100755 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ ], "dependencies": { "@apollo/client": "^3.14.0", - "@contentstack/cli-command": "^1.8.1", - "@contentstack/cli-utilities": "^1.18.2", + "@contentstack/cli-command": "^1.8.2", + "@contentstack/cli-utilities": "^1.18.3", "@oclif/core": "^4.2.7", "@oclif/plugin-help": "^6.2.25", "@rollup/plugin-commonjs": "^28.0.2", @@ -107,7 +107,6 @@ }, "overrides": { "lodash": "^4.18.1", - "axios": "^1.13.5", "form-data": "4.0.4", "ajv": "^8.18.0", "eslint": { From 781d99d56fefadf0c1c259330ce58a31d7c916e2 Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Wed, 13 May 2026 14:34:43 +0530 Subject: [PATCH 6/9] Revert "CL-1753 | refactor rollback command: rename init method, enhance error handling, and update method names for clarity" This reverts commit 3b9750a47c634d123ced14aa00d8dc270b1a213a. --- src/commands/launch/rollback.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts index da447ab..29aa5f0 100644 --- a/src/commands/launch/rollback.ts +++ b/src/commands/launch/rollback.ts @@ -44,18 +44,16 @@ export default class Rollback extends BaseCommand { }), }; - async init(): Promise { - await super.init(); + async run(): Promise { this.logger = new Logger(this.sharedConfig); this.log = this.logger.log.bind(this.logger); - await this.prepareApiClients(); - } - async run(): Promise { if (!this.flags.environment) { await this.getConfig(); } + await this.prepareApiClients(); + if (!this.sharedConfig.currentConfig?.uid) { await selectOrg({ log: this.log, @@ -84,7 +82,7 @@ export default class Rollback extends BaseCommand { async rollbackDeployment(): Promise { const environment = await this.resolveEnvironment(); const currentLive = await this.fetchCurrentLiveDeployment(environment.uid); - const eligibleSorted = this.getEligibleSortedDeployments(environment, currentLive?.uid); + const eligibleSorted = this.getEligibleSorted(environment, currentLive?.uid); if (isEmpty(eligibleSorted)) { this.log('No rollback-eligible deployments are available for this environment.', 'error'); @@ -107,7 +105,7 @@ export default class Rollback extends BaseCommand { return; } - let rolledBack: { deploymentNumber: number; uid: string }; + let rolledBack: any; try { const { data } = await this.apolloClient.mutate({ mutation: rollbackDeploymentMutation, @@ -120,9 +118,8 @@ export default class Rollback extends BaseCommand { }, }); rolledBack = data?.deployment; - } catch (error: unknown) { - const err = error as { graphQLErrors?: { extensions?: { exception?: { name?: string } } }[]; message?: string }; - const code = err?.graphQLErrors?.[0]?.extensions?.exception?.name || err?.message; + } catch (error: any) { + const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; this.log(`Rollback failed. Please try again. (${code})`, 'error'); process.exit(1); } @@ -246,11 +243,11 @@ export default class Rollback extends BaseCommand { } /** - * @method getEligibleSortedDeployments - eligible deployments excluding current live, sorted by number desc + * @method getEligibleSorted - eligible deployments excluding current live, sorted by number desc * * @memberof Rollback */ - getEligibleSortedDeployments(environment: any, currentLiveUid?: string): any[] { + getEligibleSorted(environment: any, currentLiveUid?: string): any[] { const deployments = map(environment?.deployments?.edges, 'node'); const eligible = filter( deployments, From aa6f710c56eab680fb0a015b2e44e1f10c02cb95 Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Wed, 13 May 2026 14:34:43 +0530 Subject: [PATCH 7/9] Revert "CL-1753 | add unit tests for rollback command and enhance environment resolution logic" This reverts commit 189764d6d56059b46925101d832b84fc1a4aab73. --- .talismanrc | 2 - src/commands/launch/rollback.test.ts | 233 --------------------------- src/commands/launch/rollback.ts | 67 ++++---- src/graphql/queries.ts | 15 +- 4 files changed, 35 insertions(+), 282 deletions(-) delete mode 100644 src/commands/launch/rollback.test.ts diff --git a/.talismanrc b/.talismanrc index 70638de..fb07040 100644 --- a/.talismanrc +++ b/.talismanrc @@ -6,6 +6,4 @@ fileignoreconfig: checksum: 9db6c02ad35a0367343cd753b916dd64db4a9efd24838201d2e1113ed19c9b62 - filename: package-lock.json checksum: 43c0eecc2192095c8fb5bc524b7dafa33a6141ddd3923d41ffb15ec025bea9a9 -- filename: src/commands/launch/rollback.test.ts - checksum: 561d709dfaa046af3afaf73e8570211d1b63ca8fdf23d3a6ffec0fff7587eacd version: "1.0" \ No newline at end of file diff --git a/src/commands/launch/rollback.test.ts b/src/commands/launch/rollback.test.ts deleted file mode 100644 index 0c1081d..00000000 --- a/src/commands/launch/rollback.test.ts +++ /dev/null @@ -1,233 +0,0 @@ -import Rollback from './rollback'; -import { Logger } from '../../util'; -import { cliux } from '@contentstack/cli-utilities'; - -jest.mock('../../util', () => { - const actual = jest.requireActual('../../util'); - return { - ...actual, - Logger: jest.fn(), - selectOrg: jest.fn(), - selectProject: jest.fn(), - }; -}); - -jest.mock('@contentstack/cli-utilities', () => { - const actual = jest.requireActual('@contentstack/cli-utilities'); - return { - ...actual, - configHandler: { - get: jest.fn((key) => { - if (key === 'authtoken') return 'dummy-token'; - if (key === 'authorisationType') return 'OAuth'; - if (key === 'oauthAccessToken') return 'dummy-oauth-token'; - return undefined; - }), - }, - cliux: { - ...actual.cliux, - inquire: jest.fn(), - print: jest.fn(), - }, - }; -}); - -const targetDeployment = { - uid: 'target-uid', - status: 'ARCHIVED', - gitBranch: 'main', - commitHash: 'abcdef1', - createdAt: '2026-04-29T00:00:00Z', - commitMessage: 'previous good build', - deploymentUrl: 'https://example.com', - deploymentNumber: 2, - isRollbackEligible: true, -}; - -const liveDeployment = { - ...targetDeployment, - uid: 'live-uid', - status: 'LIVE', - deploymentNumber: 3, -}; - -const environmentsResponse = { - data: { - Environments: { - edges: [ - { - node: { - uid: 'env-uid', - name: 'Default', - deployments: { - edges: [ - { node: liveDeployment }, - { node: targetDeployment }, - ], - }, - }, - }, - ], - }, - }, -}; - -const buildCommand = (flags: Record = {}, queryImpl?: jest.Mock, mutateImpl?: jest.Mock) => { - const cmd = new Rollback([], {} as any); - (cmd as any).flags = flags; - (cmd as any).log = jest.fn(); - (cmd as any).logger = { log: jest.fn() }; - (cmd as any).sharedConfig = { currentConfig: { uid: 'project-uid' } }; - (cmd as any).apolloClient = { - query: queryImpl || jest.fn(), - mutate: mutateImpl || jest.fn(), - }; - return cmd; -}; - -describe('Rollback Command', () => { - let exitMock: jest.SpyInstance; - - beforeEach(() => { - (Logger as jest.Mock).mockImplementation(() => ({ log: jest.fn() })); - exitMock = jest.spyOn(process, 'exit').mockImplementation(((code?: number) => { - throw new Error(`process.exit:${code}`); - }) as any); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it('exits when no rollback-eligible deployments are available', async () => { - const noEligibleResponse = { - data: { - Environments: { - edges: [ - { - node: { - uid: 'env-uid', - name: 'Default', - deployments: { edges: [{ node: liveDeployment }] }, - }, - }, - ], - }, - }, - }; - const query = jest.fn().mockResolvedValueOnce(noEligibleResponse); - const mutate = jest.fn(); - const cmd = buildCommand({ environment: 'Default' }, query, mutate); - jest - .spyOn(cmd as any, 'fetchCurrentLiveDeployment') - .mockResolvedValueOnce(liveDeployment); - - await expect((cmd as any).rollbackDeployment()).rejects.toThrow('process.exit:1'); - - expect(mutate).not.toHaveBeenCalled(); - expect(exitMock).toHaveBeenCalledWith(1); - expect((cmd as any).log).toHaveBeenCalledWith( - 'No rollback-eligible deployments are available for this environment.', - 'error', - ); - }); - - it('exits when --deployment flag does not match an eligible deployment', async () => { - const query = jest.fn().mockResolvedValueOnce(environmentsResponse); - const mutate = jest.fn(); - const cmd = buildCommand( - { environment: 'Default', deployment: 'unknown-uid' }, - query, - mutate, - ); - jest - .spyOn(cmd as any, 'fetchCurrentLiveDeployment') - .mockResolvedValueOnce(liveDeployment); - - await expect((cmd as any).rollbackDeployment()).rejects.toThrow('process.exit:1'); - - expect(mutate).not.toHaveBeenCalled(); - expect(exitMock).toHaveBeenCalledWith(1); - expect((cmd as any).log).toHaveBeenCalledWith( - 'Provided deployment UID is not rollback-eligible or does not exist.', - 'error', - ); - }); - - it('skips the mutation when the user does not confirm', async () => { - const query = jest.fn().mockResolvedValueOnce(environmentsResponse); - const mutate = jest.fn(); - const cmd = buildCommand( - { environment: 'Default', deployment: 'target-uid', reason: 'audit' }, - query, - mutate, - ); - jest - .spyOn(cmd as any, 'fetchCurrentLiveDeployment') - .mockResolvedValueOnce(liveDeployment); - (cliux.inquire as jest.Mock).mockResolvedValueOnce(false); // confirm prompt - - await (cmd as any).rollbackDeployment(); - - expect(mutate).not.toHaveBeenCalled(); - }); - - it('fires the rollback mutation and polls until LIVE on success', async () => { - const query = jest.fn().mockResolvedValueOnce(environmentsResponse); - const mutate = jest.fn().mockResolvedValueOnce({ - data: { deployment: { ...targetDeployment, status: 'QUEUED' } }, - }); - const cmd = buildCommand( - { environment: 'Default', deployment: 'target-uid', reason: 'restoring' }, - query, - mutate, - ); - jest - .spyOn(cmd as any, 'fetchCurrentLiveDeployment') - .mockResolvedValueOnce(liveDeployment); - jest.spyOn(cmd as any, 'pollDeploymentStatus').mockResolvedValueOnce('LIVE'); - (cliux.inquire as jest.Mock).mockResolvedValueOnce(true); - - await (cmd as any).rollbackDeployment(); - - expect(mutate).toHaveBeenCalledTimes(1); - const variables = mutate.mock.calls[0][0].variables; - expect(variables).toEqual({ - input: { - deployment: 'target-uid', - environment: 'env-uid', - reason: 'restoring', - }, - }); - expect((cmd as any).pollDeploymentStatus).toHaveBeenCalledWith('env-uid', 'target-uid'); - expect(exitMock).not.toHaveBeenCalled(); - }); - - it('logs an error and exits when the rollback mutation fails', async () => { - const query = jest.fn().mockResolvedValueOnce(environmentsResponse); - const error = Object.assign(new Error('boom'), { - graphQLErrors: [{ extensions: { exception: { name: 'DeploymentRollbackFailed' } } }], - }); - const mutate = jest.fn().mockRejectedValueOnce(error); - const cmd = buildCommand( - { environment: 'Default', deployment: 'target-uid' }, - query, - mutate, - ); - jest - .spyOn(cmd as any, 'fetchCurrentLiveDeployment') - .mockResolvedValueOnce(liveDeployment); - (cliux.inquire as jest.Mock) - .mockResolvedValueOnce('') // reason - .mockResolvedValueOnce(true); // confirm - - await expect((cmd as any).rollbackDeployment()).rejects.toThrow('process.exit:1'); - - expect(mutate).toHaveBeenCalledTimes(1); - expect(exitMock).toHaveBeenCalledWith(1); - expect((cmd as any).log).toHaveBeenCalledWith( - 'Rollback failed. Please try again. (DeploymentRollbackFailed)', - 'error', - ); - }); -}); diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts index 29aa5f0..1b4f7c9 100644 --- a/src/commands/launch/rollback.ts +++ b/src/commands/launch/rollback.ts @@ -194,37 +194,37 @@ export default class Rollback extends BaseCommand { */ async resolveEnvironment(): Promise { const environments = await this.apolloClient - .query({ - query: environmentsQuery, - variables: { skipRollbackData: false }, - }) + .query({ query: environmentsQuery }) .then(({ data: { Environments } }) => map(Environments.edges, 'node')) .catch((error) => { this.log(error?.message, 'error'); process.exit(1); }); - if (this.flags.environment) { - const environment = find( - environments, - ({ uid, name }) => uid === this.flags.environment || name === this.flags.environment, - ); - if (isEmpty(environment)) { - this.log('Environment(s) not found!', 'error'); - process.exit(1); - } - return environment; + let environment = find( + environments, + ({ uid, name }) => + uid === this.flags.environment || + name === this.flags.environment || + uid === this.sharedConfig.currentConfig?.environments?.[0]?.uid, + ); + + if (isEmpty(environment) && (this.flags.environment || this.sharedConfig.currentConfig?.environments?.[0]?.uid)) { + this.log('Environment(s) not found!', 'error'); + process.exit(1); + } else if (isEmpty(environment)) { + environment = await ux + .inquire({ + type: 'search-list', + name: 'Environment', + choices: map(environments, (row) => ({ ...row, value: row.name })), + message: 'Choose an environment', + }) + .then((name: any) => find(environments, { name }) as Record); } - // NOTE: rollback is destructive; never auto-select from saved config — always prompt. - return ux - .inquire({ - type: 'search-list', - name: 'Environment', - choices: map(environments, (row) => ({ ...row, value: row.name })), - message: 'Choose an environment', - }) - .then((name: any) => find(environments, { name }) as Record); + this.sharedConfig.environment = environment; + return environment; } /** @@ -271,15 +271,11 @@ export default class Rollback extends BaseCommand { return match; } - const choices = map(eligibleSorted, (d) => { - const message = (d.commitMessage || '').split('\n')[0].trim() || '—'; - const truncated = message.length > 60 ? `${message.slice(0, 57)}…` : message; - return { - ...d, - name: `#${d.deploymentNumber} | ${sourceLabel(d) || '—'} | ${truncated} | ${d.createdAt}`, - value: d.uid, - }; - }); + const choices = map(eligibleSorted, (d) => ({ + ...d, + name: `#${d.deploymentNumber} | ${sourceLabel(d) || '—'} | ${d.createdAt}`, + value: d.uid, + })); const selectedUid = await ux.inquire({ type: 'search-list', @@ -391,11 +387,8 @@ function formatDeployment(deployment?: any): string { } const number = deployment.deploymentNumber ? `#${deployment.deploymentNumber}` : deployment.uid; const source = sourceLabel(deployment); - const message = ((deployment.commitMessage || '').split('\n')[0] || '').trim(); - const truncated = message.length > 40 ? `${message.slice(0, 37)}…` : message; const createdAt = deployment.createdAt || ''; const numberCol = chalk.green(number.padEnd(6)); - const sourceCol = source ? chalk.cyan(source.padEnd(22)) : ''.padEnd(22); - const messageCol = truncated || chalk.dim('—'); - return `${numberCol} ${sourceCol} ${messageCol} ${chalk.dim(createdAt)}`; + const sourceCol = source ? chalk.cyan(source.padEnd(28)) : ''.padEnd(28); + return `${numberCol} ${sourceCol} ${chalk.dim(createdAt)}`; } diff --git a/src/graphql/queries.ts b/src/graphql/queries.ts index 1cb0e81..a4a7e7c 100755 --- a/src/graphql/queries.ts +++ b/src/graphql/queries.ts @@ -145,17 +145,12 @@ const latestLiveDeploymentQuery: DocumentNode = gql` environment deploymentNumber deploymentUrl - status - gitBranch - commitHash - commitMessage - createdAt } } `; const environmentsQuery: DocumentNode = gql` - query Environments($skipRollbackData: Boolean = true) { + query Environments { Environments { edges { node { @@ -166,14 +161,14 @@ const environmentsQuery: DocumentNode = gql` edges { node { uid + status + gitBranch + commitHash createdAt commitMessage deploymentUrl deploymentNumber - status @skip(if: $skipRollbackData) - gitBranch @skip(if: $skipRollbackData) - commitHash @skip(if: $skipRollbackData) - isRollbackEligible @skip(if: $skipRollbackData) + isRollbackEligible } } } From ec5e3b07c06a77fc6ca571a67b5b92ecb6deda13 Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Wed, 13 May 2026 14:34:43 +0530 Subject: [PATCH 8/9] Revert "CL-1753 | enhance rollback command with deployment status polling and improved error handling" This reverts commit 99804546071bb3e6970e0082af6fe5bf0df4935a. --- src/commands/launch/rollback.ts | 85 +++++---------------------------- 1 file changed, 13 insertions(+), 72 deletions(-) diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts index 1b4f7c9..4b6a89a 100644 --- a/src/commands/launch/rollback.ts +++ b/src/commands/launch/rollback.ts @@ -7,7 +7,6 @@ import { FlagInput, Flags, cliux as ux } from '@contentstack/cli-utilities'; import { BaseCommand } from '../../base-command'; import { - deploymentQuery, environmentsQuery, latestLiveDeploymentQuery, rollbackDeploymentMutation, @@ -105,9 +104,8 @@ export default class Rollback extends BaseCommand { return; } - let rolledBack: any; - try { - const { data } = await this.apolloClient.mutate({ + await this.apolloClient + .mutate({ mutation: rollbackDeploymentMutation, variables: { input: { @@ -116,75 +114,18 @@ export default class Rollback extends BaseCommand { ...(reason ? { reason } : {}), }, }, + }) + .then(({ data: { deployment: rolledBack } }) => { + ux.print(''); + ux.print(chalk.green('✔ Instant rollback to a previous deployment is successful.')); + ux.print(` New deployment: ${chalk.cyan(rolledBack.uid)} status: ${chalk.cyan(rolledBack.status)}`); + ux.print(''); + }) + .catch((error) => { + const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; + this.log(`Rollback failed. Please try again. (${code})`, 'error'); + process.exit(1); }); - rolledBack = data?.deployment; - } catch (error: any) { - const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; - this.log(`Rollback failed. Please try again. (${code})`, 'error'); - process.exit(1); - } - - ux.print(''); - ux.print( - `Promoting deployment ${chalk.cyan(`#${rolledBack.deploymentNumber}`)} ` - + chalk.dim(`(${rolledBack.uid})`) + '…', - ); - - const finalStatus = await this.pollDeploymentStatus(environment.uid, target.uid); - - ux.print(''); - if (finalStatus === 'LIVE') { - ux.print(chalk.green('✔ Instant rollback to a previous deployment is successful.')); - const label = `${chalk.cyan(`#${rolledBack.deploymentNumber}`)} ${chalk.dim(`(${rolledBack.uid})`)}`; - ux.print(` Deployment ${label} is now ${chalk.green('LIVE')}.`); - } else if (finalStatus === 'FAILED' || finalStatus === 'CANCELLED') { - ux.print(chalk.red(`✘ Rollback ended with status: ${finalStatus}.`)); - process.exit(1); - } else { - ux.print(chalk.yellow(`Rollback is still in progress (status: ${finalStatus}).`)); - ux.print(chalk.dim(' Check the Launch dashboard for the final status.')); - } - ux.print(''); - } - - /** - * @method pollDeploymentStatus - poll the target deployment until it goes LIVE or terminal/timeout - * - * @memberof Rollback - */ - async pollDeploymentStatus(environmentUid: string, deploymentUid: string): Promise { - const intervalMs = 3000; - const timeoutMs = 90000; - const start = Date.now(); - const terminal = new Set(['LIVE', 'FAILED', 'CANCELLED']); - - while (Date.now() - start < timeoutMs) { - try { - const { data } = await this.apolloClient.query({ - query: deploymentQuery, - variables: { query: { environment: environmentUid, uid: deploymentUid } }, - fetchPolicy: 'no-cache', - }); - const status = data?.Deployment?.status; - if (status && terminal.has(status)) { - return status; - } - } catch (error: any) { - this.log(`Failed to fetch deployment status: ${error?.message}`, 'warn'); - } - await new Promise((resolve) => setTimeout(resolve, intervalMs)); - } - - try { - const { data } = await this.apolloClient.query({ - query: deploymentQuery, - variables: { query: { environment: environmentUid, uid: deploymentUid } }, - fetchPolicy: 'no-cache', - }); - return data?.Deployment?.status || 'UNKNOWN'; - } catch { - return 'UNKNOWN'; - } } /** From f1bb6ebc294cc95c245ec9ae0f8ba9b810ce74d6 Mon Sep 17 00:00:00 2001 From: Aryan Bansal Date: Wed, 13 May 2026 14:34:43 +0530 Subject: [PATCH 9/9] Revert "CL-1753 | + Anuja | + venky | feat: add rollback command for previous deployments with GraphQL integration" This reverts commit ada3a1884169a3bb2b9915eca37bcd79d4272f3f. --- src/commands/launch/rollback.ts | 335 -------------------------------- src/graphql/mutation.ts | 16 -- src/graphql/queries.ts | 4 - 3 files changed, 355 deletions(-) delete mode 100644 src/commands/launch/rollback.ts diff --git a/src/commands/launch/rollback.ts b/src/commands/launch/rollback.ts deleted file mode 100644 index 4b6a89a..00000000 --- a/src/commands/launch/rollback.ts +++ /dev/null @@ -1,335 +0,0 @@ -import chalk from 'chalk'; -import map from 'lodash/map'; -import find from 'lodash/find'; -import filter from 'lodash/filter'; -import isEmpty from 'lodash/isEmpty'; -import { FlagInput, Flags, cliux as ux } from '@contentstack/cli-utilities'; - -import { BaseCommand } from '../../base-command'; -import { - environmentsQuery, - latestLiveDeploymentQuery, - rollbackDeploymentMutation, -} from '../../graphql'; -import { Logger, selectOrg, selectProject } from '../../util'; - -export default class Rollback extends BaseCommand { - static description = 'Roll back to previous deployment'; - - static examples = [ - '$ <%= config.bin %> <%= command.id %>', - '$ <%= config.bin %> <%= command.id %> -d "current working directory"', - '$ <%= config.bin %> <%= command.id %> -c "path to the local config file"', - // eslint-disable-next-line max-len - '$ <%= config.bin %> <%= command.id %> -e "environment number or uid" --deployment= --org= --project= --reason="restoring previous build"', - ]; - - static flags: FlagInput = { - org: Flags.string({ - description: '[Optional] Provide the organization UID', - }), - project: Flags.string({ - description: '[Optional] Provide the project UID', - }), - environment: Flags.string({ - char: 'e', - description: 'Environment name or UID', - }), - deployment: Flags.string({ - description: '[Optional] Deployment UID to roll back to', - }), - reason: Flags.string({ - description: '[Optional] Reason for the rollback (saved to audit log)', - }), - }; - - async run(): Promise { - this.logger = new Logger(this.sharedConfig); - this.log = this.logger.log.bind(this.logger); - - if (!this.flags.environment) { - await this.getConfig(); - } - - await this.prepareApiClients(); - - if (!this.sharedConfig.currentConfig?.uid) { - await selectOrg({ - log: this.log, - flags: this.flags, - config: this.sharedConfig, - managementSdk: this.managementSdk, - }); - await this.prepareApiClients(); // NOTE update org-id in header - await selectProject({ - log: this.log, - flags: this.flags, - config: this.sharedConfig, - apolloClient: this.apolloClient, - }); - await this.prepareApiClients(); // NOTE update project-id in header - } - - await this.rollbackDeployment(); - } - - /** - * @method rollbackDeployment - resolve env, run select + review steps, fire mutation - * - * @memberof Rollback - */ - async rollbackDeployment(): Promise { - const environment = await this.resolveEnvironment(); - const currentLive = await this.fetchCurrentLiveDeployment(environment.uid); - const eligibleSorted = this.getEligibleSorted(environment, currentLive?.uid); - - if (isEmpty(eligibleSorted)) { - this.log('No rollback-eligible deployments are available for this environment.', 'error'); - process.exit(1); - } - - this.printSelectStep(environment, currentLive, eligibleSorted); - const target = await this.selectDeployment(eligibleSorted); - - this.printReviewStep(currentLive, target, eligibleSorted); - const reason = await this.promptReason(); - const confirmed = await ux.inquire({ - type: 'confirm', - name: 'confirm', - message: 'Confirm & Rollback?', - }); - - if (!confirmed) { - ux.print(chalk.yellow('Rollback aborted.')); - return; - } - - await this.apolloClient - .mutate({ - mutation: rollbackDeploymentMutation, - variables: { - input: { - deployment: target.uid, - environment: environment.uid, - ...(reason ? { reason } : {}), - }, - }, - }) - .then(({ data: { deployment: rolledBack } }) => { - ux.print(''); - ux.print(chalk.green('✔ Instant rollback to a previous deployment is successful.')); - ux.print(` New deployment: ${chalk.cyan(rolledBack.uid)} status: ${chalk.cyan(rolledBack.status)}`); - ux.print(''); - }) - .catch((error) => { - const code = error?.graphQLErrors?.[0]?.extensions?.exception?.name || error?.message; - this.log(`Rollback failed. Please try again. (${code})`, 'error'); - process.exit(1); - }); - } - - /** - * @method resolveEnvironment - resolve environment via flag, config, or prompt - * - * @memberof Rollback - */ - async resolveEnvironment(): Promise { - const environments = await this.apolloClient - .query({ query: environmentsQuery }) - .then(({ data: { Environments } }) => map(Environments.edges, 'node')) - .catch((error) => { - this.log(error?.message, 'error'); - process.exit(1); - }); - - let environment = find( - environments, - ({ uid, name }) => - uid === this.flags.environment || - name === this.flags.environment || - uid === this.sharedConfig.currentConfig?.environments?.[0]?.uid, - ); - - if (isEmpty(environment) && (this.flags.environment || this.sharedConfig.currentConfig?.environments?.[0]?.uid)) { - this.log('Environment(s) not found!', 'error'); - process.exit(1); - } else if (isEmpty(environment)) { - environment = await ux - .inquire({ - type: 'search-list', - name: 'Environment', - choices: map(environments, (row) => ({ ...row, value: row.name })), - message: 'Choose an environment', - }) - .then((name: any) => find(environments, { name }) as Record); - } - - this.sharedConfig.environment = environment; - return environment; - } - - /** - * @method fetchCurrentLiveDeployment - fetch the currently live deployment for the environment - * - * @memberof Rollback - */ - async fetchCurrentLiveDeployment(environmentUid: string): Promise { - return this.apolloClient - .query({ - query: latestLiveDeploymentQuery, - variables: { query: { environment: environmentUid } }, - }) - .then(({ data }) => data?.latestLiveDeployment) - .catch(() => undefined); - } - - /** - * @method getEligibleSorted - eligible deployments excluding current live, sorted by number desc - * - * @memberof Rollback - */ - getEligibleSorted(environment: any, currentLiveUid?: string): any[] { - const deployments = map(environment?.deployments?.edges, 'node'); - const eligible = filter( - deployments, - (d) => d.isRollbackEligible && d.uid !== currentLiveUid, - ); - return [...eligible].sort((a, b) => (b.deploymentNumber || 0) - (a.deploymentNumber || 0)); - } - - /** - * @method selectDeployment - resolve target via --deployment flag or interactive picker - * - * @memberof Rollback - */ - async selectDeployment(eligibleSorted: any[]): Promise { - if (this.flags.deployment) { - const match = find(eligibleSorted, ({ uid }) => uid === this.flags.deployment); - if (isEmpty(match)) { - this.log('Provided deployment UID is not rollback-eligible or does not exist.', 'error'); - process.exit(1); - } - return match; - } - - const choices = map(eligibleSorted, (d) => ({ - ...d, - name: `#${d.deploymentNumber} | ${sourceLabel(d) || '—'} | ${d.createdAt}`, - value: d.uid, - })); - - const selectedUid = await ux.inquire({ - type: 'search-list', - name: 'Deployment', - choices, - message: 'Select a version to restore', - }); - - return find(eligibleSorted, { uid: selectedUid }) as Record; - } - - /** - * @method promptReason - prompt for rollback reason unless provided via --reason flag - * - * @memberof Rollback - */ - async promptReason(): Promise { - if (this.flags.reason) { - return this.flags.reason.trim() || undefined; - } - const input = await ux.inquire({ - type: 'input', - name: 'reason', - message: 'Reason (saved to audit log) — press enter to skip:', - }); - const trimmed = (input || '').trim(); - return trimmed ? trimmed : undefined; - } - - /** - * @method printSelectStep - mirror the UI "select" step heading and table - * - * @memberof Rollback - */ - printSelectStep(environment: any, currentLive: any, eligibleSorted: any[]): void { - ux.print(''); - ux.print(chalk.bold.underline('Roll back to previous deployment')); - ux.print(`${chalk.dim('Environment:')} ${chalk.cyan(environment.name)}`); - ux.print(''); - ux.print(chalk.bold('Currently live')); - ux.print(` ${formatDeployment(currentLive)}`); - ux.print(''); - ux.print(chalk.bold('Select a version to restore')); - ux.print(chalk.dim('Choose a previously successful deployment to ensure stability.')); - const count = eligibleSorted.length; - ux.print(chalk.dim(`(${count} eligible deployment${count === 1 ? '' : 's'} available)`)); - ux.print(''); - } - - /** - * @method printReviewStep - mirror the UI "review" step warnings, skips info, and summary - * - * @memberof Rollback - */ - printReviewStep(currentLive: any, target: any, eligibleSorted: any[]): void { - ux.print(''); - ux.print(chalk.bold.underline('Review rollback')); - ux.print(''); - ux.print('You are about to replace your live site with the version below.'); - ux.print('This build will be pushed to the edge immediately.'); - ux.print(''); - ux.print( - `${chalk.yellow.bold('Note:')} The rolled back instance will use the environment variables`, - ); - ux.print(' associated with the selected deployment.'); - - const targetIndex = eligibleSorted.findIndex((d) => d.uid === target.uid); - const skipped = targetIndex > 0 ? eligibleSorted.slice(0, targetIndex) : []; - if (skipped.length > 0) { - const list = skipped.map((d) => `#${d.deploymentNumber}`).join(', '); - const noun = skipped.length === 1 ? 'good deployment' : 'good deployments'; - const verb = skipped.length === 1 ? 'stays' : 'stay'; - ux.print(''); - ux.print( - `${chalk.blue('ⓘ')} Selecting #${target.deploymentNumber} skips ${skipped.length} ${noun} — ${list}`, - ); - ux.print(` ${verb} in history and can be restored later.`); - } - - ux.print(''); - ux.print(` ${chalk.bold('Current Live')} ${formatDeployment(currentLive)}`); - ux.print(` ${chalk.bold('Roll back to')} ${formatDeployment(target)}`); - ux.print(''); - ux.print( - chalk.dim('A new deployment may be initiated if any automations/commits/webhooks are triggered.'), - ); - ux.print(''); - } -} - -function shortHash(hash?: string): string { - return hash ? hash.substring(0, 7) : ''; -} - -function sourceLabel(deployment?: any): string { - if (!deployment) { - return ''; - } - const hash = shortHash(deployment.commitHash); - if (deployment.gitBranch && hash) { - return `${deployment.gitBranch} - ${hash}`; - } - return deployment.gitBranch || hash || ''; -} - -function formatDeployment(deployment?: any): string { - if (!deployment) { - return chalk.dim('(none)'); - } - const number = deployment.deploymentNumber ? `#${deployment.deploymentNumber}` : deployment.uid; - const source = sourceLabel(deployment); - const createdAt = deployment.createdAt || ''; - const numberCol = chalk.green(number.padEnd(6)); - const sourceCol = source ? chalk.cyan(source.padEnd(28)) : ''.padEnd(28); - return `${numberCol} ${sourceCol} ${chalk.dim(createdAt)}`; -} diff --git a/src/graphql/mutation.ts b/src/graphql/mutation.ts index fac8510..97bc3f6 100755 --- a/src/graphql/mutation.ts +++ b/src/graphql/mutation.ts @@ -76,24 +76,8 @@ const importProjectMutation: DocumentNode = gql` } `; -const rollbackDeploymentMutation: DocumentNode = gql` - mutation RollbackDeployment($input: RollbackDeploymentInput!) { - deployment: rollbackDeployment(input: $input) { - uid - status - createdAt - updatedAt - commitHash - commitMessage - deploymentUrl - deploymentNumber - } - } -`; - export { importProjectMutation, createDeploymentMutation, - rollbackDeploymentMutation, createSignedUploadUrlMutation, }; diff --git a/src/graphql/queries.ts b/src/graphql/queries.ts index a4a7e7c..c27debe 100755 --- a/src/graphql/queries.ts +++ b/src/graphql/queries.ts @@ -161,14 +161,10 @@ const environmentsQuery: DocumentNode = gql` edges { node { uid - status - gitBranch - commitHash createdAt commitMessage deploymentUrl deploymentNumber - isRollbackEligible } } }