diff --git a/.github/workflows/issues-jira.yml b/.github/workflows/issues-jira.yml deleted file mode 100644 index 7bf04694d..000000000 --- a/.github/workflows/issues-jira.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Create Jira Ticket for Github Issue - -on: - issues: - types: [opened] - -jobs: - issue-jira: - runs-on: ubuntu-latest - steps: - - - name: Login to Jira - uses: atlassian/gajira-login@master - env: - JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} - JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} - JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} - - - name: Create Jira Issue - id: create_jira - uses: atlassian/gajira-create@master - with: - project: ${{ secrets.JIRA_PROJECT }} - issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} - summary: Github | Issue | ${{ github.event.repository.name }} | ${{ github.event.issue.title }} - description: | - *GitHub Issue:* ${{ github.event.issue.html_url }} - - *Description:* - ${{ github.event.issue.body }} - fields: "${{ secrets.ISSUES_JIRA_FIELDS }}" \ No newline at end of file diff --git a/.talismanrc b/.talismanrc index ebb75cf2d..d4b4f5124 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,10 +1,4 @@ fileignoreconfig: - filename: pnpm-lock.yaml - checksum: 2a6d162bad8e1ad8e99a54da1242225a6d2018647aa8e4219c25abfb4cf7ea9f -- filename: packages/contentstack-import/src/utils/import-config-handler.ts - checksum: 999092528b445b6e9de6883150f02b56bf5050dc64129335d84246c157bfe303 -- filename: packages/contentstack-import-setup/src/utils/import-config-handler.ts - checksum: c13ca4996b3767fae9d2716fe9ae7d90d98b26012e064f42ea9fdd054f684761 -- filename: packages/contentstack-export/src/utils/export-config-handler.ts - checksum: 68351337b78f0962475498946fe34245a681182db756528c9ff6fab7153392e3 + checksum: 9756a3aa8a948bfd66a5fdc371f720ef380da007f0b8e6df348cafbd3d7d8a76 version: "" diff --git a/packages/contentstack-apps-cli/package.json b/packages/contentstack-apps-cli/package.json index 8360ae5fd..0a31c8586 100644 --- a/packages/contentstack-apps-cli/package.json +++ b/packages/contentstack-apps-cli/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/apps-cli", - "version": "2.0.0-beta.3", + "version": "2.0.0-beta.4", "description": "App ClI", "author": "Contentstack CLI", "homepage": "https://github.com/contentstack/cli-plugins/tree/main/packages/contentstack-apps-cli", @@ -22,9 +22,9 @@ ], "dependencies": { "@apollo/client": "^3.14.1", - "@contentstack/cli-command": "~2.0.0-beta.9", + "@contentstack/cli-command": "~2.0.0-beta.10", "@contentstack/cli-launch": "^1.11.1", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "adm-zip": "^0.5.18", "chalk": "^5.6.2", "lodash": "^4.18.1", diff --git a/packages/contentstack-asset-management/package.json b/packages/contentstack-asset-management/package.json index 5fa3d281a..069767c6b 100644 --- a/packages/contentstack-asset-management/package.json +++ b/packages/contentstack-asset-management/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-asset-management", - "version": "1.0.0-beta.6", + "version": "1.0.0-beta.7", "description": "Contentstack Assets API adapter for export and import", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -30,7 +30,7 @@ ], "license": "MIT", "dependencies": { - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "lodash": "^4.18.1" }, "oclif": { diff --git a/packages/contentstack-asset-management/test/unit/import/asset-types.test.ts b/packages/contentstack-asset-management/test/unit/import/asset-types.test.ts index c3252526d..871ef9088 100644 --- a/packages/contentstack-asset-management/test/unit/import/asset-types.test.ts +++ b/packages/contentstack-asset-management/test/unit/import/asset-types.test.ts @@ -13,6 +13,7 @@ describe('ImportAssetTypes', () => { }; const importContext: ImportContext = { spacesRootPath: '/tmp/import/spaces', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-1', host: 'https://api.contentstack.io/v3', org_uid: 'org-1', diff --git a/packages/contentstack-asset-management/test/unit/import/assets.test.ts b/packages/contentstack-asset-management/test/unit/import/assets.test.ts index d60a758ae..5a02fb8c6 100644 --- a/packages/contentstack-asset-management/test/unit/import/assets.test.ts +++ b/packages/contentstack-asset-management/test/unit/import/assets.test.ts @@ -16,6 +16,7 @@ describe('ImportAssets', () => { }; const importContext: ImportContext = { spacesRootPath: '/tmp/import/spaces', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-1', host: 'https://api.contentstack.io/v3', org_uid: 'org-1', diff --git a/packages/contentstack-asset-management/test/unit/import/base.test.ts b/packages/contentstack-asset-management/test/unit/import/base.test.ts index ddbab234e..eee4c3c9b 100644 --- a/packages/contentstack-asset-management/test/unit/import/base.test.ts +++ b/packages/contentstack-asset-management/test/unit/import/base.test.ts @@ -28,6 +28,7 @@ describe('CSAssetsImportAdapter (base)', () => { }; const importContext: ImportContext = { spacesRootPath: '/tmp/import/spaces', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-1', host: 'https://api.contentstack.io/v3', org_uid: 'org-1', diff --git a/packages/contentstack-asset-management/test/unit/import/fields.test.ts b/packages/contentstack-asset-management/test/unit/import/fields.test.ts index c45ef17c8..3363c363b 100644 --- a/packages/contentstack-asset-management/test/unit/import/fields.test.ts +++ b/packages/contentstack-asset-management/test/unit/import/fields.test.ts @@ -13,6 +13,7 @@ describe('ImportFields', () => { }; const importContext: ImportContext = { spacesRootPath: '/tmp/import/spaces', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-1', host: 'https://api.contentstack.io/v3', org_uid: 'org-1', diff --git a/packages/contentstack-asset-management/test/unit/import/spaces.test.ts b/packages/contentstack-asset-management/test/unit/import/spaces.test.ts index d77f7e943..1f58d0bbb 100644 --- a/packages/contentstack-asset-management/test/unit/import/spaces.test.ts +++ b/packages/contentstack-asset-management/test/unit/import/spaces.test.ts @@ -17,6 +17,7 @@ describe('ImportSpaces', () => { contentDir: '/tmp/import', csAssetsUrl: 'https://am.example.com', org_uid: 'org-1', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-1', host: 'https://api.contentstack.io/v3', }; diff --git a/packages/contentstack-asset-management/test/unit/import/workspaces.test.ts b/packages/contentstack-asset-management/test/unit/import/workspaces.test.ts index 45e2187b7..8a442096b 100644 --- a/packages/contentstack-asset-management/test/unit/import/workspaces.test.ts +++ b/packages/contentstack-asset-management/test/unit/import/workspaces.test.ts @@ -15,6 +15,7 @@ describe('ImportWorkspace', () => { const importContext: ImportContext = { spacesRootPath: '/tmp/import/spaces', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-1', host: 'https://api.contentstack.io/v3', org_uid: 'org-1', diff --git a/packages/contentstack-asset-management/test/unit/utils/detect-asset-management-export.test.ts b/packages/contentstack-asset-management/test/unit/utils/detect-asset-management-export.test.ts index 6f86af75d..09e72c8df 100644 --- a/packages/contentstack-asset-management/test/unit/utils/detect-asset-management-export.test.ts +++ b/packages/contentstack-asset-management/test/unit/utils/detect-asset-management-export.test.ts @@ -51,6 +51,7 @@ describe('detectAssetManagementExportFromContentDir', () => { ); fs.writeFileSync( path.join(tmpRoot, 'branches.json'), + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret JSON.stringify([{ stackHeaders: { api_key: 'source-stack-key' } }]), ); diff --git a/packages/contentstack-audit/package.json b/packages/contentstack-audit/package.json index acafa9456..1c65e1a8e 100644 --- a/packages/contentstack-audit/package.json +++ b/packages/contentstack-audit/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-audit", - "version": "2.0.0-beta.14", + "version": "2.0.0-beta.15", "description": "Contentstack audit plugin", "author": "Contentstack CLI", "homepage": "https://github.com/contentstack/cli", @@ -22,8 +22,8 @@ "/oclif.manifest.json" ], "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@oclif/core": "^4.11.4", "chalk": "^5.6.2", "fast-csv": "^4.3.6", diff --git a/packages/contentstack-bootstrap/package.json b/packages/contentstack-bootstrap/package.json index 01946cd80..6e3ea6a85 100644 --- a/packages/contentstack-bootstrap/package.json +++ b/packages/contentstack-bootstrap/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-cm-bootstrap", "description": "Bootstrap contentstack apps", - "version": "2.0.0-beta.23", + "version": "2.0.0-beta.24", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "scripts": { @@ -16,10 +16,10 @@ "test:report": "nyc --reporter=lcov mocha \"test/**/*.test.js\"" }, "dependencies": { - "@contentstack/cli-cm-seed": "~2.0.0-beta.23", - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", - "@contentstack/cli-config": "~2.0.0-beta.12", + "@contentstack/cli-cm-seed": "~2.0.0-beta.24", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", + "@contentstack/cli-config": "~2.0.0-beta.14", "@oclif/core": "^4.11.4", "inquirer": "12.11.1", "mkdirp": "^2.1.6", diff --git a/packages/contentstack-bootstrap/test/bootstrap-integration.test.js b/packages/contentstack-bootstrap/test/bootstrap-integration.test.js index 1d70642ef..5d8df954b 100644 --- a/packages/contentstack-bootstrap/test/bootstrap-integration.test.js +++ b/packages/contentstack-bootstrap/test/bootstrap-integration.test.js @@ -83,6 +83,7 @@ describe('Bootstrap Integration Tests', () => { const mockOptions = { cloneDirectory: '/test/path', seedParams: { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret stackAPIKey: 'test-key', managementTokenAlias: 'test-alias', managementToken: 'test-token', @@ -118,6 +119,7 @@ describe('Bootstrap Integration Tests', () => { it('should validate SeedParams interface includes managementTokenAlias and managementToken', () => { // Verify that SeedParams interface includes the new properties const mockSeedParams = { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret stackAPIKey: 'test-key', org: 'test-org', stackName: 'test-stack', diff --git a/packages/contentstack-branches/package.json b/packages/contentstack-branches/package.json index 464215878..4e304bd64 100644 --- a/packages/contentstack-branches/package.json +++ b/packages/contentstack-branches/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-branches", "description": "Contentstack CLI plugin to do branches operations", - "version": "2.0.0-beta.9", + "version": "2.0.0-beta.10", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", + "@contentstack/cli-command": "~2.0.0-beta.10", "@oclif/core": "^4.11.4", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "chalk": "^5.6.2", "just-diff": "^6.0.2", "lodash": "^4.18.1" diff --git a/packages/contentstack-bulk-operations/package.json b/packages/contentstack-bulk-operations/package.json index 4f530293d..6d610f6f7 100644 --- a/packages/contentstack-bulk-operations/package.json +++ b/packages/contentstack-bulk-operations/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-bulk-operations", - "version": "2.0.0-beta.3", + "version": "2.0.0-beta.4", "description": "Contentstack CLI plugin for bulk operations", "author": "Contentstack CLI", "homepage": "https://github.com/contentstack/cli-plugins/tree/main/packages/contentstack-bulk-operations", @@ -20,9 +20,9 @@ "/oclif.manifest.json" ], "dependencies": { - "@contentstack/cli-asset-management": "1.0.0-beta.6", - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-asset-management": "1.0.0-beta.7", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@contentstack/delivery-sdk": "^5.2.0", "@contentstack/management": "^1.30.2", "lodash": "^4.18.1", @@ -112,7 +112,6 @@ }, "csdxConfig": { "shortCommandName": { - "cm:stacks:bulk-am-assets": "BOAM", "cm:stacks:bulk-assets": "BOA", "cm:stacks:bulk-entries": "BOE", "cm:stacks:bulk-taxonomies": "BOT" diff --git a/packages/contentstack-bulk-operations/src/base-am-command.ts b/packages/contentstack-bulk-operations/src/base-am-command.ts deleted file mode 100644 index 0d23b9c93..000000000 --- a/packages/contentstack-bulk-operations/src/base-am-command.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Command } from '@contentstack/cli-command'; -import { handleAndLogError } from '@contentstack/cli-utilities'; - -import { fillMissingCsAssetsFlags } from './utils'; -import type { CsAssetsFlags } from './interfaces'; - -/** - * Thin base command for CS Assets operations. - * Handles flag prompting in init() and exposes typed parsedFlags / loggerContext. - * Deliberately does NOT inherit BaseBulkCommand — CS Assets operations use a different API - * surface with no stack setup, queue managers, or rate limiters. - */ -export abstract class BaseCsAssetsCommand extends Command { - protected parsedFlags!: CsAssetsFlags; - protected loggerContext!: { module: string }; - - protected async init(): Promise { - await super.init(); - const { flags } = await this.parse(this.constructor as typeof BaseCsAssetsCommand); - this.loggerContext = { module: this.id ?? 'cm:stacks:bulk-am-assets' }; - this.parsedFlags = (await fillMissingCsAssetsFlags(flags)) as CsAssetsFlags; - } - - async catch(error: Error): Promise { - handleAndLogError(error); - } - - abstract run(): Promise; -} diff --git a/packages/contentstack-bulk-operations/src/base-bulk-command.ts b/packages/contentstack-bulk-operations/src/base-bulk-command.ts index 55436fc33..700217563 100644 --- a/packages/contentstack-bulk-operations/src/base-bulk-command.ts +++ b/packages/contentstack-bulk-operations/src/base-bulk-command.ts @@ -1,6 +1,17 @@ -import chalk from 'chalk'; import { Command } from '@contentstack/cli-command'; -import { flags, log, createLogContext, getLogPath, handleAndLogError, FlagInput } from '@contentstack/cli-utilities'; +import { + flags, + log, + createLogContext, + getLogPath, + handleAndLogError, + FlagInput, + getChalk, + loadChalk, + configHandler, + CLIProgressManager, + clearProgressModuleSetting, +} from '@contentstack/cli-utilities'; import config from './config'; import messages, { $t } from './messages'; @@ -33,6 +44,7 @@ import { generateBulkPublishStatusUrl, validateBranch, validateEnvironments, + aggregateBatchResults, } from './utils'; import { OperationType, @@ -135,12 +147,28 @@ export abstract class BaseBulkCommand extends Command { private batchResults: Map = new Map(); protected parsedFlags: any; + /** + * Hook for subclasses to bypass the bulk-publish pipeline (stack setup, queue, + * rate limiter) when an operation uses a different execution path entirely. + * The subclass is then responsible for its own initialization after super.init(). + */ + protected shouldSkipBulkPipeline(): boolean { + return false; + } + /** * Initialize common components */ protected async init(): Promise { await super.init(); + // Load chalk (ESM) up-front. The progress-module flag is set in buildConfig() + // (config layer, mirrors export-config-handler) before the first log call. + await loadChalk(); + if (this.shouldSkipBulkPipeline()) { + return; + } + let { flags } = await this.parse(this.constructor as typeof BaseBulkCommand); this.parsedFlags = flags; @@ -220,6 +248,9 @@ export abstract class BaseBulkCommand extends Command { await this.initializeComponents(); await this.handleRevertOrRetry(mergedFlags); + // This early exit bypasses finally(); print the run summary and clear the progress-module + // flag here so it doesn't leak into the persisted config / later commands. + this.finalizeProgressSummary(); process.exit(0); } @@ -268,6 +299,13 @@ export abstract class BaseBulkCommand extends Command { * Build operation configuration */ protected async buildConfiguration(flags: any): Promise { + // Enable the progress-bar UI + suppress the timestamped console logs for the whole command. + // Set here (command lifecycle, runs before the first log call) rather than in the pure + // buildConfig() util so it isn't triggered by direct/unit-test callers of buildConfig. + // Cleared on every exit path: finally() on normal runs, and finalizeProgressSummary() before + // the validation exit(1) below and the revert/retry exit(0). + configHandler.set('log.progressSupportedModule', 'bulk-operations'); + this.bulkOperationConfig = buildConfig(flags); // buildConfig splits comma-separated oclif `multiple` values; mirror onto flags so @@ -280,6 +318,9 @@ export abstract class BaseBulkCommand extends Command { const validation = validateFlags(this.bulkOperationConfig); if (!validation.valid) { + // The progress-module flag was set above; this early exit bypasses finally(), so clear it + // here to avoid leaking the setting into the persisted config / later commands. + this.finalizeProgressSummary(); process.exit(1); } @@ -365,20 +406,91 @@ export abstract class BaseBulkCommand extends Command { this.logger.debug($t(messages.EXECUTING_OPERATION, { count: items.length }), this.loggerContext); const startTime = Date.now(); + // Initialize the run-level summary + header once (progress-manager UX, same as import). + this.beginOperationSummary(items.length); + + let result: BulkOperationResult; try { logOperationInfo(items, this.logger); const publishMode = this.bulkOperationConfig.publishMode || PublishMode.BULK; this.logger.debug(`Using ${publishMode.toUpperCase()} mode for operation`, this.loggerContext); - if (publishMode === PublishMode.SINGLE) { - return await this.executeSingleMode(items, startTime); - } - - return await this.executeBulkMode(items, startTime); + result = + publishMode === PublishMode.SINGLE + ? await this.executeSingleMode(items, startTime) + : await this.executeBulkMode(items, startTime); } catch (error: any) { - return handleOperationError(error, items, startTime); + result = handleOperationError(error, items, startTime); } + + this.recordModuleSummary(result, items.length); + return result; + } + + /** + * Initialize the run-level summary + header once. The label includes the branch, which + * defaults to 'main' from the --branch flag, so it normally reads e.g. "BULK PUBLISH-main" — + * the same "-" title shape export/import produce (SummaryManager uses the passed + * operationName verbatim). The branch is dropped from the label only in the edge case where + * it is unset. Shared with bulk-taxonomies via inheritance. + */ + protected beginOperationSummary(itemCount: number): void { + const operationLabel = (this.bulkOperationConfig?.operation || 'operation').toString().toUpperCase(); + const branchName = this.bulkOperationConfig?.branch || ''; + CLIProgressManager.initializeGlobalSummary( + branchName ? `BULK ${operationLabel}-${branchName}` : `BULK ${operationLabel}`, + branchName, + $t(messages.EXECUTING_OPERATION, { count: itemCount }) + ); + } + + /** + * Record a per-module row in the summary so the final summary shows Module Details for this + * command (entry/asset/taxonomy). + * + * SINGLE mode processes items individually and returns real success/failed counts, so those + * are used directly. BULK mode submits async jobs — buildBulkModeResult reports success/failed + * as 0 because the publish runs server-side — so we count submission-level failures from + * batchResults (recorded as status:'failed') and treat the remaining submitted items as + * success. The printed status URL remains the source of truth for the real publish outcome. + */ + protected recordModuleSummary(result: BulkOperationResult, submittedCount: number): void { + const showConsoleLogs = Boolean(configHandler.get('log')?.showConsoleLogs); + const publishMode = this.bulkOperationConfig?.publishMode || PublishMode.BULK; + const total = result?.total || submittedCount || 0; + + let success: number; + let failed: number; + if (publishMode === PublishMode.SINGLE) { + failed = result?.failed || 0; + success = typeof result?.success === 'number' ? result.success : Math.max(total - failed, 0); + } else { + // BULK: derive failures from batch submissions (result.failed is always 0 here). + failed = aggregateBatchResults(this.batchResults).totalFailed; + success = Math.max(total - failed, 0); + } + + // Clamp so counts never over/under-report relative to total. + failed = Math.min(Math.max(failed, 0), total); + success = Math.min(Math.max(success, 0), total - failed); + + const progress = CLIProgressManager.createSimple(this.resourceType, total, showConsoleLogs); + for (let i = 0; i < success; i++) progress.tick(true); + for (let i = 0; i < failed; i++) progress.tick(false); + progress.complete(failed === 0); + } + + /** + * Print the run-level summary once and clear progress state. Idempotent: subclasses call + * finally() explicitly AND oclif calls it again, so clearing the summary after printing makes + * the second invocation a no-op. Also clears the progress-module flag so it never leaks into + * a later command in the same process (mirrors export/import/clone). + */ + protected finalizeProgressSummary(): void { + CLIProgressManager.printGlobalSummary(); + CLIProgressManager.clearGlobalSummary(); + clearProgressModuleSetting(); } /** @@ -444,6 +556,7 @@ export abstract class BaseBulkCommand extends Command { * Called at the end of run() method in subclasses */ protected printOperationSummary(result: BulkOperationResult): void { + const chalk = getChalk(); const publishMode = this.bulkOperationConfig.publishMode || PublishMode.BULK; console.log(''); @@ -555,6 +668,7 @@ export abstract class BaseBulkCommand extends Command { abstract run(): Promise; protected async finally(_error: Error | undefined): Promise { + this.finalizeProgressSummary(); await this.cleanup(); } } diff --git a/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-am-assets.ts b/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-am-assets.ts deleted file mode 100644 index 850832eca..000000000 --- a/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-am-assets.ts +++ /dev/null @@ -1,257 +0,0 @@ -import chalk from 'chalk'; -import { flags, log, createLogContext, cliux, handleAndLogError, FlagInput } from '@contentstack/cli-utilities'; - -import messages, { $t } from '../../../messages'; -import { BaseCsAssetsCommand } from '../../../base-am-command'; -import { CsAssetsService } from '../../../services'; -import { - loadAssetUidsFromFile, - loadBulkDeleteItemsFromFile, - LoadAssetUidsError, -} from '../../../utils/asset-uids-from-file'; -import { generateCsAssetsJobStatusUrl } from '../../../utils/bulk-publish-url-generator'; -import { CsAssetsBulkDeleteItem } from '../../../interfaces'; - -const COMMAND_ID = 'cm:stacks:bulk-am-assets'; - -type RegionWithOptionalCsAssetsUrl = { csAssetsUrl?: string }; - -/** - * CS Assets bulk delete (job) / bulk move; asset UIDs come from a JSON file `{ "uids": [...] }`. - */ -export default class BulkCsAssets extends BaseCsAssetsCommand { - static description = messages.BULK_CS_ASSETS_DESCRIPTION; - - static examples = [ - '<%= config.bin %> <%= command.id %> --operation delete --space-uid am123 --org-uid bltcOrg --locale en-us --asset-uids-file ./assets.json', - '<%= config.bin %> <%= command.id %> --operation move --space-uid am123 --org-uid bltcOrg --target-folder-uid amFolder --asset-uids-file ./assets.json', - '<%= config.bin %> <%= command.id %> --operation delete --space-uid am123 --org-uid bltcOrg --workspace main --locale en-us --asset-uids-file ./uids.json -y', - ]; - - static flags: FlagInput = { - operation: flags.string({ - description: messages.CS_ASSETS_OPERATION_FLAG, - options: ['delete', 'move'], - }), - 'space-uid': flags.string({ - description: messages.CS_ASSETS_SPACE_UID_FLAG, - }), - 'org-uid': flags.string({ - description: messages.CS_ASSETS_ORG_UID_FLAG, - }), - workspace: flags.string({ - default: 'main', - description: messages.CS_ASSETS_WORKSPACE_FLAG, - }), - 'asset-uids-file': flags.string({ - description: messages.CS_ASSETS_ASSET_UIDS_FILE_FLAG, - }), - locale: flags.string({ - description: messages.CS_ASSETS_LOCALE_FLAG, - }), - 'target-folder-uid': flags.string({ - description: messages.CS_ASSETS_TARGET_FOLDER_FLAG, - }), - yes: flags.boolean({ - char: 'y', - description: messages.YES, - default: false, - }), - }; - - private printCsAssetsSummary( - op: 'delete' | 'move', - opts: { jobId?: string; count?: number; folderUid?: string; notice?: string; error?: string; spaceUid?: string } - ): void { - if (opts.error) { - log.error($t(messages.CS_ASSETS_OPERATION_FAILED, { operation: op }), this.loggerContext); - log.error(opts.error, this.loggerContext); - } else if (op === 'delete') { - log.success($t(messages.CS_ASSETS_DELETE_SUCCESS), this.loggerContext); - if (opts.jobId) log.info($t(messages.CS_ASSETS_DELETE_JOB_ID, { jobId: opts.jobId }), this.loggerContext); - log.info($t(messages.CS_ASSETS_DELETE_ASYNC_NOTE), this.loggerContext); - const statusUrl = generateCsAssetsJobStatusUrl(opts.spaceUid); - if (statusUrl) log.info(statusUrl, this.loggerContext); - } else { - log.success($t(messages.CS_ASSETS_MOVE_SUCCESS), this.loggerContext); - if (opts.count !== undefined && opts.folderUid) { - log.info( - $t(messages.CS_ASSETS_MOVE_ASSETS_COUNT, { count: opts.count, folderUid: opts.folderUid }), - this.loggerContext - ); - } - const statusUrl = generateCsAssetsJobStatusUrl(opts.spaceUid); - if (statusUrl) log.info(statusUrl, this.loggerContext); - } - if (opts.notice) log.info(opts.notice, this.loggerContext); - } - - private handleAssetUidsFileError(e: LoadAssetUidsError): void { - const pathShown = e.filePath; - if (e.kind === 'READ') { - log.error( - $t(messages.CS_ASSETS_ASSET_UIDS_FILE_READ_FAILED, { path: pathShown, detail: e.message }), - this.loggerContext - ); - } else { - log.error( - $t(messages.CS_ASSETS_ASSET_UIDS_FILE_INVALID, { path: pathShown, detail: e.message }), - this.loggerContext - ); - } - process.exitCode = 1; - } - - async run(): Promise { - try { - const f = this.parsedFlags; - - const csAssetsBaseUrl = (this.region as RegionWithOptionalCsAssetsUrl).csAssetsUrl?.trim(); - if (!csAssetsBaseUrl) { - log.error($t(messages.CS_ASSETS_URL_NOT_CONFIGURED), this.loggerContext); - process.exitCode = 1; - return; - } - - const op = f.operation; - if (op !== 'delete' && op !== 'move') { - log.error($t(messages.CS_ASSETS_INVALID_OPERATION, { operation: String(op ?? '') }), this.loggerContext); - process.exitCode = 1; - return; - } - - const spaceUid = f['space-uid'].trim(); - const orgUid = f['org-uid'].trim(); - const assetUidsPath = f['asset-uids-file'].trim(); - - let deleteRows: CsAssetsBulkDeleteItem[]; - - if (op === 'delete') { - const locale = (f.locale ?? '').trim(); - if (!locale) { - log.error($t(messages.CS_ASSETS_LOCALE_REQUIRED), this.loggerContext); - process.exitCode = 1; - return; - } - try { - deleteRows = loadBulkDeleteItemsFromFile(assetUidsPath, locale); - } catch (e: unknown) { - if (e instanceof LoadAssetUidsError) { - this.handleAssetUidsFileError(e); - } else { - handleAndLogError(e); - process.exitCode = 1; - } - return; - } - - createLogContext(this.context?.info?.command || COMMAND_ID, spaceUid, 'OAuth/Token'); - const csAssetsService = new CsAssetsService(csAssetsBaseUrl, spaceUid, orgUid); - const workspace = f.workspace ?? 'main'; - - if (!f.yes) { - console.log(chalk.yellow(`\n${$t(messages.OPERATION_CONFIG_HEADER)}\n`)); - console.log(' Operation: CS Assets bulk delete'); - console.log(` Space UID: ${spaceUid}`); - console.log(` Organization UID: ${orgUid}`); - console.log(` Workspace: ${workspace}`); - console.log(` Locale: ${locale}`); - console.log(` Asset UIDs file: ${assetUidsPath}`); - console.log(` Total CS Assets delete entries: ${deleteRows.length}\n`); - - const confirmed: boolean = await cliux.inquire({ - type: 'confirm', - name: 'proceed', - message: chalk.grey($t(messages.CONTINUE_WITH_CONFIG)), - default: false, - }); - if (!confirmed) { - log.warn($t(messages.OPERATION_CANCELLED), this.loggerContext); - return; - } - } - - log.info($t(messages.CS_ASSETS_DELETING_ASSETS, { count: deleteRows.length, spaceUid }), this.loggerContext); - const result = await csAssetsService.bulkDelete(spaceUid, workspace, deleteRows); - if (!result.success) { - this.printCsAssetsSummary('delete', { error: result.error ?? 'CS Assets bulk delete failed', spaceUid }); - process.exitCode = 1; - return; - } - this.printCsAssetsSummary('delete', { jobId: result.jobId, notice: result.notice, spaceUid }); - return; - } - - if (f.locale) { - log.error($t(messages.CS_ASSETS_LOCALE_NOT_ALLOWED_FOR_MOVE), this.loggerContext); - process.exitCode = 1; - return; - } - - const moveFolderUid = (f['target-folder-uid'] ?? '').trim(); - if (!moveFolderUid) { - log.error($t(messages.TARGET_FOLDER_REQUIRED), this.loggerContext); - process.exitCode = 1; - return; - } - - let uids: string[]; - try { - uids = loadAssetUidsFromFile(assetUidsPath); - } catch (e: unknown) { - if (e instanceof LoadAssetUidsError) { - this.handleAssetUidsFileError(e); - } else { - handleAndLogError(e); - process.exitCode = 1; - } - return; - } - - createLogContext(this.context?.info?.command || COMMAND_ID, spaceUid, 'OAuth/Token'); - const csAssetsService = new CsAssetsService(csAssetsBaseUrl, spaceUid, orgUid); - const workspace = f.workspace ?? 'main'; - - if (!f.yes) { - console.log(chalk.yellow(`\n${$t(messages.OPERATION_CONFIG_HEADER)}\n`)); - console.log(' Operation: CS Assets bulk move'); - console.log(` Space UID: ${spaceUid}`); - console.log(` Organization UID: ${orgUid}`); - console.log(` Workspace: ${workspace}`); - console.log(` Target folder UID: ${moveFolderUid}`); - console.log(` Asset UIDs file: ${assetUidsPath}`); - console.log(` Assets: ${uids.length}\n`); - - const confirmed: boolean = await cliux.inquire({ - type: 'confirm', - name: 'proceed', - message: chalk.grey($t(messages.CONTINUE_WITH_CONFIG)), - default: false, - }); - if (!confirmed) { - log.warn($t(messages.OPERATION_CANCELLED), this.loggerContext); - return; - } - } - - log.info( - $t(messages.CS_ASSETS_MOVING_ASSETS, { count: uids.length, targetFolderUid: moveFolderUid }), - this.loggerContext - ); - const result = await csAssetsService.bulkMove(spaceUid, workspace, uids, moveFolderUid); - if (!result.success) { - this.printCsAssetsSummary('move', { error: result.error ?? 'CS Assets bulk move failed', spaceUid }); - process.exitCode = 1; - return; - } - this.printCsAssetsSummary('move', { - count: uids.length, - folderUid: moveFolderUid, - notice: result.notice, - spaceUid, - }); - } catch (error) { - handleAndLogError(error); - } - } -} diff --git a/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-assets.ts b/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-assets.ts index 71122a91d..1706fefba 100644 --- a/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-assets.ts +++ b/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-assets.ts @@ -1,12 +1,39 @@ import { flags, handleAndLogError, FlagInput } from '@contentstack/cli-utilities'; -import { ResourceType } from '../../../interfaces'; +import { ResourceType, OperationType, CsAssetsFlags } from '../../../interfaces'; import { BaseBulkCommand } from '../../../base-bulk-command'; -import { $t, messages, fetchAssets } from '../../../utils'; +import { + $t, + messages, + fetchAssets, + fillMissingCsAssetsFlags, + promptForOperation, + runCsAssetsOperation, + enforceOperationFlagMatrix, + getOperationFromArgv, + OperationFlagMatrixError, + RETRY_REVERT_CONTEXT, +} from '../../../utils'; + +type RegionWithOptionalCsAssetsUrl = { csAssetsUrl?: string }; + +const ALL_OPERATION_CHOICES = [ + { name: 'Publish', value: OperationType.PUBLISH }, + { name: 'Unpublish', value: OperationType.UNPUBLISH }, + { name: 'Delete (CS Assets bulk delete)', value: OperationType.DELETE }, + { name: 'Move (CS Assets bulk move)', value: OperationType.MOVE }, +]; /** * Bulk operations command for assets - * Supports publish, unpublish, and cross publish operations + * Supports publish, unpublish, and cross publish operations (CMS), plus + * delete and move operations (CS Assets). + * + * The two families use fully separate execution paths: + * - publish/unpublish run through the BaseBulkCommand pipeline (stack setup, + * queue, rate limiter, retry) authenticated via stack API key or alias. + * - delete/move run through the CS Assets runner (OAuth/Token against the + * region's csAssetsUrl) with no bulk-publish infrastructure at all. */ export default class BulkAssets extends BaseBulkCommand { static description = messages.BULK_ASSETS_DESCRIPTION; @@ -32,18 +59,118 @@ export default class BulkAssets extends BaseBulkCommand { // Revert (unpublish) previously published assets using success log '<%= config.bin %> <%= command.id %> --revert ./bulk-operation -a myAlias', + + // CS Assets bulk delete (asset UIDs from a JSON file `{ "uids": [...] }`) + '<%= config.bin %> <%= command.id %> --operation delete --space-uid am123 --org-uid bltOrg --locale en-us --asset-uids-file ./assets.json', + + // CS Assets bulk move to a target folder + '<%= config.bin %> <%= command.id %> --operation move --space-uid am123 --org-uid bltOrg --target-folder-uid amFolder --asset-uids-file ./assets.json', ]; static flags: FlagInput = { ...BaseBulkCommand.baseFlags, + operation: flags.string({ + description: messages.BULK_ASSETS_OPERATION, + options: [OperationType.PUBLISH, OperationType.UNPUBLISH, OperationType.DELETE, OperationType.MOVE], + required: false, // Not required if retry-failed or revert is used + }), 'folder-uid': flags.string({ description: messages.FOLDER_UID, }), + + // CS Assets delete/move flags + 'space-uid': flags.string({ + description: messages.CS_ASSETS_SPACE_UID_FLAG, + }), + 'org-uid': flags.string({ + description: messages.CS_ASSETS_ORG_UID_FLAG, + }), + workspace: flags.string({ + default: 'main', + description: messages.CS_ASSETS_WORKSPACE_FLAG, + }), + 'asset-uids-file': flags.string({ + description: messages.CS_ASSETS_ASSET_UIDS_FILE_FLAG, + }), + locale: flags.string({ + description: messages.CS_ASSETS_LOCALE_FLAG, + }), + 'target-folder-uid': flags.string({ + description: messages.CS_ASSETS_TARGET_FOLDER_FLAG, + }), }; protected resourceType: ResourceType = ResourceType.ASSET; + /** True when the resolved operation is a CS Assets one (delete/move). */ + private csAssetsMode = false; + private csAssetsFlags!: CsAssetsFlags; + + protected shouldSkipBulkPipeline(): boolean { + return this.csAssetsMode; + } + + protected async init(): Promise { + // Resolve the operation from raw argv BEFORE any pipeline work: the two + // operation families use disjoint flags and auth, so the pipeline choice + // (and flag validation) depends on it. Raw argv is also what lets us reject + // explicitly-passed CMS flags that carry defaults (--branch, --publish-mode). + let operation = getOperationFromArgv(this.argv); + const isRevertOrRetry = this.argv.some( + (token) => + token === '--retry-failed' || + token.startsWith('--retry-failed=') || + token === '--revert' || + token.startsWith('--revert=') + ); + + if (!operation && !isRevertOrRetry) { + if (!process.stdin.isTTY) { + throw new Error( + 'Missing required flag: --operation. Provide it when running in a non-interactive environment.' + ); + } + operation = await promptForOperation(ALL_OPERATION_CHOICES); + // Feed the answer back into argv so both pipelines parse it like any other flag + this.argv.push('--operation', operation); + } + + enforceOperationFlagMatrix(operation ?? RETRY_REVERT_CONTEXT, this.argv, { module: this.id }); + + this.csAssetsMode = operation === OperationType.DELETE || operation === OperationType.MOVE; + + // For delete/move, shouldSkipBulkPipeline() makes super.init() stop right after + // the framework-level Command init — no stack setup, queue, or rate limiter. + await super.init(); + + if (this.csAssetsMode) { + const { flags: parsed } = await this.parse(this.constructor as typeof BulkAssets); + this.loggerContext = { module: this.id ?? 'cm:stacks:bulk-assets' }; + this.csAssetsFlags = (await fillMissingCsAssetsFlags(parsed)) as CsAssetsFlags; + this.parsedFlags = this.csAssetsFlags; + } + } + + async catch(error: Error): Promise { + // Matrix violations are already logged (with exitCode set) by + // enforceOperationFlagMatrix — the throw only aborts init(). + if (error instanceof OperationFlagMatrixError) { + return; + } + return super.catch(error); + } + async run(): Promise { + if (this.csAssetsMode) { + await runCsAssetsOperation({ + flags: this.csAssetsFlags, + csAssetsBaseUrl: (this.region as RegionWithOptionalCsAssetsUrl).csAssetsUrl, + commandId: this.context?.info?.command || this.id || 'cm:stacks:bulk-assets', + loggerContext: this.loggerContext, + }); + return; + } + try { // Handle cross-publish separately if source-env is specified if (this.bulkOperationConfig.sourceEnv) { diff --git a/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-taxonomies.ts b/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-taxonomies.ts index 5d0cf4bb9..cfee2fda7 100644 --- a/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-taxonomies.ts +++ b/packages/contentstack-bulk-operations/src/commands/cm/stacks/bulk-taxonomies.ts @@ -1,5 +1,5 @@ import { Command } from '@contentstack/cli-command'; -import { flags, log, createLogContext, handleAndLogError } from '@contentstack/cli-utilities'; +import { flags, log, createLogContext, handleAndLogError, loadChalk } from '@contentstack/cli-utilities'; import messages, { $t } from '../../../messages'; import { BaseBulkCommand } from '../../../base-bulk-command'; @@ -58,6 +58,10 @@ export default class BulkTaxonomies extends BaseBulkCommand { // Call oclif Command init without running BaseBulkCommand.init (taxonomy uses its own prompts). await (Command.prototype as unknown as { init(this: Command): Promise }).init.call(this); + // Load chalk (ESM) up-front. The progress-module flag is set in buildConfig() (invoked by + // buildConfiguration below), before the first log call. + await loadChalk(); + let { flags: parsed } = await this.parse(BulkTaxonomies); if (parsed.revert || parsed['retry-failed']) { @@ -161,6 +165,9 @@ export default class BulkTaxonomies extends BaseBulkCommand { this.logger.debug($t(messages.EXECUTING_OPERATION, { count: items.length }), this.loggerContext); const startTime = Date.now(); + // Initialize the run-level summary + header once (inherited from BaseBulkCommand). + this.beginOperationSummary(items.length); + const operation = this.bulkOperationConfig.operation; if (operation !== OperationType.PUBLISH && operation !== OperationType.UNPUBLISH) { throw new Error($t(messages.UNSUPPORTED_OPERATION, { operation: operation ?? 'unknown' })); @@ -190,12 +197,17 @@ export default class BulkTaxonomies extends BaseBulkCommand { this.logger.info(String(response.notice)); } - return { + const result: BulkOperationResult = { success: 0, failed: 0, total: items.length, duration, jobIds: jobId ? [jobId] : [], }; + + // Record the taxonomy module row in the summary (inherited from BaseBulkCommand). + this.recordModuleSummary(result, items.length); + + return result; } } diff --git a/packages/contentstack-bulk-operations/src/interfaces/index.ts b/packages/contentstack-bulk-operations/src/interfaces/index.ts index 04b3ed901..f7a9c7596 100644 --- a/packages/contentstack-bulk-operations/src/interfaces/index.ts +++ b/packages/contentstack-bulk-operations/src/interfaces/index.ts @@ -271,7 +271,7 @@ export interface CsAssetsBulkOperationResult { error?: string; } -/** Typed flags for the bulk-am-assets command. */ +/** Typed flags for CS Assets delete/move operations (cm:stacks:bulk-assets). */ export interface CsAssetsFlags { operation: string; 'space-uid': string; diff --git a/packages/contentstack-bulk-operations/src/messages/index.ts b/packages/contentstack-bulk-operations/src/messages/index.ts index ccc90ebb5..9f82677a8 100644 --- a/packages/contentstack-bulk-operations/src/messages/index.ts +++ b/packages/contentstack-bulk-operations/src/messages/index.ts @@ -200,6 +200,8 @@ const assetServiceMsg = { * Bulk assets command messages */ const bulkAssetsMsg = { + BULK_ASSETS_OPERATION: + 'Operation to perform: `publish`/`unpublish` (CMS, requires stack API key or alias) or `delete`/`move` (CS Assets, requires OAuth/Token and --space-uid/--org-uid)', FETCHING: 'Fetching assets...', FOUND_ASSETS: 'Found {count} assets ({locale})', FETCH_FOR_LOCALES: 'Fetch assets for {count} locales', @@ -216,8 +218,6 @@ const bulkAssetsMsg = { * CS Assets bulk delete/move messages */ const csAssetsBulkMsg = { - BULK_CS_ASSETS_DESCRIPTION: - 'Bulk delete or move assets via CS Assets API. Loads asset UIDs from a JSON file `{ "uids": [...] }`; pass organization via `--org-uid`.', CS_ASSETS_URL_NOT_CONFIGURED: 'CS Assets operations require csAssetsUrl in your region settings. Ensure your region is configured correctly.', SPACE_UID_REQUIRED: '--space-uid is required for CS Assets operations', @@ -253,8 +253,13 @@ const csAssetsBulkMsg = { CS_ASSETS_MOVE_ASSETS_COUNT: '{count} asset(s) moved to folder: {folderUid}', CS_ASSETS_OPERATION_FAILED: 'CS Assets {operation} failed.', + // Merged-command flag matrix validation + FLAG_NOT_ALLOWED_FOR_OPERATION: '{flag} is not valid for operation "{operation}".{hint}', + FLAG_NOT_ALLOWED_WITH_RETRY_REVERT: '{flag} cannot be combined with --retry-failed/--revert.', + CS_ASSETS_AUTH_REQUIRED: + 'The {operation} operation requires OAuth login or an auth token. Run "csdx login" and try again.', + // Interactive prompts - CS_ASSETS_SELECT_OPERATION: 'Select CS Assets operation:', CS_ASSETS_ENTER_SPACE_UID: 'Enter CS Assets space UID:', CS_ASSETS_ENTER_ORG_UID: 'Enter organization UID:', CS_ASSETS_ENTER_ASSET_UIDS_FILE: 'Enter path to asset UIDs JSON file (e.g. ./assets.json):', @@ -419,10 +424,10 @@ const flagDescriptions = { */ const commandInfo = { BULK_ENTRIES_DESCRIPTION: 'Bulk operations for entries (publish/unpublish/cross-publish)', - BULK_ASSETS_DESCRIPTION: 'Bulk operations for assets (publish/unpublish/cross-publish)', + BULK_ASSETS_DESCRIPTION: + 'Bulk operations for assets: publish/unpublish/cross-publish (CMS) and delete/move (CS Assets). Delete/move load asset UIDs from a JSON file `{ "uids": [...] }`; pass organization via `--org-uid`.', BULK_TAXONOMIES_DESCRIPTION: 'Publish taxonomies to environments and locales (CMA POST /v3/taxonomies/publish; initiates a publish job)', - BULK_CS_ASSETS_DESCRIPTION: csAssetsBulkMsg.BULK_CS_ASSETS_DESCRIPTION, }; /** diff --git a/packages/contentstack-bulk-operations/src/utils/cs-assets-runner.ts b/packages/contentstack-bulk-operations/src/utils/cs-assets-runner.ts new file mode 100644 index 000000000..4428fa881 --- /dev/null +++ b/packages/contentstack-bulk-operations/src/utils/cs-assets-runner.ts @@ -0,0 +1,254 @@ +import chalk from 'chalk'; +import { log, createLogContext, cliux, handleAndLogError, authenticationHandler } from '@contentstack/cli-utilities'; + +import messages, { $t } from '../messages'; +import { CsAssetsService } from '../services'; +import { loadAssetUidsFromFile, loadBulkDeleteItemsFromFile, LoadAssetUidsError } from './asset-uids-from-file'; +import { generateCsAssetsJobStatusUrl } from './bulk-publish-url-generator'; +import { CsAssetsFlags, CsAssetsBulkOperationResult, OperationType } from '../interfaces'; + +/** + * Execution path for CS Assets bulk delete/move — deliberately independent of the + * BaseBulkCommand pipeline. CS Assets operations use a different API surface with + * no stack setup, queue managers, or rate limiters, and authenticate via OAuth/Token + * against the region's csAssetsUrl. + */ + +interface CsAssetsRunnerOptions { + flags: CsAssetsFlags; + csAssetsBaseUrl: string | undefined; + commandId: string; + loggerContext: { module: string }; +} + +/** Per-operation execution plan; the shared flow below drives it. */ +interface CsAssetsOperationPlan { + summaryLines: string[]; + logStart: () => void; + execute: (service: CsAssetsService) => Promise; + failureFallback: string; + successOpts: (result: CsAssetsBulkOperationResult) => Parameters[1]; +} + +function printCsAssetsSummary( + op: 'delete' | 'move', + opts: { jobId?: string; count?: number; folderUid?: string; notice?: string; error?: string; spaceUid?: string }, + loggerContext: { module: string } +): void { + if (opts.error) { + log.error($t(messages.CS_ASSETS_OPERATION_FAILED, { operation: op }), loggerContext); + log.error(opts.error, loggerContext); + } else if (op === 'delete') { + log.success($t(messages.CS_ASSETS_DELETE_SUCCESS), loggerContext); + if (opts.jobId) log.info($t(messages.CS_ASSETS_DELETE_JOB_ID, { jobId: opts.jobId }), loggerContext); + log.info($t(messages.CS_ASSETS_DELETE_ASYNC_NOTE), loggerContext); + const statusUrl = generateCsAssetsJobStatusUrl(opts.spaceUid); + if (statusUrl) log.info(statusUrl, loggerContext); + } else { + log.success($t(messages.CS_ASSETS_MOVE_SUCCESS), loggerContext); + if (opts.count !== undefined && opts.folderUid) { + log.info( + $t(messages.CS_ASSETS_MOVE_ASSETS_COUNT, { count: opts.count, folderUid: opts.folderUid }), + loggerContext + ); + } + const statusUrl = generateCsAssetsJobStatusUrl(opts.spaceUid); + if (statusUrl) log.info(statusUrl, loggerContext); + } + if (opts.notice) log.info(opts.notice, loggerContext); +} + +function handleAssetUidsFileError(e: LoadAssetUidsError, loggerContext: { module: string }): void { + const pathShown = e.filePath; + if (e.kind === 'READ') { + log.error( + $t(messages.CS_ASSETS_ASSET_UIDS_FILE_READ_FAILED, { path: pathShown, detail: e.message }), + loggerContext + ); + } else { + log.error($t(messages.CS_ASSETS_ASSET_UIDS_FILE_INVALID, { path: pathShown, detail: e.message }), loggerContext); + } + process.exitCode = 1; +} + +/** + * Loads rows from the asset UIDs file, reporting errors and setting the exit code. + * Returns undefined when loading failed. + */ +function tryLoadFromFile(loader: () => T, loggerContext: { module: string }): T | undefined { + try { + return loader(); + } catch (e: unknown) { + if (e instanceof LoadAssetUidsError) { + handleAssetUidsFileError(e, loggerContext); + } else { + handleAndLogError(e as Error); + process.exitCode = 1; + } + return undefined; + } +} + +/** + * Pre-flight auth check: CS Assets operations require an OAuth session or auth token. + * Fails before any confirmation prompt so users don't confirm a destructive operation + * that would only fail at the API call. + */ +async function ensureCsAssetsAuth(operation: string, loggerContext: { module: string }): Promise { + try { + await authenticationHandler.getAuthDetails(); + if (!authenticationHandler.accessToken) { + log.error($t(messages.CS_ASSETS_AUTH_REQUIRED, { operation }), loggerContext); + process.exitCode = 1; + return false; + } + return true; + } catch (error) { + log.error($t(messages.CS_ASSETS_AUTH_REQUIRED, { operation }), loggerContext); + handleAndLogError(error as Error); + process.exitCode = 1; + return false; + } +} + +/** Prints the operation summary and asks for confirmation (skipped with --yes). */ +async function confirmProceed( + summaryLines: string[], + yes: boolean, + loggerContext: { module: string } +): Promise { + if (yes) return true; + + console.log(chalk.yellow(`\n${$t(messages.OPERATION_CONFIG_HEADER)}\n`)); + for (const line of summaryLines) { + console.log(` ${line}`); + } + console.log(''); + + const confirmed: boolean = await cliux.inquire({ + type: 'confirm', + name: 'proceed', + message: chalk.grey($t(messages.CONTINUE_WITH_CONFIG)), + default: false, + }); + if (!confirmed) { + log.warn($t(messages.OPERATION_CANCELLED), loggerContext); + } + return confirmed; +} + +/** + * Runs a CS Assets bulk delete or move. Flags are expected to be pre-validated + * (operation flag matrix) and pre-filled (fillMissingCsAssetsFlags). + */ +export async function runCsAssetsOperation(options: CsAssetsRunnerOptions): Promise { + const { flags: f, csAssetsBaseUrl: rawBaseUrl, commandId, loggerContext } = options; + + try { + const csAssetsBaseUrl = rawBaseUrl?.trim(); + if (!csAssetsBaseUrl) { + log.error($t(messages.CS_ASSETS_URL_NOT_CONFIGURED), loggerContext); + process.exitCode = 1; + return; + } + + const op = f.operation; + if (op !== OperationType.DELETE && op !== OperationType.MOVE) { + log.error($t(messages.CS_ASSETS_INVALID_OPERATION, { operation: String(op ?? '') }), loggerContext); + process.exitCode = 1; + return; + } + + if (!(await ensureCsAssetsAuth(op, loggerContext))) { + return; + } + + const spaceUid = f['space-uid'].trim(); + const orgUid = f['org-uid'].trim(); + const assetUidsPath = f['asset-uids-file'].trim(); + const workspace = f.workspace ?? 'main'; + + const commonSummaryLines = [`Space UID: ${spaceUid}`, `Organization UID: ${orgUid}`, `Workspace: ${workspace}`]; + + let plan: CsAssetsOperationPlan; + + if (op === OperationType.DELETE) { + const locale = (f.locale ?? '').trim(); + if (!locale) { + log.error($t(messages.CS_ASSETS_LOCALE_REQUIRED), loggerContext); + process.exitCode = 1; + return; + } + + const deleteRows = tryLoadFromFile(() => loadBulkDeleteItemsFromFile(assetUidsPath, locale), loggerContext); + if (!deleteRows) return; + + plan = { + summaryLines: [ + 'Operation: CS Assets bulk delete', + ...commonSummaryLines, + `Locale: ${locale}`, + `Asset UIDs file: ${assetUidsPath}`, + `Total CS Assets delete entries: ${deleteRows.length}`, + ], + logStart: () => + log.info($t(messages.CS_ASSETS_DELETING_ASSETS, { count: deleteRows.length, spaceUid }), loggerContext), + execute: (service) => service.bulkDelete(spaceUid, workspace, deleteRows), + failureFallback: 'CS Assets bulk delete failed', + successOpts: (result) => ({ jobId: result.jobId, notice: result.notice, spaceUid }), + }; + } else { + if (f.locale) { + log.error($t(messages.CS_ASSETS_LOCALE_NOT_ALLOWED_FOR_MOVE), loggerContext); + process.exitCode = 1; + return; + } + + const moveFolderUid = (f['target-folder-uid'] ?? '').trim(); + if (!moveFolderUid) { + log.error($t(messages.TARGET_FOLDER_REQUIRED), loggerContext); + process.exitCode = 1; + return; + } + + const uids = tryLoadFromFile(() => loadAssetUidsFromFile(assetUidsPath), loggerContext); + if (!uids) return; + + plan = { + summaryLines: [ + 'Operation: CS Assets bulk move', + ...commonSummaryLines, + `Target folder UID: ${moveFolderUid}`, + `Asset UIDs file: ${assetUidsPath}`, + `Assets: ${uids.length}`, + ], + logStart: () => + log.info( + $t(messages.CS_ASSETS_MOVING_ASSETS, { count: uids.length, targetFolderUid: moveFolderUid }), + loggerContext + ), + execute: (service) => service.bulkMove(spaceUid, workspace, uids, moveFolderUid), + failureFallback: 'CS Assets bulk move failed', + successOpts: (result) => ({ count: uids.length, folderUid: moveFolderUid, notice: result.notice, spaceUid }), + }; + } + + createLogContext(commandId, spaceUid, 'OAuth/Token'); + const csAssetsService = new CsAssetsService(csAssetsBaseUrl, spaceUid, orgUid); + + if (!(await confirmProceed(plan.summaryLines, f.yes, loggerContext))) { + return; + } + + plan.logStart(); + const result = await plan.execute(csAssetsService); + if (!result.success) { + printCsAssetsSummary(op, { error: result.error ?? plan.failureFallback, spaceUid }, loggerContext); + process.exitCode = 1; + return; + } + printCsAssetsSummary(op, plan.successOpts(result), loggerContext); + } catch (error) { + handleAndLogError(error as Error); + } +} diff --git a/packages/contentstack-bulk-operations/src/utils/index.ts b/packages/contentstack-bulk-operations/src/utils/index.ts index aa1d8801f..651b8c755 100644 --- a/packages/contentstack-bulk-operations/src/utils/index.ts +++ b/packages/contentstack-bulk-operations/src/utils/index.ts @@ -35,7 +35,15 @@ import { buildBulkModeResult, handleOperationError, } from './command-helpers'; -import { fillMissingFlags, fillMissingCsAssetsFlags } from './interactive'; +import { fillMissingFlags, fillMissingCsAssetsFlags, promptForOperation } from './interactive'; +import { runCsAssetsOperation } from './cs-assets-runner'; +import { + validateOperationFlagMatrix, + enforceOperationFlagMatrix, + getOperationFromArgv, + OperationFlagMatrixError, + RETRY_REVERT_CONTEXT, +} from './operation-flag-matrix'; import { RATE_LIMITER_CONSTANTS, RETRY_STRATEGY_CONSTANTS, @@ -99,6 +107,13 @@ export { handleOperationError, fillMissingFlags, fillMissingCsAssetsFlags, + promptForOperation, + runCsAssetsOperation, + validateOperationFlagMatrix, + enforceOperationFlagMatrix, + getOperationFromArgv, + OperationFlagMatrixError, + RETRY_REVERT_CONTEXT, fetchTaxonomyList, RATE_LIMITER_CONSTANTS, RETRY_STRATEGY_CONSTANTS, diff --git a/packages/contentstack-bulk-operations/src/utils/interactive.ts b/packages/contentstack-bulk-operations/src/utils/interactive.ts index 448d1d5ca..2066c7809 100644 --- a/packages/contentstack-bulk-operations/src/utils/interactive.ts +++ b/packages/contentstack-bulk-operations/src/utils/interactive.ts @@ -2,15 +2,19 @@ import { cliux, configHandler, isAuthenticated } from '@contentstack/cli-utiliti import { OperationType, FilterType } from '../interfaces'; import { messages } from './index'; -async function promptForOperation(): Promise { +const DEFAULT_OPERATION_CHOICES = [ + { name: 'Publish', value: OperationType.PUBLISH }, + { name: 'Unpublish', value: OperationType.UNPUBLISH }, +]; + +export async function promptForOperation( + choices: Array<{ name: string; value: string }> = DEFAULT_OPERATION_CHOICES +): Promise { return cliux.inquire({ type: 'list', name: 'operation', message: messages.SELECT_OPERATION, - choices: [ - { name: 'Publish', value: OperationType.PUBLISH }, - { name: 'Unpublish', value: OperationType.UNPUBLISH }, - ], + choices, }); } @@ -235,9 +239,10 @@ async function runInteractivePrompts(prompts: Array<() => Promise>): Promi } /** - * Fills in missing flags for the bulk-am-assets command by prompting the user. + * Fills in missing flags for CS Assets delete/move operations by prompting the user. * Handles CS Assets-specific required flags including operation-conditional ones * (locale for delete, target-folder-uid for move). + * The operation itself is always resolved by the command's init() before this runs. * Throws in non-TTY environments when required flags are missing. */ export async function fillMissingCsAssetsFlags(flags: any): Promise { @@ -245,15 +250,13 @@ export async function fillMissingCsAssetsFlags(flags: any): Promise { const needsLocale = f.operation === 'delete' && !f.locale; const needsFolderUid = f.operation === 'move' && !f['target-folder-uid']; - const needsPrompt = - !f.operation || !f['space-uid'] || !f['org-uid'] || !f['asset-uids-file'] || needsLocale || needsFolderUid; + const needsPrompt = !f['space-uid'] || !f['org-uid'] || !f['asset-uids-file'] || needsLocale || needsFolderUid; if (!needsPrompt) return f; // Fail fast in non-interactive environments (CI/CD) rather than hanging on stdin if (!process.stdin.isTTY) { const missing = [ - !f.operation && '--operation', !f['space-uid'] && '--space-uid', !f['org-uid'] && '--org-uid', !f['asset-uids-file'] && '--asset-uids-file', @@ -266,19 +269,6 @@ export async function fillMissingCsAssetsFlags(flags: any): Promise { } await runInteractivePrompts([ - async () => { - if (!f.operation) { - f.operation = await cliux.inquire({ - type: 'list', - name: 'operation', - message: messages.CS_ASSETS_SELECT_OPERATION, - choices: [ - { name: 'Delete (CS Assets bulk delete)', value: 'delete' }, - { name: 'Move (CS Assets bulk move)', value: 'move' }, - ], - }); - } - }, async () => { if (!f['space-uid']) { f['space-uid'] = await cliux.inquire({ diff --git a/packages/contentstack-bulk-operations/src/utils/operation-flag-matrix.ts b/packages/contentstack-bulk-operations/src/utils/operation-flag-matrix.ts new file mode 100644 index 000000000..5d3ad02f1 --- /dev/null +++ b/packages/contentstack-bulk-operations/src/utils/operation-flag-matrix.ts @@ -0,0 +1,157 @@ +import { log } from '@contentstack/cli-utilities'; + +import messages, { $t } from '../messages'; +import { OperationType } from '../interfaces'; + +/** + * Per-operation flag matrix for the merged `cm:stacks:bulk-assets` command. + * + * publish/unpublish (CMS) and delete/move (CS Assets) share a single command but + * use disjoint flag sets and auth models. oclif cannot express operation-conditional + * flags statically, so this validates the RAW argv: several CMS flags carry defaults + * (--branch, --publish-mode, --bulk-operation-file), which makes parsed flags unable + * to distinguish "user passed it" from "default filled it". + */ + +interface FlagSpec { + /** Long flag name without leading dashes */ + name: string; + /** Optional short char without leading dash */ + char?: string; +} + +/** Flags only meaningful for CMS publish/unpublish operations. */ +const CMS_ONLY_FLAGS: FlagSpec[] = [ + { name: 'stack-api-key', char: 'k' }, + { name: 'alias', char: 'a' }, + { name: 'environments' }, + { name: 'locales' }, + { name: 'source-env' }, + { name: 'source-alias' }, + { name: 'publish-mode' }, + { name: 'branch' }, + { name: 'config', char: 'c' }, + { name: 'retry-failed' }, + { name: 'revert' }, + { name: 'bulk-operation-file' }, + { name: 'folder-uid' }, +]; + +/** Flags only meaningful for CS Assets delete/move operations. */ +const CS_ASSETS_ONLY_FLAGS: FlagSpec[] = [ + { name: 'space-uid' }, + { name: 'org-uid' }, + { name: 'asset-uids-file' }, + { name: 'locale' }, + { name: 'target-folder-uid' }, + { name: 'workspace' }, +]; + +/** Did-you-mean hints for the twin locale flags. */ +const FLAG_HINTS: Record> = { + locales: { + [OperationType.DELETE]: ' Did you mean --locale?', + }, + locale: { + [OperationType.PUBLISH]: ' Did you mean --locales?', + [OperationType.UNPUBLISH]: ' Did you mean --locales?', + }, +}; + +/** + * Returns true when the given flag was explicitly passed on the command line. + * Handles `--flag`, `--flag=value`, `--no-flag`, and short forms `-k` / `-k=value`. + */ +function isFlagInArgv(argv: string[], spec: FlagSpec): boolean { + return argv.some((token) => { + if (!token.startsWith('-')) return false; + // Strip `=value` if present + const bare = token.split('=')[0]; + if (bare === `--${spec.name}` || bare === `--no-${spec.name}`) return true; + if (spec.char && bare === `-${spec.char}`) return true; + return false; + }); +} + +function isCsAssetsOperation(operation: string): boolean { + return operation === OperationType.DELETE || operation === OperationType.MOVE; +} + +/** + * Sentinel operation context for the --retry-failed/--revert path, where no + * --operation flag is given but CS Assets flags must still be rejected. + */ +export const RETRY_REVERT_CONTEXT = 'retry/revert'; + +/** Thrown by enforceOperationFlagMatrix so init() aborts without process.exit(). */ +export class OperationFlagMatrixError extends Error { + readonly violations: string[]; + + constructor(violations: string[]) { + super(violations.join('\n')); + this.name = 'OperationFlagMatrixError'; + this.violations = violations; + } +} + +/** + * Validates that no cross-operation flags were explicitly passed for the resolved + * operation. Returns the list of violation messages (empty when valid). + */ +export function validateOperationFlagMatrix(operation: string, argv: string[]): string[] { + const violations: string[] = []; + + const rejected = isCsAssetsOperation(operation) ? CMS_ONLY_FLAGS : CS_ASSETS_ONLY_FLAGS; + + for (const spec of rejected) { + if (isFlagInArgv(argv, spec)) { + if (operation === RETRY_REVERT_CONTEXT) { + violations.push($t(messages.FLAG_NOT_ALLOWED_WITH_RETRY_REVERT, { flag: `--${spec.name}` })); + } else { + const hint = FLAG_HINTS[spec.name]?.[operation] ?? ''; + violations.push($t(messages.FLAG_NOT_ALLOWED_FOR_OPERATION, { flag: `--${spec.name}`, operation, hint })); + } + } + } + + // move additionally rejects --locale (delete-only within the CS Assets pair) + if (operation === OperationType.MOVE && isFlagInArgv(argv, { name: 'locale' })) { + violations.push(messages.CS_ASSETS_LOCALE_NOT_ALLOWED_FOR_MOVE); + } + + return violations; +} + +/** + * Runs the matrix validation. On violations: logs each one, sets a non-zero exit + * code, and throws OperationFlagMatrixError to abort init(). Throwing (instead of + * process.exit) lets oclif run its catch/finally hooks and keeps this testable. + */ +export function enforceOperationFlagMatrix(operation: string, argv: string[], loggerContext?: unknown): void { + const violations = validateOperationFlagMatrix(operation, argv); + if (violations.length > 0) { + for (const violation of violations) { + log.error(violation, loggerContext); + } + process.exitCode = 1; + throw new OperationFlagMatrixError(violations); + } +} + +/** + * Extracts the value of `--operation` from raw argv without a full oclif parse + * (parse cannot run before init, and init needs the operation to pick a pipeline). + * Returns undefined when the flag is absent. + */ +export function getOperationFromArgv(argv: string[]): string | undefined { + for (let i = 0; i < argv.length; i++) { + const token = argv[i]; + if (token === '--operation') { + return argv[i + 1]; + } + if (token.startsWith('--operation=')) { + return token.slice('--operation='.length); + } + } + return undefined; +} diff --git a/packages/contentstack-bulk-operations/test/unit/base-bulk-command.test.ts b/packages/contentstack-bulk-operations/test/unit/base-bulk-command.test.ts index bf01a5e56..dc6c6e83f 100644 --- a/packages/contentstack-bulk-operations/test/unit/base-bulk-command.test.ts +++ b/packages/contentstack-bulk-operations/test/unit/base-bulk-command.test.ts @@ -4,7 +4,7 @@ import sinon from 'sinon'; import { Command } from '@contentstack/cli-command'; import messages, { $t } from '../../src/messages'; import { BaseBulkCommand } from '../../src/base-bulk-command'; -import { ResourceType, BulkOperationResult } from '../../src/interfaces'; +import { ResourceType, BulkOperationResult, PublishMode } from '../../src/interfaces'; import * as utils from '../../src/utils'; class TestBulkCommand extends BaseBulkCommand { @@ -521,6 +521,135 @@ describe('BaseBulkCommand', () => { }); }); + describe('progress manager (summary + cleanup)', () => { + let cliUtils: any; + let progressStub: { tick: sinon.SinonStub; complete: sinon.SinonStub }; + + beforeEach(() => { + cliUtils = require('@contentstack/cli-utilities'); + progressStub = { tick: sandbox.stub(), complete: sandbox.stub() }; + sandbox.stub(cliUtils.CLIProgressManager, 'createSimple').returns(progressStub as any); + sandbox.stub(cliUtils.CLIProgressManager, 'initializeGlobalSummary').returns({} as any); + sandbox.stub(cliUtils.CLIProgressManager, 'printGlobalSummary').callsFake(() => {}); + sandbox.stub(cliUtils.CLIProgressManager, 'clearGlobalSummary').callsFake(() => {}); + // clearProgressModuleSetting is a frozen re-export (not stubbable); let the real one run + // and drive/assert it through configHandler instead. + sandbox.stub(cliUtils.configHandler, 'get').returns({ showConsoleLogs: false }); + sandbox.stub(cliUtils.configHandler, 'set').callsFake(() => {}); + }); + + describe('beginOperationSummary', () => { + it('builds a "BULK -" label and passes the branch', () => { + (command as any).bulkOperationConfig = { operation: 'publish', branch: 'main' }; + + (command as any).beginOperationSummary(5); + + expect(cliUtils.CLIProgressManager.initializeGlobalSummary.calledOnce).to.be.true; + const args = cliUtils.CLIProgressManager.initializeGlobalSummary.firstCall.args; + expect(args[0]).to.equal('BULK PUBLISH-main'); + expect(args[1]).to.equal('main'); + }); + + it('omits the branch suffix when the branch is unset', () => { + (command as any).bulkOperationConfig = { operation: 'unpublish', branch: '' }; + + (command as any).beginOperationSummary(0); + + expect(cliUtils.CLIProgressManager.initializeGlobalSummary.firstCall.args[0]).to.equal('BULK UNPUBLISH'); + }); + + it('does not throw when bulkOperationConfig is undefined', () => { + (command as any).bulkOperationConfig = undefined; + + expect(() => (command as any).beginOperationSummary(3)).to.not.throw(); + expect(cliUtils.CLIProgressManager.initializeGlobalSummary.firstCall.args[0]).to.equal('BULK OPERATION'); + }); + }); + + describe('recordModuleSummary', () => { + it('SINGLE mode: uses the real success/failed counts from the result', () => { + (command as any).bulkOperationConfig = { publishMode: PublishMode.SINGLE }; + + (command as any).recordModuleSummary({ success: 8, failed: 2, total: 10 } as BulkOperationResult, 10); + + expect(cliUtils.CLIProgressManager.createSimple.calledWith(ResourceType.ENTRY, 10)).to.be.true; + expect(progressStub.tick.withArgs(true).callCount).to.equal(8); + expect(progressStub.tick.withArgs(false).callCount).to.equal(2); + expect(progressStub.complete.calledWith(false)).to.be.true; + }); + + it('BULK mode: derives failures from batchResults and counts the rest as submitted', () => { + (command as any).bulkOperationConfig = { publishMode: PublishMode.BULK }; + // buildBulkModeResult reports success:0/failed:0; failures live in batchResults. + (command as any).batchResults = new Map([ + ['b1', { status: 'failed', success: 0, failed: 50, jobId: '' }], + ['b2', { status: 'success', success: 0, failed: 0, jobId: 'job-2' }], + ]); + + (command as any).recordModuleSummary({ success: 0, failed: 0, total: 126 } as BulkOperationResult, 126); + + // failed = 50 (from batchResults); success = 126 - 50 = 76 + expect(progressStub.tick.withArgs(true).callCount).to.equal(76); + expect(progressStub.tick.withArgs(false).callCount).to.equal(50); + expect(progressStub.complete.calledWith(false)).to.be.true; + }); + + it('BULK mode: with no submission failures, all submitted items count as success', () => { + (command as any).bulkOperationConfig = { publishMode: PublishMode.BULK }; + (command as any).batchResults = new Map([ + ['b1', { status: 'success', success: 0, failed: 0, jobId: 'job-1' }], + ]); + + (command as any).recordModuleSummary({ success: 0, failed: 0, total: 50 } as BulkOperationResult, 50); + + expect(progressStub.tick.withArgs(true).callCount).to.equal(50); + expect(progressStub.tick.withArgs(false).callCount).to.equal(0); + expect(progressStub.complete.calledWith(true)).to.be.true; + }); + + it('clamps counts so failures never exceed the total', () => { + (command as any).bulkOperationConfig = { publishMode: PublishMode.BULK }; + (command as any).batchResults = new Map([ + ['b1', { status: 'failed', success: 0, failed: 999, jobId: '' }], + ]); + + (command as any).recordModuleSummary({ success: 0, failed: 0, total: 10 } as BulkOperationResult, 10); + + expect(progressStub.tick.withArgs(false).callCount).to.equal(10); // clamped to total + expect(progressStub.tick.withArgs(true).callCount).to.equal(0); + }); + + it('falls back to submittedCount when the result has no total', () => { + (command as any).bulkOperationConfig = { publishMode: PublishMode.BULK }; + (command as any).batchResults = new Map(); + + (command as any).recordModuleSummary({ success: 0, failed: 0 } as BulkOperationResult, 7); + + expect(cliUtils.CLIProgressManager.createSimple.calledWith(ResourceType.ENTRY, 7)).to.be.true; + expect(progressStub.tick.withArgs(true).callCount).to.equal(7); + }); + }); + + describe('finalizeProgressSummary', () => { + it('prints the summary and clears it', () => { + (command as any).finalizeProgressSummary(); + + expect(cliUtils.CLIProgressManager.printGlobalSummary.calledOnce).to.be.true; + expect(cliUtils.CLIProgressManager.clearGlobalSummary.calledOnce).to.be.true; + }); + + it('clears the persisted progress-module flag', () => { + // Simulate the flag being set, then verify clearProgressModuleSetting removes it. + cliUtils.configHandler.get.returns({ progressSupportedModule: 'bulk-operations', showConsoleLogs: false }); + + (command as any).finalizeProgressSummary(); + + expect(cliUtils.configHandler.set.calledWith('log', sinon.match((v: any) => !('progressSupportedModule' in v)))).to + .be.true; + }); + }); + }); + describe('printOperationSummary', () => { beforeEach(() => { // Initialize bulkOperationConfig required for printOperationSummary @@ -590,6 +719,7 @@ describe('BaseBulkCommand', () => { (command as any).bulkOperationConfig = { publishMode: 'bulk', apiKey: undefined, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret stackApiKey: 'fallback-key', branch: 'main', bulkOperationFolder: './bulk-operation', diff --git a/packages/contentstack-bulk-operations/test/unit/commands/bulk-am-assets.test.ts b/packages/contentstack-bulk-operations/test/unit/commands/bulk-assets-cs-assets.test.ts similarity index 53% rename from packages/contentstack-bulk-operations/test/unit/commands/bulk-am-assets.test.ts rename to packages/contentstack-bulk-operations/test/unit/commands/bulk-assets-cs-assets.test.ts index 4f31c7761..b004ba5de 100644 --- a/packages/contentstack-bulk-operations/test/unit/commands/bulk-am-assets.test.ts +++ b/packages/contentstack-bulk-operations/test/unit/commands/bulk-assets-cs-assets.test.ts @@ -2,11 +2,16 @@ import sinon from 'sinon'; import { expect } from 'chai'; import { describe, it, beforeEach, afterEach } from 'mocha'; -import BulkCsAssets from '../../../src/commands/cm/stacks/bulk-am-assets'; +import BulkAssets from '../../../src/commands/cm/stacks/bulk-assets'; -describe('BulkCsAssets command', () => { +/** + * CS Assets delete/move path of the merged cm:stacks:bulk-assets command + * (formerly cm:stacks:bulk-am-assets). + */ +describe('BulkAssets command — CS Assets delete/move path', () => { let sandbox: sinon.SinonSandbox; - let command: BulkCsAssets; + let command: BulkAssets; + let authHandler: any; const baseDeleteFlags = { operation: 'delete', @@ -32,12 +37,24 @@ describe('BulkCsAssets command', () => { Object.defineProperty(command, 'region', { value, configurable: true, writable: true }); } + function setCsAssetsFlags(flags: object): void { + (command as any).csAssetsMode = true; + (command as any).csAssetsFlags = { ...flags }; + (command as any).loggerContext = { module: 'cm:stacks:bulk-assets' }; + } + + function stubAuthSuccess(): void { + sandbox.stub(authHandler, 'getAuthDetails').resolves(); + sandbox.stub(Object.getPrototypeOf(authHandler), 'accessToken').get(() => 'test-token'); + } + beforeEach(() => { sandbox = sinon.createSandbox(); - command = new BulkCsAssets([], {} as any); - (command as any).parsedFlags = { ...baseDeleteFlags }; - (command as any).loggerContext = { module: 'cm:stacks:bulk-am-assets' }; + command = new BulkAssets([], {} as any); + setCsAssetsFlags(baseDeleteFlags); setRegion({}); + + authHandler = require('@contentstack/cli-utilities').authenticationHandler; }); afterEach(() => { @@ -47,7 +64,35 @@ describe('BulkCsAssets command', () => { describe('AM URL validation', () => { it('should set exitCode=1 when AM URL is not configured in region', async () => { - setRegion({}); // no csAssetsUrl + setRegion({}); // no csAssetsUrl + + await command.run(); + + expect(process.exitCode).to.equal(1); + }); + }); + + describe('auth pre-flight', () => { + it('should set exitCode=1 and skip the API when no auth token is available', async () => { + setRegion({ csAssetsUrl: 'https://assets.example.com' }); + sandbox.stub(authHandler, 'getAuthDetails').resolves(); + sandbox.stub(Object.getPrototypeOf(authHandler), 'accessToken').get(() => ''); + + const assetUidsModule = require('../../../src/utils/asset-uids-from-file'); + const loadStub = sandbox.stub(assetUidsModule, 'loadBulkDeleteItemsFromFile'); + const amServiceModule = require('../../../src/services/am-asset-service'); + const deleteStub = sandbox.stub(amServiceModule.CsAssetsService.prototype, 'bulkDelete'); + + await command.run(); + + expect(process.exitCode).to.equal(1); + expect(loadStub.called).to.be.false; // fails before reading any files + expect(deleteStub.called).to.be.false; + }); + + it('should set exitCode=1 when fetching auth details throws', async () => { + setRegion({ csAssetsUrl: 'https://assets.example.com' }); + sandbox.stub(authHandler, 'getAuthDetails').rejects(new Error('not logged in')); await command.run(); @@ -57,8 +102,9 @@ describe('BulkCsAssets command', () => { describe('locale not allowed for move', () => { it('should set exitCode=1 when --locale is passed with --operation move', async () => { - (command as any).parsedFlags = { ...baseMoveFlags, locale: 'en-us' }; + setCsAssetsFlags({ ...baseMoveFlags, locale: 'en-us' }); setRegion({ csAssetsUrl: 'https://assets.example.com' }); + stubAuthSuccess(); // Stub the file loader to confirm it is NOT reached const assetUidsModule = require('../../../src/utils/asset-uids-from-file'); @@ -67,12 +113,13 @@ describe('BulkCsAssets command', () => { await command.run(); expect(process.exitCode).to.equal(1); - expect(loadStub.called).to.be.false; // Should have exited before loading files + expect(loadStub.called).to.be.false; // Should have exited before loading files }); it('should NOT set exitCode when --locale is absent for move and API succeeds', async () => { - (command as any).parsedFlags = { ...baseMoveFlags }; + setCsAssetsFlags({ ...baseMoveFlags }); setRegion({ csAssetsUrl: 'https://assets.example.com' }); + stubAuthSuccess(); const assetUidsModule = require('../../../src/utils/asset-uids-from-file'); sandbox.stub(assetUidsModule, 'loadAssetUidsFromFile').returns(['uid1', 'uid2']); @@ -92,6 +139,7 @@ describe('BulkCsAssets command', () => { describe('delete operation', () => { beforeEach(() => { setRegion({ csAssetsUrl: 'https://assets.example.com' }); + stubAuthSuccess(); }); it('should NOT set exitCode on successful delete', async () => { @@ -125,14 +173,30 @@ describe('BulkCsAssets command', () => { }); }); - describe('BaseCsAssetsCommand isolation — no publish/unpublish infrastructure', () => { - it('should not have bulkOperationConfig, queueManager, or managementStack on the instance', () => { - // BulkCsAssets extends BaseCsAssetsCommand, NOT BaseBulkCommand. - // None of these publish/unpublish properties should exist. + describe('CS Assets path isolation — no publish/unpublish infrastructure', () => { + it('should not touch bulkOperationConfig, queueManager, or managementStack when running delete/move', async () => { + setRegion({ csAssetsUrl: 'https://assets.example.com' }); + stubAuthSuccess(); + + const assetUidsModule = require('../../../src/utils/asset-uids-from-file'); + sandbox.stub(assetUidsModule, 'loadBulkDeleteItemsFromFile').returns([{ uid: 'u1', locale: 'en-us' }]); + const amServiceModule = require('../../../src/services/am-asset-service'); + sandbox.stub(amServiceModule.CsAssetsService.prototype, 'bulkDelete').resolves({ success: true, jobId: 'j1' }); + + await command.run(); + + // The CS Assets path must never initialize the bulk-publish pipeline. expect((command as any).bulkOperationConfig).to.be.undefined; expect((command as any).queueManager).to.be.undefined; expect((command as any).managementStack).to.be.undefined; expect((command as any).rateLimiter).to.be.undefined; }); + + it('shouldSkipBulkPipeline() should reflect csAssetsMode', () => { + (command as any).csAssetsMode = true; + expect((command as any).shouldSkipBulkPipeline()).to.be.true; + (command as any).csAssetsMode = false; + expect((command as any).shouldSkipBulkPipeline()).to.be.false; + }); }); }); diff --git a/packages/contentstack-bulk-operations/test/unit/commands/bulk-assets-init.test.ts b/packages/contentstack-bulk-operations/test/unit/commands/bulk-assets-init.test.ts new file mode 100644 index 000000000..381347841 --- /dev/null +++ b/packages/contentstack-bulk-operations/test/unit/commands/bulk-assets-init.test.ts @@ -0,0 +1,244 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import sinon from 'sinon'; +import { expect } from 'chai'; +import { describe, it, beforeEach, afterEach } from 'mocha'; +import { Command } from '@contentstack/cli-command'; +import BulkAssets from '../../../src/commands/cm/stacks/bulk-assets'; +import { BaseBulkCommand } from '../../../src/base-bulk-command'; +import { OperationFlagMatrixError } from '../../../src/utils/operation-flag-matrix'; + +/** + * Integration tests for the merged command's init() dispatch: operation + * resolution from argv, flag-matrix enforcement, pipeline selection, and the + * interactive prompt fallback. + */ +describe('BulkAssets command — init() dispatch', () => { + let sandbox: sinon.SinonSandbox; + let command: BulkAssets; + // The utils barrel re-exports via getters, so stubs must target the defining modules + let interactiveModule: any; + let logHandlerModule: any; + let cliUtilitiesModule: any; + let logStub: any; + let originalIsTTY: PropertyDescriptor | undefined; + + function setStdinTTY(value: boolean): void { + Object.defineProperty(process.stdin, 'isTTY', { value, configurable: true }); + } + + const csDeleteArgv = [ + '--operation', + 'delete', + '--space-uid', + 'sp1', + '--org-uid', + 'org1', + '--asset-uids-file', + './assets.json', + '--locale', + 'en-us', + '-y', + ]; + + function makeCommand(argv: string[]): BulkAssets { + const cmd = new BulkAssets(argv, {} as any); + (cmd as any).config = { + runHook: sandbox.stub().resolves(), + bin: 'test-bin', + version: '1.0.0', + }; + return cmd; + } + + beforeEach(() => { + sandbox = sinon.createSandbox(); + + cliUtilitiesModule = require('@contentstack/cli-utilities'); + logStub = { + info: sandbox.stub(), + warn: sandbox.stub(), + error: sandbox.stub(), + debug: sandbox.stub(), + success: sandbox.stub(), + }; + sandbox.stub(cliUtilitiesModule, 'log').value(logStub); + sandbox.stub(cliUtilitiesModule, 'handleAndLogError').callsFake(() => {}); + sandbox.stub(cliUtilitiesModule, 'createLogContext').callsFake(() => {}); + + interactiveModule = require('../../../src/utils/interactive'); + logHandlerModule = require('../../../src/utils/bulk-operation-log-handler'); + originalIsTTY = Object.getOwnPropertyDescriptor(process.stdin, 'isTTY'); + + // Stub the framework-level init so no real oclif/CLI setup runs + sandbox.stub(Command.prototype, 'init' as any).resolves(); + }); + + afterEach(() => { + sandbox.restore(); + process.exitCode = undefined; + if (originalIsTTY) { + Object.defineProperty(process.stdin, 'isTTY', originalIsTTY); + } else { + delete (process.stdin as any).isTTY; + } + }); + + describe('delete/move → CS Assets pipeline', () => { + it('skips the bulk pipeline entirely and fills CS Assets flags', async () => { + command = makeCommand([...csDeleteArgv]); + + const parsedFlags = { + operation: 'delete', + 'space-uid': 'sp1', + 'org-uid': 'org1', + 'asset-uids-file': './assets.json', + locale: 'en-us', + workspace: 'main', + yes: true, + }; + sandbox.stub(command as any, 'parse').resolves({ flags: parsedFlags }); + const fillStub = sandbox.stub(interactiveModule, 'fillMissingCsAssetsFlags').resolvesArg(0); + + const buildConfigSpy = sandbox.spy(command as any, 'buildConfiguration'); + const setupStackSpy = sandbox.spy(command as any, 'setupStack'); + + await (command as any).init(); + + expect((command as any).csAssetsMode).to.be.true; + expect((command as any).shouldSkipBulkPipeline()).to.be.true; + expect(fillStub.calledOnce).to.be.true; + expect((command as any).csAssetsFlags).to.deep.equal(parsedFlags); + // Bulk-publish pipeline must never run for CS Assets operations + expect(buildConfigSpy.called).to.be.false; + expect(setupStackSpy.called).to.be.false; + expect((command as any).queueManager).to.be.undefined; + expect((command as any).rateLimiter).to.be.undefined; + }); + }); + + describe('publish/unpublish → CMS pipeline', () => { + it('runs the full BaseBulkCommand pipeline', async () => { + command = makeCommand(['--operation', 'publish', '--environments', 'dev', '--locales', 'en-us', '-k', 'blt1']); + + sandbox.stub(command as any, 'parse').resolves({ + flags: { + operation: 'publish', + environments: ['dev'], + locales: ['en-us'], + 'stack-api-key': 'blt1', + }, + }); + sandbox.stub(interactiveModule, 'fillMissingFlags').resolvesArg(0); + sandbox.stub(logHandlerModule, 'clearLogs').returns(undefined); + const fillCsStub = sandbox.stub(interactiveModule, 'fillMissingCsAssetsFlags'); + + const buildConfigStub = sandbox.stub(command as any, 'buildConfiguration').callsFake(() => { + (command as any).bulkOperationConfig = { + operation: 'publish', + environments: ['dev'], + locales: ['en-us'], + bulkOperationFolder: '/mock/bulk-operation', + }; + return Promise.resolve(); + }); + const setupStackStub = sandbox.stub(command as any, 'setupStack').resolves(); + const initComponentsStub = sandbox.stub(command as any, 'initializeComponents').resolves(); + + await (command as any).init(); + + expect((command as any).csAssetsMode).to.be.false; + expect((command as any).shouldSkipBulkPipeline()).to.be.false; + expect(buildConfigStub.calledOnce).to.be.true; + expect(setupStackStub.calledOnce).to.be.true; + expect(initComponentsStub.calledOnce).to.be.true; + expect(fillCsStub.called).to.be.false; + }); + }); + + describe('flag-matrix enforcement', () => { + it('aborts init with OperationFlagMatrixError when a CMS flag is passed with delete', async () => { + command = makeCommand(['--operation', 'delete', '--environments', 'dev']); + const parseSpy = sandbox.spy(command as any, 'parse'); + + let thrown: unknown; + try { + await (command as any).init(); + } catch (e) { + thrown = e; + } + + expect(thrown).to.be.instanceOf(OperationFlagMatrixError); + expect(process.exitCode).to.equal(1); + expect(logStub.error.called).to.be.true; + expect(parseSpy.called).to.be.false; // aborted before any pipeline work + }); + + it('catch() swallows OperationFlagMatrixError without double-logging', async () => { + command = makeCommand([]); + const baseCatchStub = sandbox.stub(BaseBulkCommand.prototype, 'catch').resolves(); + + await (command as any).catch(new OperationFlagMatrixError(['--environments is not valid'])); + + expect(baseCatchStub.called).to.be.false; // violations already logged by enforce + }); + + it('catch() delegates other errors to the base handler', async () => { + command = makeCommand([]); + const baseCatchStub = sandbox.stub(BaseBulkCommand.prototype, 'catch').resolves(); + + await (command as any).catch(new Error('boom')); + + expect(baseCatchStub.calledOnce).to.be.true; + }); + }); + + describe('operation resolution', () => { + it('throws in non-TTY environments when --operation is missing', async () => { + command = makeCommand([]); + setStdinTTY(false); + + let thrown: unknown; + try { + await (command as any).init(); + } catch (e) { + thrown = e; + } + + expect(thrown).to.be.instanceOf(Error); + expect((thrown as Error).message).to.include('--operation'); + }); + + it('prompts with all four operations and feeds the answer back into argv', async () => { + command = makeCommand([]); + setStdinTTY(true); + + const promptStub = sandbox.stub(interactiveModule, 'promptForOperation').resolves('delete'); + sandbox.stub(command as any, 'parse').resolves({ flags: { operation: 'delete' } }); + sandbox.stub(interactiveModule, 'fillMissingCsAssetsFlags').resolvesArg(0); + + await (command as any).init(); + + expect(promptStub.calledOnce).to.be.true; + const choices = promptStub.firstCall.args[0]; + expect(choices.map((c: any) => c.value)).to.deep.equal(['publish', 'unpublish', 'delete', 'move']); + expect((command as any).argv).to.include.members(['--operation', 'delete']); + expect((command as any).csAssetsMode).to.be.true; + }); + + it('does not prompt on the retry/revert path but still rejects CS Assets flags', async () => { + command = makeCommand(['--retry-failed', './bulk-operation', '--space-uid', 'sp1']); + const promptStub = sandbox.stub(interactiveModule, 'promptForOperation'); + + let thrown: unknown; + try { + await (command as any).init(); + } catch (e) { + thrown = e; + } + + expect(promptStub.called).to.be.false; + expect(thrown).to.be.instanceOf(OperationFlagMatrixError); + expect(logStub.error.firstCall.args[0]).to.include('--retry-failed/--revert'); + }); + }); +}); diff --git a/packages/contentstack-bulk-operations/test/unit/utils/bulk-operation-log-handler.test.ts b/packages/contentstack-bulk-operations/test/unit/utils/bulk-operation-log-handler.test.ts index 151978dcc..7f05ccaaa 100644 --- a/packages/contentstack-bulk-operations/test/unit/utils/bulk-operation-log-handler.test.ts +++ b/packages/contentstack-bulk-operations/test/unit/utils/bulk-operation-log-handler.test.ts @@ -197,6 +197,7 @@ describe('Bulk Operation Log Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1' }], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -254,6 +255,7 @@ describe('Bulk Operation Log Handler', () => { items: [{ uid: 'entry1' }], status: 'failed', error: 'Network error', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -351,6 +353,7 @@ describe('Bulk Operation Log Handler', () => { item: { uid: 'entry1', type: 'entry', locale: 'en-us' }, environments: ['prod'], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -400,6 +403,7 @@ describe('Bulk Operation Log Handler', () => { environments: ['prod'], status: 'failed', error: 'Network error', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -442,6 +446,7 @@ describe('Bulk Operation Log Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', type: 'entry', locale: 'en-us' }], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -467,6 +472,7 @@ describe('Bulk Operation Log Handler', () => { locales: ['en-us'], items: [], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -492,6 +498,7 @@ describe('Bulk Operation Log Handler', () => { locales: [], items: [], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -528,6 +535,7 @@ describe('Bulk Operation Log Handler', () => { items: [], status: 'failed', error: 'API Error', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -563,6 +571,7 @@ describe('Bulk Operation Log Handler', () => { item: { uid: 'entry1', type: 'entry', locale: 'en-us' }, environments: ['prod'], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -586,6 +595,7 @@ describe('Bulk Operation Log Handler', () => { item: { uid: 'new-entry', type: 'entry', locale: 'en-us' }, environments: ['prod'], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -622,6 +632,7 @@ describe('Bulk Operation Log Handler', () => { environments: ['prod'], status: 'failed', error: 'Publish failed', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; @@ -644,6 +655,7 @@ describe('Bulk Operation Log Handler', () => { item: { uid: 'entry1', type: 'entry', locale: 'en-us' }, environments: [], status: 'failed', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }; diff --git a/packages/contentstack-bulk-operations/test/unit/utils/config-builder.test.ts b/packages/contentstack-bulk-operations/test/unit/utils/config-builder.test.ts index e47a42227..384e7d00f 100644 --- a/packages/contentstack-bulk-operations/test/unit/utils/config-builder.test.ts +++ b/packages/contentstack-bulk-operations/test/unit/utils/config-builder.test.ts @@ -567,6 +567,7 @@ describe('Config Builder Utilities', () => { }; configHandlerGetStub.withArgs('tokens.test-alias').returns({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack-from-alias', token: 'cs-token-123', }); @@ -589,6 +590,7 @@ describe('Config Builder Utilities', () => { }; configHandlerGetStub.withArgs('tokens.test-alias').returns({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack-mgmt', token: 'cs-mgmt-token', type: 'management', @@ -598,6 +600,7 @@ describe('Config Builder Utilities', () => { type: 'delivery', token: 'cs-delivery-token', environment: 'production', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack123', }); @@ -619,6 +622,7 @@ describe('Config Builder Utilities', () => { }; configHandlerGetStub.withArgs('tokens.test-alias').returns({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack-mgmt', token: 'cs-mgmt-token', type: 'management', @@ -640,6 +644,7 @@ describe('Config Builder Utilities', () => { }; configHandlerGetStub.withArgs('tokens.test-alias').returns({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack-mgmt', token: 'cs-mgmt-token', type: 'management', @@ -648,6 +653,7 @@ describe('Config Builder Utilities', () => { configHandlerGetStub.withArgs('tokens.mgmt-alias').returns({ type: 'management', token: 'cs-mgmt-token', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack123', }); @@ -665,6 +671,7 @@ describe('Config Builder Utilities', () => { }; configHandlerGetStub.withArgs('tokens.test-alias').returns({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack-mgmt', token: 'cs-mgmt-token', type: 'management', @@ -674,6 +681,7 @@ describe('Config Builder Utilities', () => { type: 'delivery', token: 'cs-delivery-token', environment: 'production', // Different from source-env + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'stack123', }); diff --git a/packages/contentstack-bulk-operations/test/unit/utils/interactive.test.ts b/packages/contentstack-bulk-operations/test/unit/utils/interactive.test.ts index 371a23839..c75cfb1fa 100644 --- a/packages/contentstack-bulk-operations/test/unit/utils/interactive.test.ts +++ b/packages/contentstack-bulk-operations/test/unit/utils/interactive.test.ts @@ -472,13 +472,13 @@ describe('Interactive Prompts', () => { it('should throw in non-TTY when required base flags are missing', async () => { Object.defineProperty(process.stdin, 'isTTY', { value: false, configurable: true }); - const flags = { workspace: 'main', yes: false }; + const flags = { operation: 'delete', workspace: 'main', yes: false }; try { await fillMissingCsAssetsFlags(flags); expect.fail('Should have thrown'); } catch (error: any) { - expect(error.message).to.include('--operation'); + expect(error.message).to.not.include('--operation,'); expect(error.message).to.include('--space-uid'); expect(error.message).to.include('--org-uid'); expect(error.message).to.include('--asset-uids-file'); @@ -525,13 +525,13 @@ describe('Interactive Prompts', () => { it('should prompt for all missing base flags in TTY and show interactive header/footer', async () => { Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true }); - const flags = {}; + // operation is always resolved by the command's init() before this runs + const flags = { operation: 'delete' }; - inquireStub.onCall(0).resolves('delete'); // operation - inquireStub.onCall(1).resolves('sp123'); // space-uid - inquireStub.onCall(2).resolves('org456'); // org-uid - inquireStub.onCall(3).resolves('./assets.json'); // asset-uids-file - inquireStub.onCall(4).resolves('en-us'); // locale (delete-conditional) + inquireStub.onCall(0).resolves('sp123'); // space-uid + inquireStub.onCall(1).resolves('org456'); // org-uid + inquireStub.onCall(2).resolves('./assets.json'); // asset-uids-file + inquireStub.onCall(3).resolves('en-us'); // locale (delete-conditional) const result = await fillMissingCsAssetsFlags(flags); @@ -598,25 +598,22 @@ describe('Interactive Prompts', () => { expect(inquireStub.called).to.be.false; }); - it('should present delete/move choices for the operation prompt', async () => { + it('should never prompt for the operation (resolved by init() before this runs)', async () => { Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true }); const flags = { + operation: 'delete', 'space-uid': 'sp123', 'org-uid': 'org456', 'asset-uids-file': './assets.json', - 'target-folder-uid': 'folderABC', }; - inquireStub.onCall(0).resolves('move'); // operation + inquireStub.onCall(0).resolves('en-us'); // locale await fillMissingCsAssetsFlags(flags); - const operationCall = inquireStub.firstCall.args[0]; - expect(operationCall.type).to.equal('list'); - const values = operationCall.choices.map((c: any) => c.value); - expect(values).to.include('delete'); - expect(values).to.include('move'); + const promptNames = inquireStub.getCalls().map((c: any) => c.args[0].name); + expect(promptNames).to.not.include('operation'); }); it('should validate that space-uid is not blank', async () => { diff --git a/packages/contentstack-bulk-operations/test/unit/utils/operation-flag-matrix.test.ts b/packages/contentstack-bulk-operations/test/unit/utils/operation-flag-matrix.test.ts new file mode 100644 index 000000000..84a01cf8b --- /dev/null +++ b/packages/contentstack-bulk-operations/test/unit/utils/operation-flag-matrix.test.ts @@ -0,0 +1,176 @@ +import sinon from 'sinon'; +import { expect } from 'chai'; +import { describe, it, beforeEach, afterEach } from 'mocha'; +import { + validateOperationFlagMatrix, + enforceOperationFlagMatrix, + getOperationFromArgv, + OperationFlagMatrixError, + RETRY_REVERT_CONTEXT, +} from '../../../src/utils/operation-flag-matrix'; + +describe('operation-flag-matrix', () => { + describe('validateOperationFlagMatrix', () => { + describe('delete/move reject CMS-only flags', () => { + it('rejects --environments with delete', () => { + const violations = validateOperationFlagMatrix('delete', ['--operation', 'delete', '--environments', 'dev']); + expect(violations).to.have.lengthOf(1); + expect(violations[0]).to.include('--environments'); + expect(violations[0]).to.include('delete'); + }); + + it('rejects explicitly passed defaulted flags (--branch, --publish-mode) with delete', () => { + const violations = validateOperationFlagMatrix('delete', [ + '--operation', + 'delete', + '--branch', + 'dev', + '--publish-mode', + 'bulk', + ]); + expect(violations).to.have.lengthOf(2); + expect(violations.join(' ')).to.include('--branch'); + expect(violations.join(' ')).to.include('--publish-mode'); + }); + + it('does NOT trip on flag defaults when they are not in argv', () => { + // --branch defaults to "main" after parse, but was never passed + const violations = validateOperationFlagMatrix('delete', [ + '--operation', + 'delete', + '--space-uid', + 'sp1', + '--org-uid', + 'org1', + '--asset-uids-file', + './assets.json', + '--locale', + 'en-us', + '-y', + ]); + expect(violations).to.be.empty; + }); + + it('rejects short flags -k and -a with move', () => { + const violations = validateOperationFlagMatrix('move', ['-k', 'blt123', '-a', 'myAlias']); + expect(violations).to.have.lengthOf(2); + }); + + it('rejects --flag=value form', () => { + const violations = validateOperationFlagMatrix('delete', ['--environments=dev']); + expect(violations).to.have.lengthOf(1); + }); + + it('rejects --retry-failed and --revert with delete', () => { + const violations = validateOperationFlagMatrix('delete', ['--retry-failed', './log', '--revert', './log']); + expect(violations).to.have.lengthOf(2); + }); + + it('adds a did-you-mean hint for --locales with delete', () => { + const violations = validateOperationFlagMatrix('delete', ['--locales', 'en-us']); + expect(violations).to.have.lengthOf(1); + expect(violations[0]).to.include('--locale?'); + }); + + it('rejects --locale with move (delete-only flag within CS Assets pair)', () => { + const violations = validateOperationFlagMatrix('move', ['--locale', 'en-us']); + expect(violations).to.have.lengthOf(1); + expect(violations[0]).to.include('--locale'); + }); + }); + + describe('publish/unpublish reject CS Assets flags', () => { + it('rejects --space-uid with publish', () => { + const violations = validateOperationFlagMatrix('publish', ['--space-uid', 'sp1']); + expect(violations).to.have.lengthOf(1); + expect(violations[0]).to.include('--space-uid'); + }); + + it('adds a did-you-mean hint for --locale with publish', () => { + const violations = validateOperationFlagMatrix('publish', ['--locale', 'en-us']); + expect(violations).to.have.lengthOf(1); + expect(violations[0]).to.include('--locales?'); + }); + + it('accepts a normal publish invocation', () => { + const violations = validateOperationFlagMatrix('publish', [ + '--operation', + 'publish', + '--environments', + 'dev', + '--locales', + 'en-us', + '-k', + 'blt123', + ]); + expect(violations).to.be.empty; + }); + + it('rejects CS Assets flags on the retry/revert path (no operation given)', () => { + const violations = validateOperationFlagMatrix(RETRY_REVERT_CONTEXT, [ + '--retry-failed', + './log', + '--space-uid', + 'sp1', + ]); + expect(violations).to.have.lengthOf(1); + expect(violations[0]).to.include('--space-uid'); + // retry/revert is not an operation the user typed — message must not present it as one + expect(violations[0]).to.include('--retry-failed/--revert'); + expect(violations[0]).to.not.include('operation "retry/revert"'); + }); + }); + }); + + describe('enforceOperationFlagMatrix', () => { + let sandbox: sinon.SinonSandbox; + let logErrorStub: sinon.SinonStub; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + const cliUtilities = require('@contentstack/cli-utilities'); + logErrorStub = sandbox.stub(); + sandbox.stub(cliUtilities, 'log').value({ error: logErrorStub }); + }); + + afterEach(() => { + sandbox.restore(); + process.exitCode = undefined; + }); + + it('throws OperationFlagMatrixError and sets exitCode=1 on violations (no process.exit)', () => { + let thrown: unknown; + try { + enforceOperationFlagMatrix('delete', ['--environments', 'dev', '--branch', 'main']); + } catch (e) { + thrown = e; + } + + expect(thrown).to.be.instanceOf(OperationFlagMatrixError); + expect((thrown as OperationFlagMatrixError).violations).to.have.lengthOf(2); + expect(process.exitCode).to.equal(1); + expect(logErrorStub.callCount).to.equal(2); // each violation logged individually + }); + + it('does nothing on a valid flag set', () => { + enforceOperationFlagMatrix('delete', ['--operation', 'delete', '--space-uid', 'sp1']); + + expect(process.exitCode).to.not.equal(1); + expect(logErrorStub.called).to.be.false; + }); + }); + + describe('getOperationFromArgv', () => { + it('reads --operation value form', () => { + expect(getOperationFromArgv(['--operation', 'delete'])).to.equal('delete'); + }); + + it('reads --operation=value form', () => { + expect(getOperationFromArgv(['--operation=move'])).to.equal('move'); + }); + + it('returns undefined when absent', () => { + expect(getOperationFromArgv(['--retry-failed', './log'])).to.be.undefined; + }); + }); +}); diff --git a/packages/contentstack-bulk-operations/test/unit/utils/revert-retry-handler.test.ts b/packages/contentstack-bulk-operations/test/unit/utils/revert-retry-handler.test.ts index 917cffa50..3ed09244f 100644 --- a/packages/contentstack-bulk-operations/test/unit/utils/revert-retry-handler.test.ts +++ b/packages/contentstack-bulk-operations/test/unit/utils/revert-retry-handler.test.ts @@ -60,6 +60,7 @@ describe('Revert Retry Handler', () => { items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' }], status: 'failed', error: 'Network timeout', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -86,6 +87,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'asset1', locale: 'en-us', version: 1, type: 'asset' }], status: 'failed', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -121,6 +123,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' }], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -161,6 +164,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' }], status: 'failed', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -201,6 +205,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' }], status: 'success', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -260,6 +265,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' }], status: 'failed', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -295,6 +301,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'asset1', locale: 'en-us', version: 1, type: 'asset' }], status: 'failed', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -337,6 +344,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' as const }], status: 'success' as const, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -360,6 +368,7 @@ describe('Revert Retry Handler', () => { locales: ['en-us'], items: [{ uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' as const }], status: 'success' as const, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -380,6 +389,7 @@ describe('Revert Retry Handler', () => { item: { uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' as const }, environments: ['prod'], status: 'success' as const, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, @@ -400,6 +410,7 @@ describe('Revert Retry Handler', () => { item: { uid: 'entry1', locale: 'en-us', contentType: 'blog', version: 1, type: 'entry' as const }, environments: ['prod'], status: 'success' as const, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', branch: 'main', }, diff --git a/packages/contentstack-cli-cm-regex-validate/package.json b/packages/contentstack-cli-cm-regex-validate/package.json index c638a86e7..e6b7268fd 100644 --- a/packages/contentstack-cli-cm-regex-validate/package.json +++ b/packages/contentstack-cli-cm-regex-validate/package.json @@ -1,12 +1,12 @@ { "name": "@contentstack/cli-cm-regex-validate", "description": "Validate Fields with Regex Property of Content Type and Global Field in a Stack", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.3", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@contentstack/management": "^1.30.2", "cli-table3": "^0.6.5", "inquirer": "12.11.1", diff --git a/packages/contentstack-cli-tsgen/package.json b/packages/contentstack-cli-tsgen/package.json index 513f21be7..cbfcf583e 100644 --- a/packages/contentstack-cli-tsgen/package.json +++ b/packages/contentstack-cli-tsgen/package.json @@ -1,12 +1,12 @@ { "name": "contentstack-cli-tsgen", "description": "Generate TypeScript typings from a Stack.", - "version": "5.0.0-beta.2", + "version": "5.0.0-beta.3", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@contentstack/types-generator": "^3.10.2" }, "devDependencies": { diff --git a/packages/contentstack-clone/package.json b/packages/contentstack-clone/package.json index c8c361b10..bbb126d09 100644 --- a/packages/contentstack-clone/package.json +++ b/packages/contentstack-clone/package.json @@ -1,15 +1,15 @@ { "name": "@contentstack/cli-cm-clone", "description": "Contentstack stack clone plugin", - "version": "2.0.0-beta.24", + "version": "2.0.0-beta.25", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { "@colors/colors": "^1.6.0", - "@contentstack/cli-cm-export": "~2.0.0-beta.23", - "@contentstack/cli-cm-import": "~2.0.0-beta.23", - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-cm-export": "~2.0.0-beta.24", + "@contentstack/cli-cm-import": "~2.0.0-beta.24", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@oclif/core": "^4.11.4", "chalk": "^5.6.2", "inquirer": "12.11.1", diff --git a/packages/contentstack-clone/test/commands/stack-clone.test.ts b/packages/contentstack-clone/test/commands/stack-clone.test.ts index e6da5895b..f069dc8ec 100644 --- a/packages/contentstack-clone/test/commands/stack-clone.test.ts +++ b/packages/contentstack-clone/test/commands/stack-clone.test.ts @@ -63,6 +63,7 @@ describe('Stack Clone Test', () => { describe('createNewStack', () => { it('should call createNewStack', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const createNewStackStub = sandbox.stub(handler, 'createNewStack').resolves({ api_key: 'test-key' }); await handler.createNewStack({ orgUid: 'dummyOrg' }); expect(createNewStackStub.calledOnce).to.be.true; diff --git a/packages/contentstack-clone/test/lib/helpers/command-helpers.test.ts b/packages/contentstack-clone/test/lib/helpers/command-helpers.test.ts index 67c64325c..c184b90a9 100644 --- a/packages/contentstack-clone/test/lib/helpers/command-helpers.test.ts +++ b/packages/contentstack-clone/test/lib/helpers/command-helpers.test.ts @@ -64,6 +64,7 @@ describe('Command Helpers', () => { executeDestination: async () => {}, cmdExport: async () => true, setBranch: async () => {}, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret createNewStack: async (params: any) => ({ api_key: 'test-key' }), cloneTypeSelection: async () => 'success', }; diff --git a/packages/contentstack-clone/test/lib/util/clone-handler.branch.test.ts b/packages/contentstack-clone/test/lib/util/clone-handler.branch.test.ts index 3fda70480..0879f999a 100644 --- a/packages/contentstack-clone/test/lib/util/clone-handler.branch.test.ts +++ b/packages/contentstack-clone/test/lib/util/clone-handler.branch.test.ts @@ -105,10 +105,12 @@ describe('CloneHandler - Branch', () => { try { await handler.resolveBranchAliases(true); // If it doesn't throw, verify stack was called + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack.calledWith({ api_key: 'test-source-key' })).to.be.true; } catch (error) { // Expected to fail due to actual function call without proper setup expect(error).to.exist; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack.calledWith({ api_key: 'test-source-key' })).to.be.true; } }); @@ -120,10 +122,12 @@ describe('CloneHandler - Branch', () => { try { await handler.resolveBranchAliases(false); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack.calledWith({ api_key: 'test-target-key' })).to.be.true; } catch (error) { // Expected to fail due to actual function call without proper setup expect(error).to.exist; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack.calledWith({ api_key: 'test-target-key' })).to.be.true; } }); diff --git a/packages/contentstack-content-type/package.json b/packages/contentstack-content-type/package.json index 8732a81de..ccc8934c6 100644 --- a/packages/contentstack-content-type/package.json +++ b/packages/contentstack-content-type/package.json @@ -1,12 +1,12 @@ { "name": "contentstack-cli-content-type", "description": "Retrieve information about Content Types in a Stack.", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.2", "author": "Contentstack Developer", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@types/diff2html": "^3.0.3", "@types/git-diff": "^2.0.7", "@types/hogan.js": "^3.0.5", diff --git a/packages/contentstack-content-type/tests/core/command.test.ts b/packages/contentstack-content-type/tests/core/command.test.ts index b56f811c7..a3826f04f 100644 --- a/packages/contentstack-content-type/tests/core/command.test.ts +++ b/packages/contentstack-content-type/tests/core/command.test.ts @@ -4,6 +4,7 @@ jest.mock('@contentstack/cli-command', () => ({ error = jest.fn() warn = jest.fn() getToken(_alias: string) { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret return { apiKey: 'default-api', type: 'management' } } }, @@ -11,6 +12,7 @@ jest.mock('@contentstack/cli-command', () => ({ jest.mock('@contentstack/cli-utilities', () => ({ authenticationHandler: { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret accessToken: 'auth-token', getAuthDetails: jest.fn(), }, @@ -149,6 +151,7 @@ describe('ContentTypeCommand', () => { it('sets apiKey from alias token and warns on delivery token', async () => { jest.spyOn(cmd, 'getToken').mockReturnValue({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'from-token', type: 'delivery', } as any) @@ -162,6 +165,7 @@ describe('ContentTypeCommand', () => { it('sets apiKey from management token alias without warning', async () => { jest.spyOn(cmd, 'getToken').mockReturnValue({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'mgmt-key', type: 'management', } as any) diff --git a/packages/contentstack-content-type/tests/core/contentstack/client.test.ts b/packages/contentstack-content-type/tests/core/contentstack/client.test.ts index 4580083c0..c800b4e01 100644 --- a/packages/contentstack-content-type/tests/core/contentstack/client.test.ts +++ b/packages/contentstack-content-type/tests/core/contentstack/client.test.ts @@ -36,6 +36,7 @@ describe('ContentstackClient', () => { expect(mockGet).toHaveBeenCalledWith( '/audit-logs', expect.objectContaining({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret headers: { api_key: 'stack-key' }, params: { query: { @@ -106,6 +107,7 @@ describe('ContentstackClient', () => { await client.getContentTypeReferences('stack-key', 'ct-uid', spinner) expect(mockGet).toHaveBeenCalledWith('/content_types/ct-uid/references', { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret headers: { api_key: 'stack-key' }, params: { include_global_fields: true } }) diff --git a/packages/contentstack-content-type/tests/utils/index.test.ts b/packages/contentstack-content-type/tests/utils/index.test.ts index e38d8e9a0..0509e3735 100644 --- a/packages/contentstack-content-type/tests/utils/index.test.ts +++ b/packages/contentstack-content-type/tests/utils/index.test.ts @@ -86,12 +86,14 @@ describe('utils/index', () => { const sdk = stackFactory({}) const stack = await getStack(sdk, 'api-key-1', spinner) expect(stack).toEqual({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-1', master_locale: 'en-us', name: 'Stack', org_uid: 'org-1', uid: 'stack-uid' }) + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(sdk.stack).toHaveBeenCalledWith({ api_key: 'api-key-1' }) }) diff --git a/packages/contentstack-export-to-csv/package.json b/packages/contentstack-export-to-csv/package.json index 45fbcf4dd..9eaa55d79 100644 --- a/packages/contentstack-export-to-csv/package.json +++ b/packages/contentstack-export-to-csv/package.json @@ -1,12 +1,12 @@ { "name": "@contentstack/cli-cm-export-to-csv", "description": "Export entries, taxonomies, terms, or organization users to CSV", - "version": "2.0.0-beta.10", + "version": "2.0.0-beta.11", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@oclif/core": "^4.11.4", "@inquirer/prompts": "^7.0.0", "fast-csv": "^4.3.6" diff --git a/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts b/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts index 2e787a9cb..319842002 100644 --- a/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts @@ -630,6 +630,7 @@ describe('cm:export-to-csv', () => { const aliasClient = { stack: sandbox.stub().returns({}) } as any; const aliasSpy = sandbox.stub(cmd, 'getAliasDetails').resolves({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret stackDetails: { name: 'Aliased', apiKey: 'ak-alias' } as any, apiClient: aliasClient, }); @@ -896,6 +897,7 @@ describe('cm:export-to-csv', () => { const restoreCli = patchCliUtilities({ isAuthenticated: () => true }); try { const { ExportCmd, interactiveMod } = reloadExportCommandWithUtilsStubs(sandbox, { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret chooseStack: { name: 'MyStack', apiKey: 'stack-key-99' }, }); const cmd = new ExportCmd([], minimalConfig); @@ -903,6 +905,7 @@ describe('cm:export-to-csv', () => { const out = await cmd.getStackDetails({} as any, 'stack-key-99', 'org-uid-z'); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(out).to.deep.equal({ name: 'MyStack', apiKey: 'stack-key-99' }); expect((interactiveMod.chooseStack as sinon.SinonStub).calledWith({}, 'org-uid-z', 'stack-key-99')).to.equal( true, diff --git a/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts index 3f412fa9d..67facb104 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts @@ -65,6 +65,7 @@ describe('error-handler', () => { it('should append api_key error details', () => { const error = { errorMessage: 'Invalid request', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret errors: { api_key: 'is required' }, }; const result = formatError(error); @@ -85,6 +86,7 @@ describe('error-handler', () => { it('should append access_token error details', () => { const error = { errorMessage: 'Unauthorized', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret errors: { access_token: 'is expired' }, }; const result = formatError(error); @@ -97,6 +99,7 @@ describe('error-handler', () => { errorMessage: 'Multiple errors', errors: { authorization: 'is invalid', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'is missing', }, }; diff --git a/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts index 427848f69..298a86cbb 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts @@ -120,6 +120,7 @@ describe('teams-export functional', () => { { uid: 'r1', name: 'Role', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret stack: { api_key: 'wrong-key', name: 'S', uid: 'su' }, }, ], @@ -183,6 +184,7 @@ describe('teams-export functional', () => { items: [{ uid: 'r1', name: 'Editor', stack: { api_key: 'k1', name: 'Stack1', uid: 's1' } }], } as any); roleStub.onSecondCall().resolves({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret items: [{ uid: 'r2', name: 'Author', stack: { api_key: 'wrong-k2', name: 'Stack2', uid: 's2' } }], } as any); const interactiveMod = loadInteractiveFresh(); diff --git a/packages/contentstack-export/package.json b/packages/contentstack-export/package.json index a873f3148..389d4835b 100644 --- a/packages/contentstack-export/package.json +++ b/packages/contentstack-export/package.json @@ -1,14 +1,14 @@ { "name": "@contentstack/cli-cm-export", "description": "Contentstack CLI plugin to export content from stack", - "version": "2.0.0-beta.23", + "version": "2.0.0-beta.24", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", - "@contentstack/cli-variants": "~2.0.0-beta.18", - "@contentstack/cli-asset-management": "~1.0.0-beta.6", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", + "@contentstack/cli-variants": "~2.0.0-beta.19", + "@contentstack/cli-asset-management": "~1.0.0-beta.7", "@oclif/core": "^4.11.4", "async": "^3.2.6", "big-json": "^3.2.0", @@ -22,8 +22,8 @@ "winston": "^3.19.0" }, "devDependencies": { - "@contentstack/cli-auth": "~2.0.0-beta.14", - "@contentstack/cli-config": "~2.0.0-beta.12", + "@contentstack/cli-auth": "~2.0.0-beta.16", + "@contentstack/cli-config": "~2.0.0-beta.14", "@contentstack/cli-dev-dependencies": "~2.0.0-beta.0", "@oclif/plugin-help": "^6.2.49", "@oclif/test": "^4.1.18", diff --git a/packages/contentstack-export/test/unit/export/module-exporter.test.ts b/packages/contentstack-export/test/unit/export/module-exporter.test.ts index bf8140ae2..057bcf64c 100644 --- a/packages/contentstack-export/test/unit/export/module-exporter.test.ts +++ b/packages/contentstack-export/test/unit/export/module-exporter.test.ts @@ -23,6 +23,7 @@ describe('ModuleExporter exportByBranches', () => { const exportConfig: Partial = { exportDir, branches, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', management_token: 'token', context: {} as any, @@ -54,6 +55,7 @@ describe('ModuleExporter exportByBranches', () => { exportDir, branchName: 'dev', branches, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', management_token: 'token', context: {} as any, @@ -82,6 +84,7 @@ describe('ModuleExporter exportByBranches', () => { exportDir, branchName: 'nonexistent', branches, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', management_token: 'token', context: {} as any, @@ -107,6 +110,7 @@ describe('ModuleExporter exportByBranches', () => { const exportConfig: Partial = { exportDir, branches, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-key', management_token: 'token', context: {} as any, diff --git a/packages/contentstack-export/test/unit/export/modules/marketplace-apps.test.ts b/packages/contentstack-export/test/unit/export/modules/marketplace-apps.test.ts index a570e3669..78071be17 100644 --- a/packages/contentstack-export/test/unit/export/modules/marketplace-apps.test.ts +++ b/packages/contentstack-export/test/unit/export/modules/marketplace-apps.test.ts @@ -17,6 +17,7 @@ describe('ExportMarketplaceApps', () => { versioning: false, host: 'https://api.contentstack.io', developerHubUrls: {}, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-stack-uid', exportDir: '/test/export', data: '/test/data', diff --git a/packages/contentstack-export/test/unit/utils/common-helper.test.ts b/packages/contentstack-export/test/unit/utils/common-helper.test.ts index 4df53634d..574927cb1 100644 --- a/packages/contentstack-export/test/unit/utils/common-helper.test.ts +++ b/packages/contentstack-export/test/unit/utils/common-helper.test.ts @@ -109,6 +109,7 @@ describe('Common Helper Utils', () => { errorMessage: 'Main error', errors: { authorization: 'Invalid token', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'Invalid key' } }; diff --git a/packages/contentstack-export/test/unit/utils/export-config-handler.test.ts b/packages/contentstack-export/test/unit/utils/export-config-handler.test.ts index 2ba1ba98f..87bee9057 100644 --- a/packages/contentstack-export/test/unit/utils/export-config-handler.test.ts +++ b/packages/contentstack-export/test/unit/utils/export-config-handler.test.ts @@ -206,7 +206,8 @@ describe('Export Config Handler', () => { it('should support alias flag as alternative to management-token-alias', async () => { configHandlerGetStub.withArgs('tokens.test-alias').returns({ token: 'test-token', - apiKey: 'test-key', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret + apiKey: 'test-key' }); const flags = { @@ -228,7 +229,8 @@ describe('Export Config Handler', () => { // Provide username and password via external config file readFileStub.resolves({ username: 'test@example.com', - password: 'test-password', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret + password: 'test-password' }); const flags = { diff --git a/packages/contentstack-export/test/unit/utils/interactive.test.ts b/packages/contentstack-export/test/unit/utils/interactive.test.ts index d597c3373..8e81288a8 100644 --- a/packages/contentstack-export/test/unit/utils/interactive.test.ts +++ b/packages/contentstack-export/test/unit/utils/interactive.test.ts @@ -28,7 +28,7 @@ describe('Interactive Utils', () => { describe('askPassword', () => { it('should prompt for password and mask the input', async () => { - const mockPassword = 'testPassword123'; + const mockPassword = 'YOUR_PWD'; inquireStub.resolves(mockPassword); const result = await askPassword(); @@ -247,6 +247,7 @@ describe('Interactive Utils', () => { describe('askAPIKey', () => { it('should prompt for stack API key', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const mockAPIKey = 'blt1234567890abcdef'; inquireStub.resolves(mockAPIKey); diff --git a/packages/contentstack-export/test/unit/utils/marketplace-app-helper.test.ts b/packages/contentstack-export/test/unit/utils/marketplace-app-helper.test.ts index d1a9e2170..3b8ecfddd 100644 --- a/packages/contentstack-export/test/unit/utils/marketplace-app-helper.test.ts +++ b/packages/contentstack-export/test/unit/utils/marketplace-app-helper.test.ts @@ -15,6 +15,7 @@ describe('Marketplace App Helper Utils', () => { versioning: false, host: 'https://api.contentstack.io', developerHubUrls: {}, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-stack-uid', exportDir: '/test/export', data: '/test/data', @@ -116,6 +117,7 @@ describe('Marketplace App Helper Utils', () => { expect(managementSDKClientSpy.calledOnce).to.be.true; expect(mockStack.calledOnce).to.be.true; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockStack.firstCall.args[0]).to.deep.equal({ api_key: 'test-stack-uid' }); expect(mockFetch.calledOnce).to.be.true; expect(result).to.equal('test-org-uid-123'); @@ -133,6 +135,7 @@ describe('Marketplace App Helper Utils', () => { await getOrgUid(mockExportConfig); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockStack.firstCall.args[0]).to.deep.equal({ api_key: 'custom-stack-key' }); }); @@ -316,6 +319,7 @@ describe('Marketplace App Helper Utils', () => { await createNodeCryptoInstance(mockExportConfig); expect(nodeCryptoConstructorSpy.calledOnce).to.be.true; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(capturedArgs).to.deep.equal({ encryptionKey: 'test-encryption-key' }); }); diff --git a/packages/contentstack-external-migrate/package.json b/packages/contentstack-external-migrate/package.json index 61c6756de..3dcb87d2b 100644 --- a/packages/contentstack-external-migrate/package.json +++ b/packages/contentstack-external-migrate/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-external-migrate", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.3", "description": "Migrate from external source to Contentstack", "author": "Contentstack", "license": "MIT", @@ -23,8 +23,8 @@ "version": "oclif readme && git add README.md" }, "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@contentstack/json-rte-serializer": "~2.1.0", "@contentstack/marketplace-sdk": "~1.5.2", "@oclif/core": "^4.8.0", diff --git a/packages/contentstack-external-migrate/src/lib/helpers.ts b/packages/contentstack-external-migrate/src/lib/helpers.ts index da2ec3641..1a3811c6a 100644 --- a/packages/contentstack-external-migrate/src/lib/helpers.ts +++ b/packages/contentstack-external-migrate/src/lib/helpers.ts @@ -26,4 +26,4 @@ export const sanitizePath = (str: string): string => { */ export const pathValidator = (filePath: string): string => { return normalize(resolve(process.cwd(), filePath)).replace(/^(\.\.(\/|\\|$))+/, ''); -}; \ No newline at end of file +}; diff --git a/packages/contentstack-import-setup/package.json b/packages/contentstack-import-setup/package.json index b3a9af7a9..9bd3dcc53 100644 --- a/packages/contentstack-import-setup/package.json +++ b/packages/contentstack-import-setup/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-import-setup", "description": "Contentstack CLI plugin to setup the mappers and configurations for the import command", - "version": "2.0.0-beta.17", + "version": "2.0.0-beta.18", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", - "@contentstack/cli-asset-management": "~1.0.0-beta.6", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", + "@contentstack/cli-asset-management": "~1.0.0-beta.7", "@oclif/core": "^4.11.4", "big-json": "^3.2.0", "chalk": "^5.6.2", diff --git a/packages/contentstack-import-setup/test/unit/common-helper.test.ts b/packages/contentstack-import-setup/test/unit/common-helper.test.ts index f971b92bd..0878ed5ff 100644 --- a/packages/contentstack-import-setup/test/unit/common-helper.test.ts +++ b/packages/contentstack-import-setup/test/unit/common-helper.test.ts @@ -44,6 +44,7 @@ describe('Common Helper Utilities', () => { describe('askAPIKey', () => { it('should prompt user for API key and return the response', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const mockApiKey = 'test-api-key-12345'; cliuxInquireStub = stub(cliux, 'inquire').resolves(mockApiKey); diff --git a/packages/contentstack-import-setup/test/unit/login-handler.test.ts b/packages/contentstack-import-setup/test/unit/login-handler.test.ts index 2dfeeb45f..8a8137bed 100644 --- a/packages/contentstack-import-setup/test/unit/login-handler.test.ts +++ b/packages/contentstack-import-setup/test/unit/login-handler.test.ts @@ -78,15 +78,9 @@ describe('Login Handler', () => { it('should successfully login with email and password and set headers', async () => { const config: ImportConfig = { email: 'test@example.com', - password: 'testpassword', - source_stack: 'test-api-key', - access_token: 'test-access-token', - authtoken: 'test-auth-token', - apiKey: 'test-api-key', - contentDir: '/test/content', - data: '/test/content', - management_token: undefined, - target_stack: 'test-api-key', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret + password: 'YOUR_PWD', + source_stack: 'test-stack-key', } as ImportConfig; mockClient.login.resolves({ @@ -97,24 +91,24 @@ describe('Login Handler', () => { const result = await loginHandler(config, deps); - expect(result).to.equal(config); - expect(config.headers).to.exist; - expect(config.headers!.api_key).to.equal('test-api-key'); - expect(config.headers!.access_token).to.equal('test-access-token'); - expect(config.headers!.authtoken).to.equal('test-auth-token'); - expect(config.headers!['X-User-Agent']).to.equal('contentstack-export/v'); - expect(mockClient.login.calledOnce).to.be.true; - expect(mockClient.login.calledWith({ email: 'test@example.com', password: 'testpassword' })).to.be.true; - expect(logSuccessStub.calledWith('Contentstack account authenticated successfully!')).to.be.true; + expect(managementSDKClientStub.calledOnce).to.be.true; + expect(clientLoginStub.calledOnce).to.be.true; + expect( + clientLoginStub.calledWith({ + email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret + password: 'YOUR_PWD', + }), + ).to.be.true; + + expect(logStub.calledWith(result, 'Contentstack account authenticated successfully!', 'success')).to.be.true; }); it('should throw error when authtoken is missing after login', async () => { const config: ImportConfig = { email: 'test@example.com', - password: 'testpassword', - apiKey: 'test-api-key', - contentDir: '/test/content', - data: '/test/content', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret + password: 'YOUR_PWD_WRONG', } as ImportConfig; mockClient.login.resolves({ @@ -136,6 +130,7 @@ describe('Login Handler', () => { it('should throw error when user object is missing authtoken property', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -157,6 +152,7 @@ describe('Login Handler', () => { it('should throw error when user object is missing', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -176,6 +172,7 @@ describe('Login Handler', () => { it('should handle login API errors', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -409,9 +406,11 @@ describe('Login Handler', () => { it('should prioritize email/password over existing auth when email and password are present', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', source_stack: 'test-api-key', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret access_token: 'test-access-token', authtoken: 'test-auth-token', contentDir: '/test/content', diff --git a/packages/contentstack-import/package.json b/packages/contentstack-import/package.json index bded36cf5..07483ff4c 100644 --- a/packages/contentstack-import/package.json +++ b/packages/contentstack-import/package.json @@ -1,15 +1,15 @@ { "name": "@contentstack/cli-cm-import", "description": "Contentstack CLI plugin to import content into stack", - "version": "2.0.0-beta.23", + "version": "2.0.0-beta.24", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-audit": "~2.0.0-beta.14", - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", - "@contentstack/cli-variants": "~2.0.0-beta.18", - "@contentstack/cli-asset-management": "~1.0.0-beta.6", + "@contentstack/cli-audit": "~2.0.0-beta.15", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", + "@contentstack/cli-variants": "~2.0.0-beta.19", + "@contentstack/cli-asset-management": "~1.0.0-beta.7", "@oclif/core": "^4.11.4", "big-json": "^3.2.0", "bluebird": "^3.7.2", diff --git a/packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts b/packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts index 99cae5dfd..1bed8fe6b 100644 --- a/packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts +++ b/packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts @@ -68,6 +68,7 @@ describe('ImportCommand', () => { forceStopMarketplaceAppsPrompt: false, skipPrivateAppRecreationIfExist: true, isAuthenticated: true, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret auth_token: 'auth-token', selectedModules: ['entries'], skipAudit: false, diff --git a/packages/contentstack-import/test/unit/import/modules/assets.test.ts b/packages/contentstack-import/test/unit/import/modules/assets.test.ts index 45cc20965..895216076 100644 --- a/packages/contentstack-import/test/unit/import/modules/assets.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/assets.test.ts @@ -70,6 +70,7 @@ describe('ImportAssets', () => { forceStopMarketplaceAppsPrompt: false, skipPrivateAppRecreationIfExist: true, isAuthenticated: true, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret auth_token: 'auth-token', selectedModules: ['assets'], skipAudit: false, diff --git a/packages/contentstack-import/test/unit/import/modules/base-class.test.ts b/packages/contentstack-import/test/unit/import/modules/base-class.test.ts index e0de1f06e..b95ef0997 100644 --- a/packages/contentstack-import/test/unit/import/modules/base-class.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/base-class.test.ts @@ -130,6 +130,7 @@ describe('BaseClass', () => { forceStopMarketplaceAppsPrompt: false, skipPrivateAppRecreationIfExist: true, isAuthenticated: true, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret auth_token: 'auth-token', selectedModules: ['assets'], skipAudit: false, diff --git a/packages/contentstack-import/test/unit/import/modules/content-types.test.ts b/packages/contentstack-import/test/unit/import/modules/content-types.test.ts index f016cdacf..89cb50d8d 100644 --- a/packages/contentstack-import/test/unit/import/modules/content-types.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/content-types.test.ts @@ -169,6 +169,7 @@ describe('ImportContentTypes', () => { forceStopMarketplaceAppsPrompt: false, skipPrivateAppRecreationIfExist: true, isAuthenticated: true, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret auth_token: 'auth-token', selectedModules: ['content-types'], skipAudit: false, diff --git a/packages/contentstack-import/test/unit/import/modules/entries.test.ts b/packages/contentstack-import/test/unit/import/modules/entries.test.ts index 4e2e11d1b..2aa2bbb9e 100644 --- a/packages/contentstack-import/test/unit/import/modules/entries.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/entries.test.ts @@ -139,6 +139,7 @@ describe('EntriesImport', () => { forceStopMarketplaceAppsPrompt: false, skipPrivateAppRecreationIfExist: true, isAuthenticated: true, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret auth_token: 'auth-token', selectedModules: ['entries'], skipAudit: false, diff --git a/packages/contentstack-import/test/unit/import/modules/global-fields.test.ts b/packages/contentstack-import/test/unit/import/modules/global-fields.test.ts index a9f49aa38..f48ba79d0 100644 --- a/packages/contentstack-import/test/unit/import/modules/global-fields.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/global-fields.test.ts @@ -79,6 +79,7 @@ describe('ImportGlobalFields', () => { forceStopMarketplaceAppsPrompt: false, skipPrivateAppRecreationIfExist: true, isAuthenticated: true, + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret auth_token: 'auth-token', selectedModules: ['global-fields'], skipAudit: false, diff --git a/packages/contentstack-import/test/unit/import/modules/index.test.ts b/packages/contentstack-import/test/unit/import/modules/index.test.ts index 6f2322cc8..73494f4f5 100644 --- a/packages/contentstack-import/test/unit/import/modules/index.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/index.test.ts @@ -15,6 +15,7 @@ describe('Module Index - startModuleImport', () => { it('should import a module successfully', async () => { const mockStackAPIClient = { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'test-key', name: 'test-stack' } as any; @@ -44,6 +45,7 @@ describe('Module Index - startModuleImport', () => { it('should handle module import errors', async () => { const mockStackAPIClient = { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'test-key', name: 'test-stack' } as any; @@ -69,6 +71,7 @@ describe('Module Index - startModuleImport', () => { it('should handle different module names', async () => { const mockStackAPIClient = { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'test-key', name: 'test-stack' } as any; @@ -97,6 +100,7 @@ describe('Module Index - startModuleImport', () => { it('should handle stack module', async () => { const mockStackAPIClient = { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'test-key', name: 'test-stack' } as any; @@ -136,6 +140,7 @@ describe('Module Index - startModuleImport', () => { sinon.replace(fs, 'existsSync', existsSyncStub); const mockStackAPIClient = { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'test-key', name: 'test-stack', asset: sandbox.stub().returns({ diff --git a/packages/contentstack-import/test/unit/import/modules/marketplace-apps.test.ts b/packages/contentstack-import/test/unit/import/modules/marketplace-apps.test.ts index bd67144eb..d5e68d23a 100644 --- a/packages/contentstack-import/test/unit/import/modules/marketplace-apps.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/marketplace-apps.test.ts @@ -576,6 +576,7 @@ describe('ImportMarketplaceApps', () => { // Set up required properties (importMarketplaceApps as any).appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret (importMarketplaceApps as any).nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); // Set up installedApps so the app is found as existing (importMarketplaceApps as any).installedApps = [app]; @@ -618,6 +619,7 @@ describe('ImportMarketplaceApps', () => { beforeEach(() => { importMarketplaceApps = new ImportMarketplaceApps(mockModuleClassParams); importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); }); @@ -739,6 +741,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with empty configuration', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -760,6 +763,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with configuration error', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -790,6 +794,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with server configuration error', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -976,6 +981,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with existing app and configuration', async () => { importMarketplaceApps.appSdk = mockAppSdk; // Set up nodeCrypto for decryption + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); // Set installedApps directly on the instance (importMarketplaceApps as any).installedApps = mockData.mockInstalledApps; @@ -1010,6 +1016,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with successful configuration update', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1040,6 +1047,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with configuration update error', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1074,6 +1082,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with successful server configuration update', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1104,6 +1113,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with server configuration update error', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1139,6 +1149,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with existing app and UID mapping already set', async () => { importMarketplaceApps.appSdk = mockAppSdk; // Set up nodeCrypto for decryption + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); // Set installedApps directly on the instance (importMarketplaceApps as any).installedApps = mockData.mockInstalledApps; @@ -1156,6 +1167,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with updateParam and configuration', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); // Set installedApps directly on the instance (importMarketplaceApps as any).installedApps = mockData.mockInstalledApps; @@ -1180,6 +1192,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with updateParam but no configuration', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); // Set installedApps directly on the instance (importMarketplaceApps as any).installedApps = mockData.mockInstalledApps; @@ -1254,6 +1267,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with configuration success path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1284,6 +1298,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with server configuration success path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1314,6 +1329,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with configuration error path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1348,6 +1364,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with server configuration error path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1382,6 +1399,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with existing app and configuration - specific branch coverage', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const existingApp = { @@ -1429,6 +1447,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with configuration success - specific success path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1458,6 +1477,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with server configuration success - specific success path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1487,6 +1507,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with configuration error - specific error path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1520,6 +1541,7 @@ describe('ImportMarketplaceApps', () => { it('should handle updateAppsConfig with server configuration error - specific error path', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1553,6 +1575,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with existing app that has configuration - exact branch coverage', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); // First, we need to populate installedApps by calling start() or setting it directly @@ -1587,6 +1610,7 @@ describe('ImportMarketplaceApps', () => { it('should handle installApps with installation failure - specific error branch coverage', async () => { importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); const app = { @@ -1949,6 +1973,7 @@ describe('ImportMarketplaceApps', () => { }); it('should use provided encryption key', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const encryptionKey = 'test-encryption-key'; await importMarketplaceApps.getAndValidateEncryptionKey(encryptionKey); @@ -1981,6 +2006,7 @@ describe('ImportMarketplaceApps', () => { describe('updateAppsConfig()', () => { beforeEach(() => { importMarketplaceApps = new ImportMarketplaceApps(mockModuleClassParams); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); }); @@ -2239,6 +2265,7 @@ describe('ImportMarketplaceApps', () => { beforeEach(() => { importMarketplaceApps = new ImportMarketplaceApps(mockModuleClassParams); importMarketplaceApps.appSdk = mockAppSdk; + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret importMarketplaceApps.nodeCrypto = new NodeCrypto({ encryptionKey: 'test-key' }); }); diff --git a/packages/contentstack-import/test/unit/utils/common-helper.test.ts b/packages/contentstack-import/test/unit/utils/common-helper.test.ts index a53b21ba2..75cd2556d 100644 --- a/packages/contentstack-import/test/unit/utils/common-helper.test.ts +++ b/packages/contentstack-import/test/unit/utils/common-helper.test.ts @@ -1280,8 +1280,10 @@ describe('Common Helper', () => { message: 'Base error', errors: { authorization: 'Invalid token', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'Invalid key', uid: 'Invalid UID', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret access_token: 'Invalid access token', }, }; diff --git a/packages/contentstack-import/test/unit/utils/interactive.test.ts b/packages/contentstack-import/test/unit/utils/interactive.test.ts index a0d40880f..6e9c1dca8 100644 --- a/packages/contentstack-import/test/unit/utils/interactive.test.ts +++ b/packages/contentstack-import/test/unit/utils/interactive.test.ts @@ -83,6 +83,7 @@ describe('Interactive Utils', () => { describe('askAPIKey', () => { it('should return API key from user input', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'test-api-key-123'; cliuxInquireStub.resolves(apiKey); diff --git a/packages/contentstack-import/test/unit/utils/login-handler.test.ts b/packages/contentstack-import/test/unit/utils/login-handler.test.ts index eb8bd428c..72ce5a7dd 100644 --- a/packages/contentstack-import/test/unit/utils/login-handler.test.ts +++ b/packages/contentstack-import/test/unit/utils/login-handler.test.ts @@ -43,8 +43,10 @@ describe('Login Handler', () => { it('should successfully login with email and password and set headers', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', source_stack: 'test-api-key', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret access_token: 'test-access-token', authtoken: 'test-auth-token', apiKey: 'test-api-key', @@ -69,12 +71,14 @@ describe('Login Handler', () => { expect(config.headers!.authtoken).to.equal('test-auth-token'); expect(config.headers!['X-User-Agent']).to.equal('contentstack-export/v'); expect(mockClient.login.calledOnce).to.be.true; + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret expect(mockClient.login.calledWith({ email: 'test@example.com', password: 'testpassword' })).to.be.true; }); it('should throw error when authtoken is missing after login', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -100,7 +104,9 @@ describe('Login Handler', () => { it('should throw error when user object is missing authtoken property', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-api-key', contentDir: '/test/content', data: '/test/content', @@ -121,6 +127,7 @@ describe('Login Handler', () => { it('should throw error when user object is missing', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -140,6 +147,7 @@ describe('Login Handler', () => { it('should handle login API errors', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -407,9 +415,12 @@ describe('Login Handler', () => { it('should prioritize email/password over existing auth when email and password are present', async () => { const config: ImportConfig = { email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-api-key', source_stack: 'test-api-key', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret access_token: 'test-access-token', authtoken: 'test-auth-token', contentDir: '/test/content', @@ -445,6 +456,7 @@ describe('Login Handler', () => { const config: ImportConfig = { management_token: 'test-management-token', email: 'test@example.com', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -543,6 +555,7 @@ describe('Login Handler', () => { it('should handle config with undefined email', async () => { const config: ImportConfig = { email: undefined, + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', @@ -565,6 +578,7 @@ describe('Login Handler', () => { it('should handle config with empty string email', async () => { const config: ImportConfig = { email: '', + // deepcode ignore NoHardcodedPasswords: test fixture value, not a real secret password: 'testpassword', apiKey: 'test-api-key', contentDir: '/test/content', diff --git a/packages/contentstack-import/test/unit/utils/marketplace-app-helper.test.ts b/packages/contentstack-import/test/unit/utils/marketplace-app-helper.test.ts index 572e8f034..d3da20892 100644 --- a/packages/contentstack-import/test/unit/utils/marketplace-app-helper.test.ts +++ b/packages/contentstack-import/test/unit/utils/marketplace-app-helper.test.ts @@ -34,6 +34,7 @@ describe('Marketplace App Helper', () => { mockConfig = { org_uid: 'test-org-uid', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'test-stack-uid', host: 'https://api.contentstack.io', developerHubBaseUrl: 'https://developerhub-api.contentstack.com', @@ -230,6 +231,7 @@ describe('Marketplace App Helper', () => { const result = await getOrgUid(mockConfig); expect(result).to.equal('test-org-123'); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack.calledWith({ api_key: mockConfig.apiKey })).to.be.true; }); diff --git a/packages/contentstack-migrate-rte/package.json b/packages/contentstack-migrate-rte/package.json index afbac4293..deca46ed6 100644 --- a/packages/contentstack-migrate-rte/package.json +++ b/packages/contentstack-migrate-rte/package.json @@ -1,14 +1,14 @@ { "name": "@contentstack/cli-cm-migrate-rte", "description": "Contentstack CLI plugin to migrate HTML RTE to JSON RTE", - "version": "2.0.0-beta.8", + "version": "2.0.0-beta.9", "author": "contentstack", "bugs": { "url": "https://github.com/contentstack/cli-plugins/issues" }, "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@contentstack/json-rte-serializer": "~2.1.0", "@oclif/core": "^4.11.4", "@oclif/plugin-help": "^6.2.49", diff --git a/packages/contentstack-migrate-rte/test/commands/json-migration.test.js b/packages/contentstack-migrate-rte/test/commands/json-migration.test.js index ec2b3f14d..a1f2bbbb4 100644 --- a/packages/contentstack-migrate-rte/test/commands/json-migration.test.js +++ b/packages/contentstack-migrate-rte/test/commands/json-migration.test.js @@ -143,6 +143,7 @@ describe("Migration Config validation", () => { getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -442,6 +443,7 @@ describe("Content Type with Single RTE Field of Single Type", function () { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -936,6 +938,7 @@ describe("Global Field Migration", () => { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -1108,6 +1111,7 @@ describe("Content Type with single rte of multiple type", () => { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -1139,6 +1143,7 @@ describe("Content Type with Single RTE inside modular block", () => { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -1178,6 +1183,7 @@ describe("Content Type with Single RTE of type multiple inside group", () => { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -1217,6 +1223,7 @@ describe("Content Type with Single RTE inside group of type multiple", () => { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); @@ -1256,6 +1263,7 @@ describe("Content Type with multiple file field", () => { const getTokenCallback = sinon.stub(); getTokenCallback.withArgs("test1").returns({ token: "testManagementToken", + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: "testApiKey", type: "management", }); diff --git a/packages/contentstack-migrate-rte/test/utils/index.js b/packages/contentstack-migrate-rte/test/utils/index.js index 2d10fe667..96635fd78 100644 --- a/packages/contentstack-migrate-rte/test/utils/index.js +++ b/packages/contentstack-migrate-rte/test/utils/index.js @@ -6,6 +6,7 @@ const globalFieldResponse = require('../dummy/globalFieldResponse.json') const dummyToken = { test1: { token: 'testManagementToken', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'testApiKey', type: 'management', }, diff --git a/packages/contentstack-migration/package.json b/packages/contentstack-migration/package.json index 2d390510b..d75a243db 100644 --- a/packages/contentstack-migration/package.json +++ b/packages/contentstack-migration/package.json @@ -1,11 +1,11 @@ { "name": "@contentstack/cli-migration", - "version": "2.0.0-beta.15", + "version": "2.0.0-beta.16", "author": "@contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@oclif/core": "^4.11.4", "async": "^3.2.6", "callsites": "^3.1.0", diff --git a/packages/contentstack-query-export/package.json b/packages/contentstack-query-export/package.json index 07e838447..d3f048ed0 100644 --- a/packages/contentstack-query-export/package.json +++ b/packages/contentstack-query-export/package.json @@ -1,14 +1,14 @@ { "name": "@contentstack/cli-cm-export-query", "description": "Contentstack CLI plugin to export content from stack", - "version": "2.0.0-beta.7", + "version": "2.0.0-beta.8", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-asset-management": "~1.0.0-beta.6", - "@contentstack/cli-cm-export": "~2.0.0-beta.23", - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-asset-management": "~1.0.0-beta.7", + "@contentstack/cli-cm-export": "~2.0.0-beta.24", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@oclif/core": "^4.11.4", "async": "^3.2.6", "big-json": "^3.2.0", diff --git a/packages/contentstack-query-export/test/unit/common-helper.test.ts b/packages/contentstack-query-export/test/unit/common-helper.test.ts index b1cb3b298..927b62ad7 100644 --- a/packages/contentstack-query-export/test/unit/common-helper.test.ts +++ b/packages/contentstack-query-export/test/unit/common-helper.test.ts @@ -16,6 +16,7 @@ describe('Common Helper Utilities', () => { describe('askAPIKey', () => { it('should prompt user for API key and return the response', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const mockApiKey = 'test-api-key-12345'; cliuxInquireStub = stub(cliux, 'inquire').resolves(mockApiKey); diff --git a/packages/contentstack-seed/package.json b/packages/contentstack-seed/package.json index 6d14bd0c9..226be054e 100644 --- a/packages/contentstack-seed/package.json +++ b/packages/contentstack-seed/package.json @@ -1,20 +1,20 @@ { "name": "@contentstack/cli-cm-seed", "description": "create a Stack from existing content types, entries, assets, etc.", - "version": "2.0.0-beta.23", + "version": "2.0.0-beta.24", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-cm-import": "~2.0.0-beta.23", - "@contentstack/cli-command": "~2.0.0-beta.9", - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-cm-import": "~2.0.0-beta.24", + "@contentstack/cli-command": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "inquirer": "12.11.1", "mkdirp": "^1.0.4", "tar": "^7.5.20", "tmp": "^0.2.7" }, "devDependencies": { - "@types/inquirer": "^9.0.9", + "@types/inquirer": "^9.0.10", "@types/jest": "^26.0.24", "@types/mkdirp": "^1.0.2", "@types/node": "^18.11.9", diff --git a/packages/contentstack-seed/test/commands/cm/stacks/seed.test.ts b/packages/contentstack-seed/test/commands/cm/stacks/seed.test.ts index c3102246f..9cf2e1512 100644 --- a/packages/contentstack-seed/test/commands/cm/stacks/seed.test.ts +++ b/packages/contentstack-seed/test/commands/cm/stacks/seed.test.ts @@ -77,6 +77,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret mockSeeder.run.mockResolvedValue({ api_key: 'api-key-123' }); await command.run(); @@ -114,6 +115,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret mockSeeder.run.mockResolvedValue({ api_key: 'api-key-123' }); await command.run(); @@ -142,6 +144,7 @@ describe('SeedCommand', () => { const mockTokens = { 'my-alias': { token: 'management-token-123', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'api-key-123', }, }; @@ -152,6 +155,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret mockSeeder.run.mockResolvedValue({ api_key: 'api-key-123' }); await command.run(); @@ -243,6 +247,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret mockSeeder.run.mockResolvedValue({ api_key: 'api-key-123' }); await command.run(); @@ -270,6 +275,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret mockSeeder.run.mockResolvedValue({ api_key: 'api-key-123' }); await command.run(); @@ -306,6 +312,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const expectedResult = { api_key: 'api-key-123' }; mockSeeder.run.mockResolvedValue(expectedResult); @@ -330,6 +337,7 @@ describe('SeedCommand', () => { flags, } as any); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret mockSeeder.run.mockResolvedValue({ api_key: 'api-key-123' }); await command.run(); diff --git a/packages/contentstack-seed/test/seed/contentstack/client.test.ts b/packages/contentstack-seed/test/seed/contentstack/client.test.ts index dfe46a04e..98369c86e 100644 --- a/packages/contentstack-seed/test/seed/contentstack/client.test.ts +++ b/packages/contentstack-seed/test/seed/contentstack/client.test.ts @@ -211,6 +211,7 @@ describe('ContentstackClient', () => { uid: 'stack-123', name: 'Test Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-123', org_uid: 'org-123', }; @@ -223,11 +224,13 @@ describe('ContentstackClient', () => { const result = await contentstackClient.getStack(stackUid); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack).toHaveBeenCalledWith({ api_key: stackUid }); expect(result).toEqual({ uid: 'stack-123', name: 'Test Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-123', org_uid: 'org-123', }); @@ -258,6 +261,7 @@ describe('ContentstackClient', () => { uid: 'stack-1', name: 'Stack 1', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-1', org_uid: orgUid, }, @@ -265,6 +269,7 @@ describe('ContentstackClient', () => { uid: 'stack-2', name: 'Stack 2', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-2', org_uid: orgUid, }, @@ -362,6 +367,7 @@ describe('ContentstackClient', () => { describe('getContentTypeCount', () => { it('should get content type count for a stack', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'api-key-123'; const mockResponse = { count: 5, @@ -383,12 +389,14 @@ describe('ContentstackClient', () => { const result = await contentstackClient.getContentTypeCount(apiKey); + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret expect(mockClient.stack).toHaveBeenCalledWith({ api_key: apiKey }); expect(mockContentTypeInstance.query).toHaveBeenCalledWith({ include_count: true }); expect(result).toBe(5); }); it('should use management token when provided', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'api-key-123'; const managementToken = 'token-123'; const mockResponse = { count: 3 }; @@ -410,12 +418,14 @@ describe('ContentstackClient', () => { await contentstackClient.getContentTypeCount(apiKey, managementToken); expect(mockClient.stack).toHaveBeenCalledWith({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: apiKey, management_token: managementToken, }); }); it('should throw ContentstackError on failure', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'api-key-123'; const mockError = { errorMessage: 'Unauthorized', @@ -453,6 +463,7 @@ describe('ContentstackClient', () => { const mockStack = { uid: 'stack-123', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-123', master_locale: 'en-us', name: 'New Stack', @@ -505,6 +516,7 @@ describe('ContentstackClient', () => { describe('createManagementToken', () => { it('should create management token successfully', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'api-key-123'; const managementToken = 'existing-token'; const options = { @@ -541,6 +553,7 @@ describe('ContentstackClient', () => { ); expect(mockClient.stack).toHaveBeenCalledWith({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: apiKey, management_token: managementToken, }); @@ -556,6 +569,7 @@ describe('ContentstackClient', () => { }); it('should handle error code 401', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'api-key-123'; const managementToken = 'existing-token'; const options = { @@ -590,6 +604,7 @@ describe('ContentstackClient', () => { }); it('should throw ContentstackError on other errors', async () => { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret const apiKey = 'api-key-123'; const managementToken = 'existing-token'; const options = { diff --git a/packages/contentstack-seed/test/seed/interactive.test.ts b/packages/contentstack-seed/test/seed/interactive.test.ts index b58d92fc0..c2f77410c 100644 --- a/packages/contentstack-seed/test/seed/interactive.test.ts +++ b/packages/contentstack-seed/test/seed/interactive.test.ts @@ -262,6 +262,7 @@ describe('Interactive', () => { uid: 'stack-1', name: 'Existing Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-1', org_uid: 'org-1', }, @@ -287,6 +288,7 @@ describe('Interactive', () => { uid: 'stack-1', name: 'Existing Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-1', org_uid: 'org-1', }, @@ -294,6 +296,7 @@ describe('Interactive', () => { uid: 'stack-2', name: 'Another Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-2', org_uid: 'org-1', }, @@ -369,6 +372,7 @@ describe('Interactive', () => { uid: 'stack-3', name: 'Zebra Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-3', org_uid: 'org-1', }, @@ -376,6 +380,7 @@ describe('Interactive', () => { uid: 'stack-1', name: 'Alpha Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-1', org_uid: 'org-1', }, @@ -383,6 +388,7 @@ describe('Interactive', () => { uid: 'stack-2', name: 'Beta Stack', master_locale: 'en-us', + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret api_key: 'api-key-2', org_uid: 'org-1', }, diff --git a/packages/contentstack-variants/package.json b/packages/contentstack-variants/package.json index a33a160c4..5057e7577 100644 --- a/packages/contentstack-variants/package.json +++ b/packages/contentstack-variants/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-variants", - "version": "2.0.0-beta.18", + "version": "2.0.0-beta.19", "description": "Variants plugin", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -27,7 +27,7 @@ "typescript": "^5.8.3" }, "dependencies": { - "@contentstack/cli-utilities": "~2.0.0-beta.10", + "@contentstack/cli-utilities": "~2.0.0-beta.11", "@oclif/core": "^4.11.4", "lodash": "^4.18.1", "mkdirp": "^1.0.4", diff --git a/packages/contentstack-variants/test/unit/export/variant-entries.test.ts b/packages/contentstack-variants/test/unit/export/variant-entries.test.ts index b5eaa6d5f..ab33b6535 100644 --- a/packages/contentstack-variants/test/unit/export/variant-entries.test.ts +++ b/packages/contentstack-variants/test/unit/export/variant-entries.test.ts @@ -35,6 +35,7 @@ describe('Variant Entries Export', () => { it('sets branch header in adapter headers when branchName is configured', () => { const instance = new Export.VariantEntries({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret ...config, apiKey: 'TEST-KEY', branchName: 'feature-branch', org_uid: 'TEST-ORG', project_id: 'TEST-PROJECT', } as ExportConfig); expect(getHeaders(instance).branch).to.equal('feature-branch'); @@ -42,6 +43,7 @@ describe('Variant Entries Export', () => { it('branch header is undefined when branchName is not set', () => { const instance = new Export.VariantEntries({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret ...config, apiKey: 'TEST-KEY', org_uid: 'TEST-ORG', project_id: 'TEST-PROJECT', } as ExportConfig); expect(getHeaders(instance).branch).to.be.undefined; @@ -56,6 +58,7 @@ describe('Variant Entries Export', () => { it('branch header value matches branchName exactly', () => { const instance = new Export.VariantEntries({ + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret ...config, apiKey: 'TEST-KEY', branchName: 'eu-release-2025', org_uid: 'TEST-ORG', project_id: 'TEST-PROJECT', } as ExportConfig); expect(getHeaders(instance).branch).to.equal('eu-release-2025'); diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/experiences-content-types.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/experiences-content-types.json new file mode 100644 index 000000000..91d501724 --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/experiences-content-types.json @@ -0,0 +1,9 @@ +{ + "exp-valid": [ + { "uid": "ct1", "status": "linked" } + ], + "exp-mixed": [ + { "uid": "ct1", "status": "linked" }, + { "uid": "ct2", "status": "linked" } + ] +} diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/experiences.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/experiences.json new file mode 100644 index 000000000..76d090791 --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/experiences.json @@ -0,0 +1,67 @@ +[ + { + "uid": "exp-empty-audiences", + "name": "AB Test No Audiences", + "__type": "AB_TEST", + "status": "DRAFT", + "description": "", + "referredAudiences": [], + "referredEvents": [], + "tags": [], + "variations": [], + "_cms": { "variantGroup": "vg-empty", "variants": {} }, + "latestVersion": "ver-empty-latest" + }, + { + "uid": "exp-lytics-only", + "name": "Experience Lytics Only", + "__type": "SEGMENTED", + "status": "DRAFT", + "description": "", + "referredAudiences": ["lytics-audience-001"], + "referredEvents": [], + "tags": [], + "variations": [], + "_cms": { "variantGroup": "vg-lytics", "variants": { "0": "old-variant-lytics" } }, + "latestVersion": "ver-lytics-latest" + }, + { + "uid": "exp-valid", + "name": "Valid Experience", + "__type": "SEGMENTED", + "status": "ACTIVE", + "description": "", + "referredAudiences": ["contentstack-audience-001"], + "referredEvents": [], + "tags": [], + "variations": [], + "_cms": { "variantGroup": "vg-valid", "variants": { "0": "old-variant-valid" } }, + "latestVersion": "ver-valid-latest" + }, + { + "uid": "exp-mixed", + "name": "Mixed Audiences Experience", + "__type": "SEGMENTED", + "status": "ACTIVE", + "description": "", + "referredAudiences": ["contentstack-audience-001", "lytics-audience-001"], + "referredEvents": [], + "tags": [], + "variations": [], + "_cms": { "variantGroup": "vg-mixed", "variants": { "0": "old-variant-mixed" } }, + "latestVersion": "ver-mixed-latest" + }, + { + "uid": "exp-no-versions-file", + "name": "No Versions File Experience", + "__type": "AB_TEST", + "status": "DRAFT", + "description": "", + "referredAudiences": [], + "referredEvents": [], + "tags": [], + "variations": [], + "_cms": { "variants": {} }, + "latestVersion": "ver-nofile-latest" + } +] diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-active-and-draft.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-active-and-draft.json new file mode 100644 index 000000000..29e25d062 --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-active-and-draft.json @@ -0,0 +1,28 @@ +[ + { + "uid": "ver-active-draft-active", + "experienceUid": "exp-active-and-draft", + "status": "ACTIVE", + "variants": [ + { + "__type": "SegmentedVariant", + "audiences": ["contentstack-audience-001"], + "lyticsAudiences": [] + } + ], + "variantSplit": "EQUALLY_SPLIT" + }, + { + "uid": "ver-active-draft-draft", + "experienceUid": "exp-active-and-draft", + "status": "DRAFT", + "variants": [ + { + "__type": "SegmentedVariant", + "audiences": ["contentstack-audience-001"], + "lyticsAudiences": [] + } + ], + "variantSplit": "EQUALLY_SPLIT" + } +] diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-draft-only.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-draft-only.json new file mode 100644 index 000000000..62a46bcbd --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-draft-only.json @@ -0,0 +1,15 @@ +[ + { + "uid": "ver-draft-only-001", + "experienceUid": "exp-draft-only", + "status": "DRAFT", + "variants": [ + { + "__type": "SegmentedVariant", + "audiences": ["contentstack-audience-001"], + "lyticsAudiences": [] + } + ], + "variantSplit": "EQUALLY_SPLIT" + } +] diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-empty-audiences.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-empty-audiences.json new file mode 100644 index 000000000..bfc14f64e --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-empty-audiences.json @@ -0,0 +1,9 @@ +[ + { + "uid": "ver-empty-001", + "experienceUid": "exp-empty-audiences", + "status": "DRAFT", + "variants": [], + "variantSplit": "EQUALLY_SPLIT" + } +] diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-lytics-only.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-lytics-only.json new file mode 100644 index 000000000..5593b6ac9 --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-lytics-only.json @@ -0,0 +1,15 @@ +[ + { + "uid": "ver-lytics-001", + "experienceUid": "exp-lytics-only", + "status": "ACTIVE", + "variants": [ + { + "__type": "SegmentedVariant", + "audiences": [], + "lyticsAudiences": ["lytics-audience-001"] + } + ], + "variantSplit": "EQUALLY_SPLIT" + } +] diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-mixed.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-mixed.json new file mode 100644 index 000000000..d799f0ab7 --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-mixed.json @@ -0,0 +1,15 @@ +[ + { + "uid": "ver-mixed-001", + "experienceUid": "exp-mixed", + "status": "ACTIVE", + "variants": [ + { + "__type": "SegmentedVariant", + "audiences": ["contentstack-audience-001"], + "lyticsAudiences": ["lytics-audience-001"] + } + ], + "variantSplit": "EQUALLY_SPLIT" + } +] diff --git a/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-valid.json b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-valid.json new file mode 100644 index 000000000..75702c781 --- /dev/null +++ b/packages/contentstack-variants/test/unit/mock/contents/personalize/experiences/versions/exp-valid.json @@ -0,0 +1,15 @@ +[ + { + "uid": "ver-valid-001", + "experienceUid": "exp-valid", + "status": "ACTIVE", + "variants": [ + { + "__type": "SegmentedVariant", + "audiences": ["contentstack-audience-001"], + "lyticsAudiences": [] + } + ], + "variantSplit": "EQUALLY_SPLIT" + } +] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f02c1709..5db55112a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ overrides: lodash: 4.18.1 brace-expansion: 5.0.7 js-yaml: 4.3.0 + fast-uri: 3.1.3 importers: @@ -29,14 +30,14 @@ importers: specifier: ^3.14.1 version: 3.14.1(graphql@16.14.2) '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@20.19.43) + specifier: ~2.0.0-beta.10 + version: 2.0.0-beta.10(@types/node@20.19.43) '@contentstack/cli-launch': specifier: ^1.11.1 version: 1.11.1(@types/node@20.19.43)(tslib@2.8.1)(typescript@5.9.3) '@contentstack/cli-utilities': - specifier: ~2.0.0-beta.10 - version: 2.0.0-beta.10(@types/node@20.19.43) + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) adm-zip: specifier: ^0.5.18 version: 0.5.18 @@ -82,10 +83,10 @@ importers: version: 0.2.6 '@typescript-eslint/eslint-plugin': specifier: ^8.58.2 - version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + version: 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.58.2 - version: 8.63.0(eslint@10.7.0)(typescript@5.9.3) + version: 8.64.0(eslint@10.7.0)(typescript@5.9.3) axios: specifier: ^1.16.1 version: 1.18.1(debug@4.4.3) @@ -100,7 +101,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.157 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -129,8 +130,8 @@ importers: packages/contentstack-asset-management: dependencies: '@contentstack/cli-utilities': - specifier: ~2.0.0-beta.10 - version: 2.0.0-beta.10(@types/node@20.19.43) + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) lodash: specifier: 4.18.1 version: 4.18.1 @@ -158,7 +159,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.68 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -184,11 +185,11 @@ importers: packages/contentstack-audit: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@20.19.43) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@20.19.43) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -231,7 +232,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -260,17 +261,17 @@ importers: packages/contentstack-bootstrap: dependencies: '@contentstack/cli-cm-seed': - specifier: ~2.0.0-beta.23 + specifier: ~2.0.0-beta.24 version: link:../contentstack-seed '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@18.19.130) - '@contentstack/cli-config': - specifier: ~2.0.0-beta.12 - version: 2.0.0-beta.13(@types/node@18.19.130) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-config': + specifier: ~2.0.0-beta.14 + version: 2.0.0-beta.14(@types/node@18.19.130) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@18.19.130) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -327,11 +328,11 @@ importers: packages/contentstack-branches: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@22.20.1) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -359,7 +360,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.176(eslint@10.7.0)(typescript@4.9.5) + version: 6.0.177(eslint@10.7.0)(typescript@4.9.5) mocha: specifier: 10.8.2 version: 10.8.2 @@ -382,17 +383,17 @@ importers: packages/contentstack-bulk-operations: dependencies: '@contentstack/cli-asset-management': - specifier: 1.0.0-beta.6 + specifier: 1.0.0-beta.7 version: link:../contentstack-asset-management '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@20.19.43) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@20.19.43) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) '@contentstack/delivery-sdk': specifier: ^5.2.0 - version: 5.2.2 + version: 5.4.0 '@contentstack/management': specifier: ^1.30.2 version: 1.30.4(debug@4.4.3) @@ -423,10 +424,10 @@ importers: version: 21.0.1 '@typescript-eslint/eslint-plugin': specifier: ^8.59.2 - version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3) + version: 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3) '@typescript-eslint/parser': specifier: ^8.59.2 - version: 8.63.0(eslint@10.7.0)(typescript@6.0.3) + version: 8.64.0(eslint@10.7.0)(typescript@6.0.3) chai: specifier: ^6.2.2 version: 6.2.2 @@ -441,7 +442,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.162 - version: 6.0.176(eslint@10.7.0)(typescript@6.0.3) + version: 6.0.177(eslint@10.7.0)(typescript@6.0.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@6.0.3) @@ -456,7 +457,7 @@ importers: version: 9.1.7 lint-staged: specifier: ^17.0.2 - version: 17.0.8 + version: 17.1.0 mocha: specifier: ^11.7.5 version: 11.7.6 @@ -488,11 +489,11 @@ importers: packages/contentstack-cli-cm-regex-validate: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@18.19.130) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@18.19.130) '@contentstack/management': specifier: ^1.30.2 version: 1.30.4(debug@4.4.3) @@ -547,7 +548,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -579,11 +580,11 @@ importers: packages/contentstack-cli-tsgen: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@22.20.1) '@contentstack/types-generator': specifier: ^3.10.2 version: 3.10.2(graphql@16.14.2) @@ -602,10 +603,10 @@ importers: version: 22.20.1 '@typescript-eslint/eslint-plugin': specifier: ^8.59.3 - version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + version: 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.59.3 - version: 8.63.0(eslint@10.7.0)(typescript@5.9.3) + version: 8.64.0(eslint@10.7.0)(typescript@5.9.3) dotenv: specifier: ^16.6.1 version: 16.6.1 @@ -614,7 +615,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.165 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -637,17 +638,17 @@ importers: specifier: ^1.6.0 version: 1.6.0 '@contentstack/cli-cm-export': - specifier: ~2.0.0-beta.23 + specifier: ~2.0.0-beta.24 version: link:../contentstack-export '@contentstack/cli-cm-import': - specifier: ~2.0.0-beta.23 + specifier: ~2.0.0-beta.24 version: link:../contentstack-import '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@18.19.130) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@18.19.130) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -690,7 +691,7 @@ importers: version: 21.0.1 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + version: 5.62.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) chai: specifier: ^4.5.0 version: 4.5.0 @@ -699,7 +700,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -722,11 +723,11 @@ importers: packages/contentstack-content-type: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@22.20.1) '@types/diff2html': specifier: ^3.0.3 version: 3.0.3 @@ -787,7 +788,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.162 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -810,16 +811,16 @@ importers: packages/contentstack-export: dependencies: '@contentstack/cli-asset-management': - specifier: ~1.0.0-beta.6 + specifier: ~1.0.0-beta.7 version: link:../contentstack-asset-management '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@22.20.1) '@contentstack/cli-variants': - specifier: ~2.0.0-beta.18 + specifier: ~2.0.0-beta.19 version: link:../contentstack-variants '@oclif/core': specifier: ^4.11.4 @@ -856,11 +857,11 @@ importers: version: 3.19.0 devDependencies: '@contentstack/cli-auth': - specifier: ~2.0.0-beta.14 - version: 2.0.0-beta.15(@types/node@22.20.1) + specifier: ~2.0.0-beta.16 + version: 2.0.0-beta.16(@types/node@22.20.1) '@contentstack/cli-config': - specifier: ~2.0.0-beta.12 - version: 2.0.0-beta.13(@types/node@22.20.1) + specifier: ~2.0.0-beta.14 + version: 2.0.0-beta.14(@types/node@22.20.1) '@contentstack/cli-dev-dependencies': specifier: ~2.0.0-beta.0 version: 2.0.0-beta.0 @@ -925,11 +926,11 @@ importers: packages/contentstack-export-to-csv: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@20.19.43) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@20.19.43) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) '@inquirer/prompts': specifier: ^7.0.0 version: 7.10.1(@types/node@20.19.43) @@ -963,7 +964,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -989,11 +990,11 @@ importers: packages/contentstack-external-migrate: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@20.19.43) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@20.19.43) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) '@contentstack/json-rte-serializer': specifier: ~2.1.0 version: 2.1.0 @@ -1060,24 +1061,24 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.9 - version: 4.1.10(@types/node@20.19.43)(jsdom@23.2.0)(vite@8.1.4(@types/node@20.19.43)(yaml@2.9.0)) + version: 4.1.10(@types/node@20.19.43)(jsdom@23.2.0)(vite@8.1.5(@types/node@20.19.43)(yaml@2.9.0)) packages/contentstack-import: dependencies: '@contentstack/cli-asset-management': - specifier: ~1.0.0-beta.6 + specifier: ~1.0.0-beta.7 version: link:../contentstack-asset-management '@contentstack/cli-audit': - specifier: ~2.0.0-beta.14 + specifier: ~2.0.0-beta.15 version: link:../contentstack-audit '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@14.18.63)(debug@4.4.3) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@14.18.63)(debug@4.4.3) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@14.18.63)(debug@4.4.3) '@contentstack/cli-variants': - specifier: ~2.0.0-beta.18 + specifier: ~2.0.0-beta.19 version: link:../contentstack-variants '@oclif/core': specifier: ^4.11.4 @@ -1139,13 +1140,13 @@ importers: version: 14.18.63 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5) eslint: specifier: ^10.5.0 version: 10.7.0 eslint-config-oclif: specifier: ^6.0.89 - version: 6.0.176(eslint@10.7.0)(typescript@4.9.5) + version: 6.0.177(eslint@10.7.0)(typescript@4.9.5) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -1165,14 +1166,14 @@ importers: packages/contentstack-import-setup: dependencies: '@contentstack/cli-asset-management': - specifier: ~1.0.0-beta.6 + specifier: ~1.0.0-beta.7 version: link:../contentstack-asset-management '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@14.18.63) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 - version: 2.0.0-beta.10(@types/node@14.18.63)(debug@4.4.3) + version: 2.0.0-beta.10(@types/node@14.18.63) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -1230,7 +1231,7 @@ importers: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + version: 5.62.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) chai: specifier: ^4.5.0 version: 4.5.0 @@ -1262,11 +1263,11 @@ importers: packages/contentstack-migrate-rte: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@22.20.1) '@contentstack/json-rte-serializer': specifier: ~2.1.0 version: 2.1.0 @@ -1306,7 +1307,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.164 - version: 6.0.176(eslint@10.7.0)(typescript@6.0.3) + version: 6.0.177(eslint@10.7.0)(typescript@6.0.3) husky: specifier: ^9.1.7 version: 9.1.7 @@ -1332,11 +1333,11 @@ importers: packages/contentstack-migration: dependencies: '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@14.18.63) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 - version: 2.0.0-beta.10(@types/node@14.18.63)(debug@4.4.3) + version: 2.0.0-beta.10(@types/node@14.18.63) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -1382,7 +1383,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.176(eslint@10.7.0)(typescript@4.9.5) + version: 6.0.177(eslint@10.7.0)(typescript@4.9.5) jsdoc-to-markdown: specifier: ^8.0.3 version: 8.0.3 @@ -1414,17 +1415,17 @@ importers: packages/contentstack-query-export: dependencies: '@contentstack/cli-asset-management': - specifier: ~1.0.0-beta.6 + specifier: ~1.0.0-beta.7 version: link:../contentstack-asset-management '@contentstack/cli-cm-export': - specifier: ~2.0.0-beta.23 + specifier: ~2.0.0-beta.24 version: link:../contentstack-export '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@20.19.43) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@20.19.43) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -1503,7 +1504,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.157 - version: 6.0.176(eslint@10.7.0)(typescript@4.9.5) + version: 6.0.177(eslint@10.7.0)(typescript@4.9.5) husky: specifier: ^9.1.7 version: 9.1.7 @@ -1529,14 +1530,14 @@ importers: packages/contentstack-seed: dependencies: '@contentstack/cli-cm-import': - specifier: ~2.0.0-beta.23 + specifier: ~2.0.0-beta.24 version: link:../contentstack-import '@contentstack/cli-command': - specifier: ~2.0.0-beta.9 - version: 2.0.0-beta.9(@types/node@18.19.130) - '@contentstack/cli-utilities': specifier: ~2.0.0-beta.10 version: 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-utilities': + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@18.19.130) inquirer: specifier: 12.11.1 version: 12.11.1(@types/node@18.19.130) @@ -1554,7 +1555,7 @@ importers: specifier: ^6.2.49 version: 6.2.53 '@types/inquirer': - specifier: ^9.0.9 + specifier: ^9.0.10 version: 9.0.10 '@types/jest': specifier: ^26.0.24 @@ -1576,7 +1577,7 @@ importers: version: 10.7.0 eslint-config-oclif: specifier: ^6.0.137 - version: 6.0.176(eslint@10.7.0)(typescript@5.9.3) + version: 6.0.177(eslint@10.7.0)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@10.7.0)(typescript@5.9.3) @@ -1599,8 +1600,8 @@ importers: packages/contentstack-variants: dependencies: '@contentstack/cli-utilities': - specifier: ~2.0.0-beta.10 - version: 2.0.0-beta.10(@types/node@20.19.43) + specifier: ~2.0.0-beta.11 + version: 2.0.0-beta.11(@types/node@20.19.43) '@oclif/core': specifier: ^4.11.4 version: 4.11.14 @@ -1662,76 +1663,76 @@ packages: '@asamuzakjp/dom-selector@2.0.2': resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} - '@aws-sdk/checksums@3.1000.16': - resolution: {integrity: sha512-EKnvkXSmz3IpA99tCNuI+dLFXyZyClSm8zns9sB/elvkU+MTuomAs6toJMPMBf98/fICG/urXDkzGz0/c3yyAQ==} + '@aws-sdk/checksums@3.1000.18': + resolution: {integrity: sha512-IImkbEyXdV6/uaF5r6Wkk+8718mQw1ll83j0a4a30R3JM/rHVFdWAiT4jtJpFjJiIwM/oJ6SxIxr0z2TaQUGqw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-cloudfront@3.1085.0': - resolution: {integrity: sha512-fIGLTXHGFFrlhACzwKjPI/fCPzugTyblU1LV7B0n0BK/1+4udVMdE1OofEbKNlKuy8f1CyeOUaIRmEjcS3bTaA==} + '@aws-sdk/client-cloudfront@3.1090.0': + resolution: {integrity: sha512-dNo7RTDHKKKRT/d9O7jUtZR0d6Dz9LlMOu27eJ/B8ADZMDxDx3UbrihqI2y97CaqGhj6foIFfi4n7yu+hiOHrA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1085.0': - resolution: {integrity: sha512-O0xe8sR50AYkwxlvRRsV0qytEO2dtXQTQ1CF3YBBdE5xtVkbu27H0vGa1mjQi1/+fbYM80AWEIPai5jZmXyubw==} + '@aws-sdk/client-s3@3.1090.0': + resolution: {integrity: sha512-R6GX9cd1jljwzZ8xFmgAI/hHCuX1MobIKBdsymv7WL9SENvO9Vgz9KOR6avTnu0Ao+w1LmxnTe+jqmZXEn7Q/Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.975.1': - resolution: {integrity: sha512-8qh/6EYb7hl/ZwVfQufhbMEZs1gQIc7GbdrIf4eprQJ7cv042+74nE6l3YDfyWNzb9iPXb8fRyYSHkNIk5eE6Q==} + '@aws-sdk/core@3.975.3': + resolution: {integrity: sha512-7ur3kCKuvPLqlsZ2XlvnNBVQ7KkpSu6Y6dOTwSPHLrFpTEfZM8isLBJc4cgv96WB7GifeVM436mpycwxBd2vEA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.57': - resolution: {integrity: sha512-1RfJaF7SW1TOnvNGU7kaYjwUf5H3sfm+synGH1bHhRlqcnxCt3szebH3dmKEyY4tuGcbQ6ffzUT89cRitBV8OQ==} + '@aws-sdk/credential-provider-env@3.972.59': + resolution: {integrity: sha512-Ny5e4Mfh3QPmiAc0AiUe+cbTXDlxkU3Rc+EpWOfyWeWEy6yp7Fa1KmfNeCc+1a8by9zQ9gtohmiQUkMPScF3ng==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.59': - resolution: {integrity: sha512-sRCkpTiFnCdQvuaRVjQ6SVoHu6i7RUpurVo1c4F81HWhPvUJ7Wdp5MNtSdX1O29CNXc8em3O5m52hCjVtAD9SA==} + '@aws-sdk/credential-provider-http@3.972.61': + resolution: {integrity: sha512-8jAjgStl5Ytq4+HF3X/9f+EmRinaRbGRRtQGktlPfBRVx73H+R1y48vIeXerQtYGFaUqkEp3fT6jP854rVO2yQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.973.1': - resolution: {integrity: sha512-6d8H6ZAh3ZPKZ6fe1nG2OWeZEZPtt9ravoD1dezPdPtsSkJRoxGAnFSHwKT3E/Te6fHE30zRzjV6TD12rvF6yQ==} + '@aws-sdk/credential-provider-ini@3.973.4': + resolution: {integrity: sha512-e6ZvVsj90aRALf1kHP+J4iqC1496ZpVgqI/+u0LJ5HL7q7ATauGy4gdDvRCP13L1pN/fMiZLah162PGIYkbUVQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.63': - resolution: {integrity: sha512-GREWRrMj0XnNKMaVa/Mauoaui26qBEHu71WWqXbwZOu/jFQOnPZjTf7u0KtGKC8VGa6VUs9kDWGgocrKNLS9vw==} + '@aws-sdk/credential-provider-login@3.972.66': + resolution: {integrity: sha512-g2fsqm87r/nKthLZ0VkkDBElkGg0PvSa8d97HQ6EilMbJTZ6hxa8FxkSZyJfgPfFdZn0TTmkOffQmTSUcAHIng==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.66': - resolution: {integrity: sha512-f+qjRXZpz7sgzbc4QB+6nLKfyKFgRRXzWdXbsKPv/VhVRyHsDyq4yBWC/B75BAJpFIcUeI2XR/3gdWJ677zB4A==} + '@aws-sdk/credential-provider-node@3.972.70': + resolution: {integrity: sha512-3xzvkGdykBunxqh8WudmUpSyLWvIhfI6aBQo1b5rb3mDO5mNLadK+0hiI0qBQBMVynJbfLO+Ajy9dztMwy9O8w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.57': - resolution: {integrity: sha512-TiVQhuU0pbhIZAUZacbPHMyzrIdiH+lnx+PMY/Pu/b93dJrq3wdZwzUJ0TPpvNxaqbHsxJvQZW3/h/beLiKq7Q==} + '@aws-sdk/credential-provider-process@3.972.59': + resolution: {integrity: sha512-DlZF2/MhLlatDdlrIy3CUCpfdbLrKx+3SMjVo+WyHnPpwzkc/M3vwAHw4OVJf7DMvO+4vfRqSCMc/E9I1auN0g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.973.1': - resolution: {integrity: sha512-3foTZUJ4821Ij60X7K3NJroygiZLnbBmarN+T//O2cjkISan90zElN3NBmgSlDrTQ7Gs6z/yO8V7h60QNcDZHQ==} + '@aws-sdk/credential-provider-sso@3.973.3': + resolution: {integrity: sha512-hmdDHoy2G5Es2e8IgelNMYUuSQI6uCIAKZMJ2u2PdKDhxvbk1uWD/g4+R7R5c/tJfKEB1+KjjWiaoCr/S+ZTiQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.63': - resolution: {integrity: sha512-8qZLFhM69eKcS37m459ctPR05Qimycm/74OPVioe6wNZabMT54GYhwBju0+J656RkMasNSawWQu+c8CmBe3TUQ==} + '@aws-sdk/credential-provider-web-identity@3.972.65': + resolution: {integrity: sha512-gHQb/Kt0chjk/JQDa/GJDqmAvEuVn8n7z10wK2h0LFM9TUDRkohgOO4aEF+s2sBLM0br7Cl5W6P7phgjrrJvLQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.62': - resolution: {integrity: sha512-k8JJwYXVYlOOjWnPZDThQS1xDFJgi5Dokt73qFlDtrZAbdcint5aIdjB9XgJAAQVP5OoqcefQmh1FYXiPpvsvw==} + '@aws-sdk/middleware-sdk-s3@3.972.64': + resolution: {integrity: sha512-RBi43anhDBUv+HCfxCOXwGOE7GmT4n7ChV04Mwr22RhXTNcamW/iWnJlOotDPCZSrJ4dEvhZSiWWQMwLX+ZhFA==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.31': - resolution: {integrity: sha512-BDHTpwcsZHEBNEJzOg/B1BkFYJxAXY50dau/NyVWs3d51F0WgIUGSWZot/Os+N3KpDhXeaXnz37mWffAvduREw==} + '@aws-sdk/nested-clients@3.997.33': + resolution: {integrity: sha512-dVZOroI/r3/ENvqNGgjMPul+jjlz9GddfVusgTXlVjfZj5isibOxecLkGQbRPp8XOuX+RAfjXLFgPkD1JS5xrw==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.39': - resolution: {integrity: sha512-8+srXqYIF8KYMLC4FxMLEM5Ek7kUNibJu1R4m8/fUhhNYIZZz26oGtKkCr8I/HiG2fFQxBvaGgQZT4/mqRCSnA==} + '@aws-sdk/signature-v4-multi-region@3.996.41': + resolution: {integrity: sha512-QMUytg+FQMGouc8gHS00KoYih3+N6cqmVI/pQGOIo7Nr7OpQaiXjSYOuL+vsPZ1tymY4LAQ8MYcHJmws5LRxng==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1083.0': - resolution: {integrity: sha512-s0woKnxuHrExLc5L2ArIH5BMkbonHPtt+5hSBM8oknp9M6QTuUmmAmJ2E0EdzCGONrO+8+ADPqvv6UX0nNcc7A==} + '@aws-sdk/token-providers@3.1088.0': + resolution: {integrity: sha512-4ObatWt2qpJg5FBk4LOOKrTQYzaqeewAtdO3r9ZO8lH9YqLtpTzLyIdy0mJ+nVdfYOnqISkKNfmzP22bNDhwyw==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.974.0': - resolution: {integrity: sha512-QIBrw90CDm4O0UaIIzkU6DrFdeJzEb2Va5EPEVpyldj6sHJxB6cshhStJuhZxk3wR3PmjJlYsjPmY1kNb+KGBg==} + '@aws-sdk/types@3.974.2': + resolution: {integrity: sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==} engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.34': - resolution: {integrity: sha512-wHhWL1y7sN3enBA8POrPpQM5jCcmu2ozyhbRei4c8OjVcEaEs6yLucLa/pla457ggS/ysuy7bosagz3HaJkZXA==} + '@aws-sdk/xml-builder@3.972.36': + resolution: {integrity: sha512-RdGmS1GLrtaTOLE1ElSluMldNrpk9Emq6uYs8SS8iHlu5xTAmM9rRkM91o48+rIRryBtyO9t+uLYCoMG6jVMVA==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.3.0': @@ -2331,20 +2332,20 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} - '@contentstack/cli-auth@2.0.0-beta.15': - resolution: {integrity: sha512-rbfaUlpb8MABVuaPyK7MMNxNAx9ZRCJHYYydGJRo+i6352GOTympIexViy9VOMcsy1GTAv0QKfmBdnbIDTZjuA==} + '@contentstack/cli-auth@2.0.0-beta.16': + resolution: {integrity: sha512-N5Hk1fTQmxXnGIYJdKLXzi/0HPrKvvySrzNQM60bIoo40F8Tp6InRW9m33jcC30+J7jpDKcWw+calQbdYV48Pg==} engines: {node: '>=22.0.0'} '@contentstack/cli-command@1.8.4': resolution: {integrity: sha512-xo6d+KrwqGZakUKz6Uw9I3CsW6HC+NqwsMd5kc9IN5j/UhzLZujLAj6fotQY+cyJYG/Dz9D+tSIaL8ZAMRTkLg==} engines: {node: '>=22.0.0'} - '@contentstack/cli-command@2.0.0-beta.9': - resolution: {integrity: sha512-7hcHEpj6NL9KS5fuhWqC0U3vMHXOeTVJoZiIatJwpqY29Ov4SP620Pe5dcXZKBjuETiPNusBv2L9sVQ4UrLxoQ==} + '@contentstack/cli-command@2.0.0-beta.10': + resolution: {integrity: sha512-r5MMHBkOOtr3VGqHZX3+MF7a0fgwIJ1NgWX73C3tTm2YbFiN19/i1Uq3GSKsKLe7GkrNHnsXpWZxaZ19prgOkg==} engines: {node: '>=22.0.0'} - '@contentstack/cli-config@2.0.0-beta.13': - resolution: {integrity: sha512-/l7iCbUJnpAaof/7tPgHweqv7p/3uCw7AsaPqvS7StbiwEy2Q0RmH0Rw7bhDxcFv+5RjZtMIpPC2UOSrfViUKQ==} + '@contentstack/cli-config@2.0.0-beta.14': + resolution: {integrity: sha512-eQ0bQSwEV3wBzoes/03GMXHUdUhREoipQGoaHpzG64Xd/mCLVmkr1Ba6ph3y0/bsdz8QBE+wSZrjLK8CuW3VwA==} engines: {node: '>=22.0.0'} '@contentstack/cli-dev-dependencies@1.3.1': @@ -2361,14 +2362,14 @@ packages: '@contentstack/cli-utilities@1.18.5': resolution: {integrity: sha512-0qRZznIiU8jqYl7BTs84w9Ke2fVGRDCY22PSUg0DABR1nzrnTVwTTne/gjhuQUoQjMU7GG4rvAScY0SU/0mHAg==} - '@contentstack/cli-utilities@2.0.0-beta.10': - resolution: {integrity: sha512-u2fhvYR+P5AateT4+AaUHsdEDxeP/eJZUQvfA0xHZhrwOqN/WVkkXDu96j/g7U0hqdMKRHtXzrYpmdfjEeMtMA==} + '@contentstack/cli-utilities@2.0.0-beta.11': + resolution: {integrity: sha512-ZR8M47zFESQdi4uToHvgCJw8+I1MkLBC7TuEfrUqWA/vglr/RnGRoVg8pSJNfwYQKcRvLk3cZ6Z/h44QLhDelA==} '@contentstack/core@1.4.1': resolution: {integrity: sha512-QfLa8WUwquWSwvF8EltLyzQTkeNE2I9b9PBkPe21w0d5PnHOagxFzDNCYN4VO/zuJ52sNtKLFIFUcvLsOPk9ww==} - '@contentstack/delivery-sdk@5.2.2': - resolution: {integrity: sha512-hSRYbeWAIq46nkg94LH10jFTmUUJOQF18fw6BTvhfFbK0q98m6QYTLY8BswpQYuhqcH6HNu3wGam+SKzGwSGkg==} + '@contentstack/delivery-sdk@5.4.0': + resolution: {integrity: sha512-TqU2TMBGcpmxry/w00m1uL7gYENCxZHIR8GD0hwfl+d+bZbCrI9/AIz+verdjf4piJ9xGexN0N7ZHSOaTHq5Qg==} engines: {node: '>=18'} '@contentstack/json-rte-serializer@2.1.0': @@ -3338,8 +3339,8 @@ packages: resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} engines: {node: '>=18'} - '@sinclair/typebox@0.27.10': - resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} '@sinclair/typebox@0.34.52': resolution: {integrity: sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==} @@ -3372,24 +3373,24 @@ packages: Deprecated: no longer maintained and no longer used by Sinon packages. See https://github.com/sinonjs/nise/issues/243 for replacement details. - '@smithy/core@3.29.3': - resolution: {integrity: sha512-L+Ys6ecjk5vwPMAKHBpPKlJ3DkqwNcnfEISXBZIsVvWG/XKXfsAP8mwIYlTeLcd2ElHdesPI8OuOmJSFAPhm6A==} + '@smithy/core@3.29.5': + resolution: {integrity: sha512-i0dk2t5B+CwV/dcJdUHILYkOQF5lof8f44dFCfDWToGCxjT9YQ+CgHqTAvJxzc3+zqQwm2QtVoJ5IqiNar/CnQ==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.4.8': - resolution: {integrity: sha512-q9J7JTiXrAhB8sDp4px97uEPT7CwKH61Co78grdNQvU8QZAdiuaSRhP0tUVf2ogy36RZTrlMU1rBmDEH+cnkiA==} + '@smithy/credential-provider-imds@4.4.10': + resolution: {integrity: sha512-MJenAe4OKRZUo1LdYYFDCsSHxaHvInIU/z52GsheO9vl1/VSySVCr0zkyKD6TFiGkSUaWGxvKZ/70OvgUZR5HQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.6.5': - resolution: {integrity: sha512-SuqeisTyPoiIPtIYru/sGxGyXzmZ+8nnFOhC+qRPglt06Ebd1yH//CDltZB2J/3WBNVhwfUaZ0EtHB3cm2X32g==} + '@smithy/fetch-http-handler@5.6.7': + resolution: {integrity: sha512-3zpg8yqqyXzoK2TsRDdkqVOj2RDBFfLXwCczOZ5c7TWB4eiaebfSCsbMjDPYB3PJ9ihV62QaeadZ+wLadZtNGA==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.9.5': - resolution: {integrity: sha512-bNqdxTQTxmLbomSmlkZFz8L6B/feQ2HHzw4L2zY7Ecp2XffYAZq2uzdWDdxJHJFbEvqd+SRuluJso0P8+xPdbw==} + '@smithy/node-http-handler@4.9.7': + resolution: {integrity: sha512-wCU8HCLjAtAVqxxe0j2xff9LcEPw3yjBbg5IdQDIYFnxnPxbxcSLc7rgex7kqm9L/WYOnJEgaWQlfDkZleozMA==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.6.4': - resolution: {integrity: sha512-B89bpf2t/y/wia6LZ+4JfHXYQT9PnVftsH05rgJKKIStS7r/4XSs9HOjtPoLtgcA6HCW9jVqX5DBbq7E0PAkiQ==} + '@smithy/signature-v4@5.6.6': + resolution: {integrity: sha512-efP6DN3UTFrzIsGO42/xcabv8jU7+9nwEdphFUH7yL0k010ERyAWaO41KFQIDLcFZLZ8xzIQr4wplFxNzslSGQ==} engines: {node: '>=18.0.0'} '@smithy/types@4.16.1': @@ -3692,11 +3693,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.63.0': - resolution: {integrity: sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==} + '@typescript-eslint/eslint-plugin@8.64.0': + resolution: {integrity: sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.63.0 + '@typescript-eslint/parser': ^8.64.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' @@ -3710,15 +3711,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.63.0': - resolution: {integrity: sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==} + '@typescript-eslint/parser@8.64.0': + resolution: {integrity: sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.63.0': - resolution: {integrity: sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==} + '@typescript-eslint/project-service@8.64.0': + resolution: {integrity: sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -3735,12 +3736,12 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.63.0': - resolution: {integrity: sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==} + '@typescript-eslint/scope-manager@8.64.0': + resolution: {integrity: sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.63.0': - resolution: {integrity: sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==} + '@typescript-eslint/tsconfig-utils@8.64.0': + resolution: {integrity: sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -3765,8 +3766,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.63.0': - resolution: {integrity: sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==} + '@typescript-eslint/type-utils@8.64.0': + resolution: {integrity: sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3784,8 +3785,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.63.0': - resolution: {integrity: sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==} + '@typescript-eslint/types@8.64.0': + resolution: {integrity: sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -3815,8 +3816,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.63.0': - resolution: {integrity: sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==} + '@typescript-eslint/typescript-estree@8.64.0': + resolution: {integrity: sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -3839,8 +3840,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.63.0': - resolution: {integrity: sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==} + '@typescript-eslint/utils@8.64.0': + resolution: {integrity: sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3858,8 +3859,8 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.63.0': - resolution: {integrity: sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==} + '@typescript-eslint/visitor-keys@8.64.0': + resolution: {integrity: sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.3': @@ -4094,10 +4095,6 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} - ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} @@ -4482,8 +4479,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001805: - resolution: {integrity: sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -4582,10 +4579,6 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - cli-progress@3.12.0: resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} engines: {node: '>=4'} @@ -4606,10 +4599,6 @@ packages: resolution: {integrity: sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==} engines: {node: '>=0.10.0'} - cli-truncate@5.2.0: - resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} - engines: {node: '>=20'} - cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} @@ -5116,8 +5105,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.389: - resolution: {integrity: sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==} + electron-to-chromium@1.5.393: + resolution: {integrity: sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==} elegant-spinner@1.0.1: resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} @@ -5127,9 +5116,6 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5146,8 +5132,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.24.2: - resolution: {integrity: sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==} + enhanced-resolve@5.24.3: + resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -5162,10 +5148,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -5240,8 +5222,8 @@ packages: engines: {node: '>=18.0.0'} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - eslint-config-oclif@6.0.176: - resolution: {integrity: sha512-lAwpOj/Y58WEGXC6wmIyRmT39rrSFQk/rHOlQOjnIeXWgI5Mx250n4MbLO8Ygc82ViXjgjvkaVVf76xH+W0cGw==} + eslint-config-oclif@6.0.177: + resolution: {integrity: sha512-DjeVJCF7Z/aiEwGUyqCaO0DZp9HrZJPdDts2KW2kELPsHihBpVMRgzl7rVj8ao0S4if9qpLoIZ5g18wUNNIjAg==} engines: {node: '>=18.18.0'} eslint-config-prettier@10.1.8: @@ -5500,9 +5482,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} @@ -5772,10 +5751,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} - engines: {node: '>=18'} - get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -6212,10 +6187,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} - is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -6805,74 +6776,74 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} lilconfig@3.1.3: @@ -6885,8 +6856,8 @@ packages: linkify-it@5.0.2: resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} - lint-staged@17.0.8: - resolution: {integrity: sha512-B2P/d+jVW0UXOQ0MVMLrB/9ydA1P+zz6jYfdrbbEd9ur3S2rcbduFWKiUCC02Sm5hbC8nrm7y24WuYMG54HfxA==} + lint-staged@17.1.0: + resolution: {integrity: sha512-d7UQRu/9ZPgfu4+hu/k0wny5GEaIxo+2jb2LJqQDkE7cHRTm1HGqNUDq5UOwsGPpjpaNAFmgAsYo3TR+i9cSJw==} engines: {node: '>=22.22.1'} hasBin: true @@ -6904,10 +6875,6 @@ packages: resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} engines: {node: '>=4'} - listr2@10.2.2: - resolution: {integrity: sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==} - engines: {node: '>=22.13.0'} - listr@0.14.3: resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} engines: {node: '>=6'} @@ -7007,10 +6974,6 @@ packages: resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} engines: {node: '>=4'} - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - logform@2.7.0: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} @@ -7142,10 +7105,6 @@ packages: resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} engines: {node: '>=8'} - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -7403,8 +7362,8 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obug@2.1.3: - resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} oclif@4.23.27: @@ -7434,10 +7393,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -7638,8 +7593,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.18: - resolution: {integrity: sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==} + postcss@8.5.20: + resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -8000,10 +7955,6 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -8019,9 +7970,6 @@ packages: rewire@9.0.1: resolution: {integrity: sha512-dnbLeTwHpXvWJjswC6CshXUUnnpE5AVhlayVRvDJhJx5ejbO4nbj1IXqN2urErgB7TpHUAMpf6iPDhQIxeSQOQ==} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -8252,14 +8200,6 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - - slice-ansi@8.0.0: - resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} - engines: {node: '>=20'} - smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} @@ -8384,14 +8324,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string-width@8.2.2: - resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} - engines: {node: '>=20'} - string.prototype.trim@1.2.11: resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} @@ -8763,8 +8695,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.63.0: - resolution: {integrity: sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==} + typescript-eslint@8.64.0: + resolution: {integrity: sha512-0qg+pDNMnqYzqH9AnNK+39tejHvsShUOUUoRUgtnTGE7QuMZhiFDnozq8nHJVq+Wae6NMLKNWLg5WmkcC/ndyQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -8913,8 +8845,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@8.1.4: - resolution: {integrity: sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==} + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -9113,10 +9045,6 @@ packages: workerpool@9.3.4: resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - wrap-ansi@10.0.0: - resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} - engines: {node: '>=20'} - wrap-ansi@3.0.1: resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} engines: {node: '>=4'} @@ -9133,10 +9061,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -9151,8 +9075,8 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.1: + resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9281,176 +9205,176 @@ snapshots: css-tree: 2.3.1 is-potential-custom-element-name: 1.0.1 - '@aws-sdk/checksums@3.1000.16': + '@aws-sdk/checksums@3.1000.18': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/client-cloudfront@3.1085.0': + '@aws-sdk/client-cloudfront@3.1090.0': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/credential-provider-node': 3.972.66 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 - '@smithy/fetch-http-handler': 5.6.5 - '@smithy/node-http-handler': 4.9.5 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/credential-provider-node': 3.972.70 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 + '@smithy/fetch-http-handler': 5.6.7 + '@smithy/node-http-handler': 4.9.7 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1085.0': - dependencies: - '@aws-sdk/checksums': 3.1000.16 - '@aws-sdk/core': 3.975.1 - '@aws-sdk/credential-provider-node': 3.972.66 - '@aws-sdk/middleware-sdk-s3': 3.972.62 - '@aws-sdk/signature-v4-multi-region': 3.996.39 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 - '@smithy/fetch-http-handler': 5.6.5 - '@smithy/node-http-handler': 4.9.5 + '@aws-sdk/client-s3@3.1090.0': + dependencies: + '@aws-sdk/checksums': 3.1000.18 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/credential-provider-node': 3.972.70 + '@aws-sdk/middleware-sdk-s3': 3.972.64 + '@aws-sdk/signature-v4-multi-region': 3.996.41 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 + '@smithy/fetch-http-handler': 5.6.7 + '@smithy/node-http-handler': 4.9.7 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/core@3.975.1': + '@aws-sdk/core@3.975.3': dependencies: - '@aws-sdk/types': 3.974.0 - '@aws-sdk/xml-builder': 3.972.34 + '@aws-sdk/types': 3.974.2 + '@aws-sdk/xml-builder': 3.972.36 '@aws/lambda-invoke-store': 0.3.0 - '@smithy/core': 3.29.3 - '@smithy/signature-v4': 5.6.4 + '@smithy/core': 3.29.5 + '@smithy/signature-v4': 5.6.6 '@smithy/types': 4.16.1 bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.57': + '@aws-sdk/credential-provider-env@3.972.59': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.59': + '@aws-sdk/credential-provider-http@3.972.61': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 - '@smithy/fetch-http-handler': 5.6.5 - '@smithy/node-http-handler': 4.9.5 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 + '@smithy/fetch-http-handler': 5.6.7 + '@smithy/node-http-handler': 4.9.7 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.973.1': - dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/credential-provider-env': 3.972.57 - '@aws-sdk/credential-provider-http': 3.972.59 - '@aws-sdk/credential-provider-login': 3.972.63 - '@aws-sdk/credential-provider-process': 3.972.57 - '@aws-sdk/credential-provider-sso': 3.973.1 - '@aws-sdk/credential-provider-web-identity': 3.972.63 - '@aws-sdk/nested-clients': 3.997.31 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 - '@smithy/credential-provider-imds': 4.4.8 + '@aws-sdk/credential-provider-ini@3.973.4': + dependencies: + '@aws-sdk/core': 3.975.3 + '@aws-sdk/credential-provider-env': 3.972.59 + '@aws-sdk/credential-provider-http': 3.972.61 + '@aws-sdk/credential-provider-login': 3.972.66 + '@aws-sdk/credential-provider-process': 3.972.59 + '@aws-sdk/credential-provider-sso': 3.973.3 + '@aws-sdk/credential-provider-web-identity': 3.972.65 + '@aws-sdk/nested-clients': 3.997.33 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 + '@smithy/credential-provider-imds': 4.4.10 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-login@3.972.63': + '@aws-sdk/credential-provider-login@3.972.66': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/nested-clients': 3.997.31 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/nested-clients': 3.997.33 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.66': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.57 - '@aws-sdk/credential-provider-http': 3.972.59 - '@aws-sdk/credential-provider-ini': 3.973.1 - '@aws-sdk/credential-provider-process': 3.972.57 - '@aws-sdk/credential-provider-sso': 3.973.1 - '@aws-sdk/credential-provider-web-identity': 3.972.63 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 - '@smithy/credential-provider-imds': 4.4.8 + '@aws-sdk/credential-provider-node@3.972.70': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.59 + '@aws-sdk/credential-provider-http': 3.972.61 + '@aws-sdk/credential-provider-ini': 3.973.4 + '@aws-sdk/credential-provider-process': 3.972.59 + '@aws-sdk/credential-provider-sso': 3.973.3 + '@aws-sdk/credential-provider-web-identity': 3.972.65 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 + '@smithy/credential-provider-imds': 4.4.10 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.57': + '@aws-sdk/credential-provider-process@3.972.59': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.973.1': + '@aws-sdk/credential-provider-sso@3.973.3': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/nested-clients': 3.997.31 - '@aws-sdk/token-providers': 3.1083.0 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/nested-clients': 3.997.33 + '@aws-sdk/token-providers': 3.1088.0 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.972.63': + '@aws-sdk/credential-provider-web-identity@3.972.65': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/nested-clients': 3.997.31 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/nested-clients': 3.997.33 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.62': + '@aws-sdk/middleware-sdk-s3@3.972.64': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/signature-v4-multi-region': 3.996.39 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/signature-v4-multi-region': 3.996.41 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.997.31': + '@aws-sdk/nested-clients@3.997.33': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/signature-v4-multi-region': 3.996.39 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 - '@smithy/fetch-http-handler': 5.6.5 - '@smithy/node-http-handler': 4.9.5 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/signature-v4-multi-region': 3.996.41 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 + '@smithy/fetch-http-handler': 5.6.7 + '@smithy/node-http-handler': 4.9.7 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.39': + '@aws-sdk/signature-v4-multi-region@3.996.41': dependencies: - '@aws-sdk/types': 3.974.0 - '@smithy/signature-v4': 5.6.4 + '@aws-sdk/types': 3.974.2 + '@smithy/signature-v4': 5.6.6 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1083.0': + '@aws-sdk/token-providers@3.1088.0': dependencies: - '@aws-sdk/core': 3.975.1 - '@aws-sdk/nested-clients': 3.997.31 - '@aws-sdk/types': 3.974.0 - '@smithy/core': 3.29.3 + '@aws-sdk/core': 3.975.3 + '@aws-sdk/nested-clients': 3.997.33 + '@aws-sdk/types': 3.974.2 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/types@3.974.0': + '@aws-sdk/types@3.974.2': dependencies: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.34': + '@aws-sdk/xml-builder@3.972.36': dependencies: '@smithy/types': 4.16.1 tslib: 2.8.1 @@ -10204,10 +10128,10 @@ snapshots: '@colors/colors@1.6.0': {} - '@contentstack/cli-auth@2.0.0-beta.15(@types/node@22.20.1)': + '@contentstack/cli-auth@2.0.0-beta.16(@types/node@22.20.1)': dependencies: - '@contentstack/cli-command': 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-command': 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@22.20.1) '@oclif/core': 4.11.14 otplib: 12.0.1 transitivePeerDependencies: @@ -10225,9 +10149,9 @@ snapshots: - debug - supports-color - '@contentstack/cli-command@2.0.0-beta.9(@types/node@14.18.63)': + '@contentstack/cli-command@2.0.0-beta.10(@types/node@14.18.63)': dependencies: - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@14.18.63) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@14.18.63) '@oclif/core': 4.11.14 contentstack: 3.27.0 transitivePeerDependencies: @@ -10235,9 +10159,9 @@ snapshots: - debug - supports-color - '@contentstack/cli-command@2.0.0-beta.9(@types/node@14.18.63)(debug@4.4.3)': + '@contentstack/cli-command@2.0.0-beta.10(@types/node@14.18.63)(debug@4.4.3)': dependencies: - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@14.18.63)(debug@4.4.3) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': 4.11.14 contentstack: 3.27.0 transitivePeerDependencies: @@ -10245,9 +10169,9 @@ snapshots: - debug - supports-color - '@contentstack/cli-command@2.0.0-beta.9(@types/node@18.19.130)': + '@contentstack/cli-command@2.0.0-beta.10(@types/node@18.19.130)': dependencies: - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@18.19.130) '@oclif/core': 4.11.14 contentstack: 3.27.0 transitivePeerDependencies: @@ -10255,9 +10179,9 @@ snapshots: - debug - supports-color - '@contentstack/cli-command@2.0.0-beta.9(@types/node@20.19.43)': + '@contentstack/cli-command@2.0.0-beta.10(@types/node@20.19.43)': dependencies: - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@20.19.43) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@20.19.43) '@oclif/core': 4.11.14 contentstack: 3.27.0 transitivePeerDependencies: @@ -10265,9 +10189,9 @@ snapshots: - debug - supports-color - '@contentstack/cli-command@2.0.0-beta.9(@types/node@22.20.1)': + '@contentstack/cli-command@2.0.0-beta.10(@types/node@22.20.1)': dependencies: - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@22.20.1) '@oclif/core': 4.11.14 contentstack: 3.27.0 transitivePeerDependencies: @@ -10275,10 +10199,10 @@ snapshots: - debug - supports-color - '@contentstack/cli-config@2.0.0-beta.13(@types/node@18.19.130)': + '@contentstack/cli-config@2.0.0-beta.14(@types/node@18.19.130)': dependencies: - '@contentstack/cli-command': 2.0.0-beta.9(@types/node@18.19.130) - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-command': 2.0.0-beta.10(@types/node@18.19.130) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@18.19.130) '@contentstack/utils': 1.9.1 '@oclif/core': 4.11.14 transitivePeerDependencies: @@ -10286,10 +10210,10 @@ snapshots: - debug - supports-color - '@contentstack/cli-config@2.0.0-beta.13(@types/node@22.20.1)': + '@contentstack/cli-config@2.0.0-beta.14(@types/node@22.20.1)': dependencies: - '@contentstack/cli-command': 2.0.0-beta.9(@types/node@22.20.1) - '@contentstack/cli-utilities': 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-command': 2.0.0-beta.10(@types/node@22.20.1) + '@contentstack/cli-utilities': 2.0.0-beta.11(@types/node@22.20.1) '@contentstack/utils': 1.9.1 '@oclif/core': 4.11.14 transitivePeerDependencies: @@ -10390,7 +10314,7 @@ snapshots: - debug - supports-color - '@contentstack/cli-utilities@2.0.0-beta.10(@types/node@14.18.63)': + '@contentstack/cli-utilities@2.0.0-beta.11(@types/node@14.18.63)': dependencies: '@contentstack/management': 1.30.4(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.4(debug@4.4.3) @@ -10427,7 +10351,7 @@ snapshots: - debug - supports-color - '@contentstack/cli-utilities@2.0.0-beta.10(@types/node@14.18.63)(debug@4.4.3)': + '@contentstack/cli-utilities@2.0.0-beta.11(@types/node@14.18.63)(debug@4.4.3)': dependencies: '@contentstack/management': 1.30.4(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.4(debug@4.4.3) @@ -10464,7 +10388,7 @@ snapshots: - debug - supports-color - '@contentstack/cli-utilities@2.0.0-beta.10(@types/node@18.19.130)': + '@contentstack/cli-utilities@2.0.0-beta.11(@types/node@18.19.130)': dependencies: '@contentstack/management': 1.30.4(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.4(debug@4.4.3) @@ -10501,7 +10425,7 @@ snapshots: - debug - supports-color - '@contentstack/cli-utilities@2.0.0-beta.10(@types/node@20.19.43)': + '@contentstack/cli-utilities@2.0.0-beta.11(@types/node@20.19.43)': dependencies: '@contentstack/management': 1.30.4(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.4(debug@4.4.3) @@ -10538,7 +10462,7 @@ snapshots: - debug - supports-color - '@contentstack/cli-utilities@2.0.0-beta.10(@types/node@22.20.1)': + '@contentstack/cli-utilities@2.0.0-beta.11(@types/node@22.20.1)': dependencies: '@contentstack/management': 1.30.4(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.4(debug@4.4.3) @@ -10586,7 +10510,7 @@ snapshots: - debug - supports-color - '@contentstack/delivery-sdk@5.2.2': + '@contentstack/delivery-sdk@5.4.0': dependencies: '@contentstack/core': 1.4.1 '@contentstack/utils': 1.9.1 @@ -10637,7 +10561,7 @@ snapshots: '@contentstack/types-generator@3.10.2(graphql@16.14.2)': dependencies: - '@contentstack/delivery-sdk': 5.2.2 + '@contentstack/delivery-sdk': 5.4.0 '@gql2ts/from-schema': 2.0.0-4(graphql@16.14.2) async: 3.2.6 axios: 1.18.0 @@ -10724,7 +10648,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/types': 8.64.0 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 4.1.0 @@ -11717,7 +11641,7 @@ snapshots: '@jest/schemas@29.6.3': dependencies: - '@sinclair/typebox': 0.27.10 + '@sinclair/typebox': 0.27.12 '@jest/schemas@30.4.1': dependencies: @@ -12246,7 +12170,7 @@ snapshots: '@simple-libs/stream-utils@1.2.0': {} - '@sinclair/typebox@0.27.10': {} + '@sinclair/typebox@0.27.12': {} '@sinclair/typebox@0.34.52': {} @@ -12280,32 +12204,32 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@smithy/core@3.29.3': + '@smithy/core@3.29.5': dependencies: '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.4.8': + '@smithy/credential-provider-imds@4.4.10': dependencies: - '@smithy/core': 3.29.3 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.6.5': + '@smithy/fetch-http-handler@5.6.7': dependencies: - '@smithy/core': 3.29.3 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.9.5': + '@smithy/node-http-handler@4.9.7': dependencies: - '@smithy/core': 3.29.3 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 - '@smithy/signature-v4@5.6.4': + '@smithy/signature-v4@5.6.6': dependencies: - '@smithy/core': 3.29.3 + '@smithy/core': 3.29.5 '@smithy/types': 4.16.1 tslib: 2.8.1 @@ -12322,7 +12246,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@10.7.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@4.9.5) eslint: 10.7.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12334,7 +12258,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@10.7.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@5.9.3) eslint: 10.7.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12346,7 +12270,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@10.7.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@6.0.3) eslint: 10.7.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12359,7 +12283,7 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@10.7.0)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/types': 8.64.0 eslint: 10.7.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12651,10 +12575,10 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@10.7.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@10.7.0)(typescript@4.9.5) @@ -12670,10 +12594,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@10.7.0)(typescript@5.9.3) '@typescript-eslint/utils': 5.62.0(eslint@10.7.0)(typescript@5.9.3) @@ -12729,14 +12653,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/type-utils': 8.63.0(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/type-utils': 8.64.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.64.0 eslint: 10.7.0 ignore: 7.0.6 natural-compare: 1.4.0 @@ -12745,14 +12669,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/type-utils': 8.63.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/type-utils': 8.64.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.64.0 eslint: 10.7.0 ignore: 7.0.6 natural-compare: 1.4.0 @@ -12761,14 +12685,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/type-utils': 8.63.0(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/type-utils': 8.64.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.64.0 eslint: 10.7.0 ignore: 7.0.6 natural-compare: 1.4.0 @@ -12803,64 +12727,64 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5)': + '@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) eslint: 10.7.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3)': + '@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) eslint: 10.7.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) eslint: 10.7.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.63.0(typescript@4.9.5)': + '@typescript-eslint/project-service@8.64.0(typescript@4.9.5)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@4.9.5) - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@4.9.5) + '@typescript-eslint/types': 8.64.0 debug: 4.4.3(supports-color@8.1.1) typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.63.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.64.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3) - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.63.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.64.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@6.0.3) - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@6.0.3) + '@typescript-eslint/types': 8.64.0 debug: 4.4.3(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: @@ -12881,20 +12805,20 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.63.0': + '@typescript-eslint/scope-manager@8.64.0': dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 - '@typescript-eslint/tsconfig-utils@8.63.0(typescript@4.9.5)': + '@typescript-eslint/tsconfig-utils@8.64.0(typescript@4.9.5)': dependencies: typescript: 4.9.5 - '@typescript-eslint/tsconfig-utils@8.63.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.64.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.63.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.64.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 @@ -12946,11 +12870,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.63.0(eslint@10.7.0)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.64.0(eslint@10.7.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@4.9.5) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@4.9.5) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@4.9.5) debug: 4.4.3(supports-color@8.1.1) eslint: 10.7.0 ts-api-utils: 2.5.0(typescript@4.9.5) @@ -12958,11 +12882,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.63.0(eslint@10.7.0)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.64.0(eslint@10.7.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 10.7.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -12970,11 +12894,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.63.0(eslint@10.7.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.64.0(eslint@10.7.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) eslint: 10.7.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -12988,7 +12912,7 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.63.0': {} + '@typescript-eslint/types@8.64.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: @@ -13078,12 +13002,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.63.0(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.64.0(typescript@4.9.5)': dependencies: - '@typescript-eslint/project-service': 8.63.0(typescript@4.9.5) - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@4.9.5) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/project-service': 8.64.0(typescript@4.9.5) + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@4.9.5) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.5 @@ -13093,12 +13017,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.63.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.64.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.63.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/project-service': 8.64.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.5 @@ -13108,12 +13032,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.63.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.64.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.63.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@6.0.3) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/project-service': 8.64.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@6.0.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.5 @@ -13203,34 +13127,34 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.63.0(eslint@10.7.0)(typescript@4.9.5)': + '@typescript-eslint/utils@8.64.0(eslint@10.7.0)(typescript@4.9.5)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@4.9.5) eslint: 10.7.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.63.0(eslint@10.7.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.64.0(eslint@10.7.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) eslint: 10.7.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.63.0(eslint@10.7.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.64.0(eslint@10.7.0)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) eslint: 10.7.0 typescript: 6.0.3 transitivePeerDependencies: @@ -13251,9 +13175,9 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.63.0': + '@typescript-eslint/visitor-keys@8.64.0': dependencies: - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/types': 8.64.0 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.3': {} @@ -13337,13 +13261,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.4(@types/node@20.19.43)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@20.19.43)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.4(@types/node@20.19.43)(yaml@2.9.0) + vite: 8.1.5(@types/node@20.19.43)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -13454,10 +13378,6 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.3.0: - dependencies: - environment: 1.1.0 - ansi-regex@2.1.1: {} ansi-regex@3.0.1: {} @@ -13824,8 +13744,8 @@ snapshots: browserslist@4.28.6: dependencies: baseline-browser-mapping: 2.10.43 - caniuse-lite: 1.0.30001805 - electron-to-chromium: 1.5.389 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.393 node-releases: 2.0.51 update-browserslist-db: 1.2.3(browserslist@4.28.6) @@ -13910,7 +13830,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001805: {} + caniuse-lite@1.0.30001806: {} capital-case@1.0.4: dependencies: @@ -14029,10 +13949,6 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - cli-progress@3.12.0: dependencies: string-width: 4.2.3 @@ -14054,11 +13970,6 @@ snapshots: slice-ansi: 0.0.4 string-width: 1.0.2 - cli-truncate@5.2.0: - dependencies: - slice-ansi: 8.0.0 - string-width: 8.2.2 - cli-width@2.2.1: {} cli-width@3.0.0: {} @@ -14583,14 +14494,12 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.389: {} + electron-to-chromium@1.5.393: {} elegant-spinner@1.0.1: {} emittery@0.13.1: {} - emoji-regex@10.6.0: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -14603,7 +14512,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.24.2: + enhanced-resolve@5.24.3: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -14614,8 +14523,6 @@ snapshots: env-paths@2.2.1: {} - environment@1.1.0: {} - error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -14739,7 +14646,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@10.7.0)(typescript@5.9.3) eslint-config-xo-space: 0.35.0(eslint@10.7.0) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) eslint-plugin-mocha: 10.5.0(eslint@10.7.0) eslint-plugin-n: 15.7.0(eslint@10.7.0) eslint-plugin-perfectionist: 2.11.0(eslint@10.7.0)(typescript@5.9.3) @@ -14775,24 +14682,24 @@ snapshots: - typescript - vue-eslint-parser - eslint-config-oclif@6.0.176(eslint@10.7.0)(typescript@4.9.5): + eslint-config-oclif@6.0.177(eslint@10.7.0)(typescript@4.9.5): dependencies: '@eslint/compat': 1.4.1(eslint@10.7.0) '@eslint/eslintrc': 3.3.6 '@eslint/js': 9.39.5 '@stylistic/eslint-plugin': 3.1.0(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@4.9.5) eslint-config-xo: 0.49.0(eslint@10.7.0) eslint-config-xo-space: 0.35.0(eslint@10.7.0) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) eslint-plugin-jsdoc: 50.8.0(eslint@10.7.0) eslint-plugin-mocha: 10.5.0(eslint@10.7.0) eslint-plugin-n: 17.24.0(eslint@10.7.0)(typescript@4.9.5) eslint-plugin-perfectionist: 4.15.1(eslint@10.7.0)(typescript@4.9.5) eslint-plugin-unicorn: 56.0.1(eslint@10.7.0) - typescript-eslint: 8.63.0(eslint@10.7.0)(typescript@4.9.5) + typescript-eslint: 8.64.0(eslint@10.7.0)(typescript@4.9.5) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -14800,24 +14707,24 @@ snapshots: - supports-color - typescript - eslint-config-oclif@6.0.176(eslint@10.7.0)(typescript@5.9.3): + eslint-config-oclif@6.0.177(eslint@10.7.0)(typescript@5.9.3): dependencies: '@eslint/compat': 1.4.1(eslint@10.7.0) '@eslint/eslintrc': 3.3.6 '@eslint/js': 9.39.5 '@stylistic/eslint-plugin': 3.1.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@5.9.3) eslint-config-xo: 0.49.0(eslint@10.7.0) eslint-config-xo-space: 0.35.0(eslint@10.7.0) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) eslint-plugin-jsdoc: 50.8.0(eslint@10.7.0) eslint-plugin-mocha: 10.5.0(eslint@10.7.0) eslint-plugin-n: 17.24.0(eslint@10.7.0)(typescript@5.9.3) eslint-plugin-perfectionist: 4.15.1(eslint@10.7.0)(typescript@5.9.3) eslint-plugin-unicorn: 56.0.1(eslint@10.7.0) - typescript-eslint: 8.63.0(eslint@10.7.0)(typescript@5.9.3) + typescript-eslint: 8.64.0(eslint@10.7.0)(typescript@5.9.3) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -14825,24 +14732,24 @@ snapshots: - supports-color - typescript - eslint-config-oclif@6.0.176(eslint@10.7.0)(typescript@6.0.3): + eslint-config-oclif@6.0.177(eslint@10.7.0)(typescript@6.0.3): dependencies: '@eslint/compat': 1.4.1(eslint@10.7.0) '@eslint/eslintrc': 3.3.6 '@eslint/js': 9.39.5 '@stylistic/eslint-plugin': 3.1.0(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@6.0.3) eslint-config-xo: 0.49.0(eslint@10.7.0) eslint-config-xo-space: 0.35.0(eslint@10.7.0) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) eslint-plugin-jsdoc: 50.8.0(eslint@10.7.0) eslint-plugin-mocha: 10.5.0(eslint@10.7.0) eslint-plugin-n: 17.24.0(eslint@10.7.0)(typescript@6.0.3) eslint-plugin-perfectionist: 4.15.1(eslint@10.7.0)(typescript@6.0.3) eslint-plugin-unicorn: 56.0.1(eslint@10.7.0) - typescript-eslint: 8.63.0(eslint@10.7.0)(typescript@6.0.3) + typescript-eslint: 8.64.0(eslint@10.7.0)(typescript@6.0.3) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -14892,7 +14799,7 @@ snapshots: tinyglobby: 0.2.17 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) transitivePeerDependencies: - supports-color @@ -14907,33 +14814,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@4.9.5) eslint: 10.7.0 eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@5.9.3) eslint: 10.7.0 eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@6.0.3) eslint: 10.7.0 eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.7.0) @@ -14982,7 +14889,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14993,7 +14900,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.7.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -15005,13 +14912,13 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@4.9.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15022,7 +14929,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.7.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -15034,13 +14941,13 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15051,7 +14958,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.7.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.7.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -15063,7 +14970,7 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -15107,7 +15014,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@10.7.0)(typescript@4.9.5): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - enhanced-resolve: 5.24.2 + enhanced-resolve: 5.24.3 eslint: 10.7.0 eslint-plugin-es-x: 7.8.0(eslint@10.7.0) get-tsconfig: 4.14.0 @@ -15122,7 +15029,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@10.7.0)(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - enhanced-resolve: 5.24.2 + enhanced-resolve: 5.24.3 eslint: 10.7.0 eslint-plugin-es-x: 7.8.0(eslint@10.7.0) get-tsconfig: 4.14.0 @@ -15137,7 +15044,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@10.7.0)(typescript@6.0.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - enhanced-resolve: 5.24.2 + enhanced-resolve: 5.24.3 eslint: 10.7.0 eslint-plugin-es-x: 7.8.0(eslint@10.7.0) get-tsconfig: 4.14.0 @@ -15171,8 +15078,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@10.7.0)(typescript@4.9.5): dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@4.9.5) eslint: 10.7.0 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -15181,8 +15088,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@10.7.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@5.9.3) eslint: 10.7.0 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -15191,8 +15098,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@10.7.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@6.0.3) eslint: 10.7.0 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -15374,8 +15281,6 @@ snapshots: etag@1.8.1: {} - eventemitter3@5.0.4: {} - execa@1.0.0: dependencies: cross-spawn: 6.0.6 @@ -15702,8 +15607,6 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.6.0: {} - get-func-name@2.0.2: {} get-intrinsic@1.3.0: @@ -16234,10 +16137,6 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.6.0 - is-generator-fn@2.1.0: {} is-generator-function@1.1.2: @@ -17317,7 +17216,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.21.0 + ws: 8.21.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -17395,54 +17294,54 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 lilconfig@3.1.3: {} @@ -17452,9 +17351,8 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@17.0.8: + lint-staged@17.1.0: dependencies: - listr2: 10.2.2 picomatch: 4.0.5 string-argv: 0.3.2 tinyexec: 1.2.4 @@ -17482,14 +17380,6 @@ snapshots: date-fns: 1.30.1 figures: 2.0.0 - listr2@10.2.2: - dependencies: - cli-truncate: 5.2.0 - eventemitter3: 5.0.4 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 10.0.0 - listr@0.14.3: dependencies: '@samverschueren/stream-to-observable': 0.3.1(rxjs@6.6.7) @@ -17579,14 +17469,6 @@ snapshots: cli-cursor: 2.1.0 wrap-ansi: 3.0.1 - log-update@6.1.0: - dependencies: - ansi-escapes: 7.3.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - logform@2.7.0: dependencies: '@colors/colors': 1.6.0 @@ -17695,8 +17577,6 @@ snapshots: mimic-fn@3.1.0: {} - mimic-function@5.0.1: {} - mimic-response@3.1.0: {} mimic-response@4.0.0: {} @@ -18012,12 +17892,12 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - obug@2.1.3: {} + obug@2.1.4: {} oclif@4.23.27(@types/node@14.18.63): dependencies: - '@aws-sdk/client-cloudfront': 3.1085.0 - '@aws-sdk/client-s3': 3.1085.0 + '@aws-sdk/client-cloudfront': 3.1090.0 + '@aws-sdk/client-s3': 3.1090.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 @@ -18045,8 +17925,8 @@ snapshots: oclif@4.23.27(@types/node@18.19.130): dependencies: - '@aws-sdk/client-cloudfront': 3.1085.0 - '@aws-sdk/client-s3': 3.1085.0 + '@aws-sdk/client-cloudfront': 3.1090.0 + '@aws-sdk/client-s3': 3.1090.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 @@ -18074,8 +17954,8 @@ snapshots: oclif@4.23.27(@types/node@20.19.43): dependencies: - '@aws-sdk/client-cloudfront': 3.1085.0 - '@aws-sdk/client-s3': 3.1085.0 + '@aws-sdk/client-cloudfront': 3.1090.0 + '@aws-sdk/client-s3': 3.1090.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 @@ -18103,8 +17983,8 @@ snapshots: oclif@4.23.27(@types/node@22.20.1): dependencies: - '@aws-sdk/client-cloudfront': 3.1085.0 - '@aws-sdk/client-s3': 3.1085.0 + '@aws-sdk/client-cloudfront': 3.1090.0 + '@aws-sdk/client-s3': 3.1090.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 @@ -18154,10 +18034,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -18357,7 +18233,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.18: + postcss@8.5.20: dependencies: nanoid: 3.3.16 picocolors: 1.1.1 @@ -18721,11 +18597,6 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - retry@0.13.1: {} reusify@1.1.0: {} @@ -18740,8 +18611,6 @@ snapshots: - jiti - supports-color - rfdc@1.4.1: {} - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -19062,16 +18931,6 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - slice-ansi@7.1.2: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - slice-ansi@8.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.3 @@ -19216,17 +19075,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 - strip-ansi: 7.2.0 - - string-width@8.2.2: - dependencies: - get-east-asian-width: 1.6.0 - strip-ansi: 7.2.0 - string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 @@ -19803,34 +19651,34 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.63.0(eslint@10.7.0)(typescript@4.9.5): + typescript-eslint@8.64.0(eslint@10.7.0)(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@4.9.5) - '@typescript-eslint/typescript-estree': 8.63.0(typescript@4.9.5) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@4.9.5))(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.64.0(typescript@4.9.5) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@4.9.5) eslint: 10.7.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - typescript-eslint@8.63.0(eslint@10.7.0)(typescript@5.9.3): + typescript-eslint@8.64.0(eslint@10.7.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@5.9.3) eslint: 10.7.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript-eslint@8.63.0(eslint@10.7.0)(typescript@6.0.3): + typescript-eslint@8.64.0(eslint@10.7.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.63.0(eslint@10.7.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.63.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.64.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0)(typescript@6.0.3) eslint: 10.7.0 typescript: 6.0.3 transitivePeerDependencies: @@ -19974,11 +19822,11 @@ snapshots: vary@1.1.2: {} - vite@8.1.4(@types/node@20.19.43)(yaml@2.9.0): + vite@8.1.5(@types/node@20.19.43)(yaml@2.9.0): dependencies: - lightningcss: 1.32.0 + lightningcss: 1.33.0 picomatch: 4.0.5 - postcss: 8.5.18 + postcss: 8.5.20 rolldown: 1.1.5 tinyglobby: 0.2.17 optionalDependencies: @@ -19986,10 +19834,10 @@ snapshots: fsevents: 2.3.3 yaml: 2.9.0 - vitest@4.1.10(@types/node@20.19.43)(jsdom@23.2.0)(vite@8.1.4(@types/node@20.19.43)(yaml@2.9.0)): + vitest@4.1.10(@types/node@20.19.43)(jsdom@23.2.0)(vite@8.1.5(@types/node@20.19.43)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.4(@types/node@20.19.43)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@20.19.43)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -19998,7 +19846,7 @@ snapshots: es-module-lexer: 2.3.1 expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.3 + obug: 2.1.4 pathe: 2.0.3 picomatch: 4.0.5 std-env: 4.2.0 @@ -20006,7 +19854,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.4(@types/node@20.19.43)(yaml@2.9.0) + vite: 8.1.5(@types/node@20.19.43)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.43 @@ -20154,12 +20002,6 @@ snapshots: workerpool@9.3.4: {} - wrap-ansi@10.0.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 8.2.2 - strip-ansi: 7.2.0 - wrap-ansi@3.0.1: dependencies: string-width: 2.1.1 @@ -20183,12 +20025,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.2.0 - wrappy@1.0.2: {} write-file-atomic@3.0.3: @@ -20208,7 +20044,7 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.21.0: {} + ws@8.21.1: {} xdg-basedir@4.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a3af7db16..10708a325 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,4 +7,4 @@ overrides: lodash: 4.18.1 brace-expansion: 5.0.7 js-yaml: 4.3.0 - + fast-uri: 3.1.3